/**********************************************************************/
data _null_;
infile mytext;
file outfile;
run;
/**********************************************************************/
data _null_;
infile 'draft.text';
file 'just.heads';
input line $char80.;
put line $char80.;
run;
/**********************************************************************/
line="The quick red fox jumped over the lazy brown dog.";
word3=scan(line,3);
/**********************************************************************/
data _null_;
infile 'draft.text';
file 'just.heads';
input line $char80.;
if scan(line,1,' ') eq '.head' then
put line $char80.;
run;
/**********************************************************************/
data _null_;
infile flist length=ileg;
file nosignal;
input line $char80.;
if ileg gt 0 and substr(line,3,1) ne '*'
then put line $char80.;
run;
/**********************************************************************/
data _null_;
infile 'draft.text';
file 'code.examples';
input line $char80.;
first=scan(line,1,' ');
/* Check for 'begin' signal */
if first='.bgc' then
do;
put line $char80.;
/* Check for 'end' signal */
do until scan(line,1,' ')='.enc';
input line $char80.;
put line $char80.;
end;
end;
else delete;
run;
/**********************************************************************/
data _null_;
infile 'draft.text' length=lvbl;
file 'just.heads';
input line $varying80. lvbl;
put line $varying80. lvbl;
run;
/**********************************************************************/
/* Begin macro definition. */
%macro heads(inf=,outf=);
data _null_;
infile "&inf" length=lvbl;
file "&outf";
input line $varying80. lvbl;
put line $varying80. lvbl;
run;
/* End macro definition. */
%mend heads;
/* Invoke the macro with parameters. */
%heads(inf=draft.text,outf=just.heads)
/**********************************************************************/
/* Begin macro definition. */
%macro cwind(listfile=,outfile=);
/* Read a file of filenames, and assign */
/* each to a numbered macro variable. */
data _null_;
infile "&listfile" length=ileg end=last;
input x $varying80. ileg;
call symput('fn'||left(put(_n_,3.)),x);
if last then
call symput('num',left(put(_n_,3.)));
run;
/* Use the number of files to control */
/* the number of iterations */
%do index=1 %to #
data _null_;
file "&outfile" mod;
infile "&&fn&index" length=ileg;
input line $varying80. ileg;
if scan(line,1,' ')='\bslash h8d' then
do;
input line $varying80. ileg;
put line $varying80. ileg;
end;
else delete;
run;
%end;
/* End macro definition. */
%mend cwind;
/* Invoke the macro with parameters. */
%cwind(listfile=~/text/files,outfile=~/text/wind.list)
/**********************************************************************/
%macro splits(head=,firsth=,lasth=,inf=,outfix=);
filename inf "&inf";
%let outfindx=0;
%let its=%eval(1+(&lasth-&firsth));
/* Continue as long as the number of this */
/* iteration is less than the number of the last */
/* signal minus the number of the first signal. */
%do %while (&outfindx<&its);
/* Creates a series of numbered output files */
filename outf "&outfix&outfindx";
data _null_;
infile inf length=ileg;
file outf;
/* FLAG and COUNT keep track of the signal */
/* relative to the first and last occurrence */
/* you want to copy to another file. */
retain flag count 0;
input x $varying80. ileg;
z=substr(x,1,4);
/* FLAG=1 causes all nonheaders to go to file.*/
if flag=1 then do;
if z ne "&head" then
put x $varying80. ileg;
else stop;
end;
else do;
/* Count the signals until you reach the */
/* first one you want, then turn on FLAG. */
if z="&head" then do;
count=count+1;
if count=&firsth then do;
flag=1;
put x $varying80. ileg;
end;
end;
end;
run;
/* Increment both the outfile index and the */
/* first signal to write to file. */
%let outfindx=%eval(&outfindx+1);
%let firsth=%eval(&firsth+1);
%end;
%mend splits;
/* Invoke the macro with parameters as an example. */
%splits(head=.h2,firsth=4,lasth=15,inf=~/text/chap2,
outfix=~/text/syntax)
/**********************************************************************/
%macro specs(head=,phstart=,inf=,inmemfx=,
outfx=,outmemfx=,nummems=);
filename inf "&inf";
filename outf "&outfx";
%let outfindx=1;
/* Execute once for each member in a PDS. */
%do %while (&outfindx le &nummems);
data _null_;
/* Increment input and output suffix */
/* numbers so each iteration reads from */
/* and writes to a separate member. */
infile inf(&inmemfx&outfindx);
file outf(&outmemfx&outfindx);
retain hflag keysflag 0;
attrib test testph length=$20;
input x $80.;
level=substr(x,1,3);
/* Flag testing goes in reverse order - */
/* the first check: if all flags are correct, */
/* write to file or stop. */
if keysflag=1 then do;
if level ne "&head" then put x $80.;
else stop;
end;
else do;
/* If heading correct, check for */
/* starting signal. */
if hflag=1 then do;
test=upcase(scan(x,2));
if test="%upcase(&phstart)" then do;
keysflag=1;
hflag=0;
put x $80.;
end;
else hflag=0;
end;
/* If heading prefix correct, */
/* check for right level. */
if level="&head" and keysflag=0 then do;
legx=length(x);
if legx le 3 then hflag=1;
else do;
test=scan(x,2);
if test="%upcase(&phstart)" then do;
keysflag=1;
put x $80.;
end;
end;
end;
end;
run;
/* Increment the index. */
%let outfindx=%eval(&outfindx+1);
%end;
%mend specs;
/* Invoke the macro with parameters. */
%specs(head=\bslash h2,phstart=specifications,inf=pub.sg606.procs,
inmemfx=chap,outfx=saslpo.sg606.procs,outmemfx=chap,
nummems=43)
/**********************************************************************/
%macro outline(infilx=,outfilx=);
/* Infile and outfile come in as parameters. */
filename inf "&infilx";
filename outf "&outfilx";
data _null_;
/* Accommodate variable length records */
/* with LENGTH= option. */
infile inf length=ileg;
file outf;
/* Set flags to zero to start out. */
retain znum flag 0;
input x $varying80. ileg;
/* Variable z contains the first three */
/* characters of each line that you check as */
/* a potential header signal. */
z=substr(x,1,3);
/* If variable z is a header signal, variable */
/* zcheck contains the header level. */
zcheck=substr(z,1,2);
/* Flag testing goes in reverse order. */
/* FLAG is 1 if header is valid, so check for */
/* level and write to file. */
if flag=1 then do;
select(znum);
when(1) put 'H1 ' x $varying80. ileg;
when(2) put 'H2 ' x $varying80. ileg;
when(3) put 'H3 ' x $varying80. ileg;
otherwise put '*****New Head, SURPRISE*****';
end;
flag=0;
end;
else do;
/* Check for correct header signal, */
/* discarding false signals. */
if zcheck='\h' and z ne '\he' and z ne '\hr'
then do;
znum=input(substr(z,3,1),1.);
/* Check for trailing data on potential */
/* signal. Turn flag on if none. */
if index(x,' ')> ileg then flag=1;
else do;
/* Count back from blank to find level */
/* on signal with trailing data, */
/* extract level, and write to file. */
blank=index(x,' ');
x=substr(x,blank,(ileg-blank));
select(znum);
when(1) put 'H1 ' x $varying80. ileg;
when(2) put 'H2 ' x $varying80. ileg;
when(3) put 'H3 ' x $varying80. ileg;
otherwise put '****New Head, SURPRISE****';
end;
end;
end;
end;
run;
%mend outline;
/**********************************************************************/