|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 66048 (0x10200) Types: TextFile Notes: RCSL-52-AA-1036 Names: »rofftxt«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system └─⟦72244f0ef⟧ └─⟦this⟧ »rofftxt«
job j 1 time 11 0 perm disc1 1000 10 roff=set 1 disc1 scope user roff roff=algol begin \f <*************************************************************** * * R O F F T E X T F O R M A T T E R * * The ROFF text formatter is capable of rearranging a source * text for e.g. a manual into lines of equal length with a * straight right margin, breaking the text into pages, numbering * the pages and chapters automatically etc. * * Tutorial guide (danish): RCSL no. 52-AA 1053 * * ROFF was programmed in feb. 1981 by ERK and STB * * Maintenance feb. 1981 - xx by STB * *************************************************************** \f *************************************************************** * * revision record: * * rev.no. installation init description * * 1.0 10.03.1981 STB first release * 2.0 xx.05.1981 STB automatic index generation * registers * various corrections * new commands: * jo, bl, ix, xs, xc, rc, ar, fv * ve, cl, bc * new tutorial guide (replaces RCSL 52-AA1036 * * **************************************************************> \f <********* external procedures ***************** læs_fp_boo, læs_fp_tal, text_close, text_open *> \f integer procedure enterpage(ix); integer ix; <* also result param *> begin integer i,ci,last_partition_possibility,last_partition_ix,last_index_mark; last_partition_possibility:=0; last_partition_ix:=0; last_index_mark:=0; ci:=page(li,-1) extract 8; if ci<>(page(li,-2) extract 8) then begin ci:=ci+1; page(li,ci):="sp"; if join then begin <* join this line to the previous without space *> ci:=ci-1; end join; end; join:=false; i:=ix; wordstart(noofwords+1):=ci+1; while kind(i)=chartype and ci<=ll do begin if val(i)=hyphenation_char then begin if ci<ll then begin last_partition_possibility:=ci+1; last_partition_ix:=i; end; end else if val(i)=index_char then last_index_mark:=i-1 else begin if (val(i)='-') and (ci<ll) then begin last_partition_possibility:=ci+1; last_partition_ix:=i; end; ci:=ci+1; page(li,ci):=false add (val(i) add (charmode shift 8)); end; i:=i+1; end; if ci>ll then begin <* word exceeds line boundary *> page(li,ci):="sp"; if last_partition_possibility>wordstart(no_of_words+1) then begin <* insert hyphenation and part the word *> page(li,last_partition_possibility):="-"; enterpage:=0; ix:=last_partition_ix+1; if val(ix)='-' then ix:=ix+1; if indexon then begin if last_index_mark>0 then divert_to_index_file( last_index_mark); end; noofwords:=noofwords+1; page(li,-1):=false add last_partition_possibility; bossline(li):=bosslineno; end else <* no possibility for partition *> enterpage:=1; end else begin enterpage:=0; ix:=i; <* next free input char *> if indexon then begin if last_index_mark>0 then divert_to_index_file( last_index_mark); end; page(li,-1):=false add ci; <* last used position in line *> bossline(li):=bosslineno; noofwords:=noofwords+1; end; end enterpage; \f procedure changeline(nobreak,no); value nobreak,no; boolean nobreak; integer no; begin integer i,x,y; boolean no_change,empty_line; no:=spacing*no; join:=false; no_change:=false; if -,nobreak and bosslinemode then begin bossline(li):=bosslineno; end bosslinemode; if no<=0 then begin if (page(li,-2) extract 8)=(page(li,-1) extract 8) then begin no_change:=true; end else no:=1; end; if auto_page_shift then begin <* the page has been flipped automatically, hence we will not start the new page with empty lines *> if (page(li,-2) extract 8)=(page(li,-1) extract 8) then empty_line:=true else begin <* check if the line is all spaces *> x:=(page(li,-2) extract 8) + 1; y:= page(li,-1) extract 8; empty_line:=true; while (x<=y) and empty_line do begin if (page(li,x) extract 8) <> 'sp' then empty_line:=false; x:=x+1; end; end check for spaces; if empty_line then no_change:=true else auto_page_shift:=false; end autopageshift; if no_change then begin <* don't change the line *> page(li,-2):=page(li,-1):=false add indents; cleartemps; no_of_words:=0; if special>3 or charmode=0 then special:=0; end nochange else begin <* now change the line *> if (noofwords>1) and rightjust and nobreak then rightjustify(li,noofwords); if frame then begin <* make vertical lines *> for i:=first_frame_pos step 1 until last_frame_pos do if frame_pos(i) then begin if (page(li,i) extract 8 = 'sp' ) or (page(li,i) extract 8 =spch) then page(li,i):="!" else errmess(<:frame overwrites char:>,pi,li); end; if first_frame_pos-1<page(li,-2) extract 8 then page(li,-2):=false add (first_frame_pos-1); if last_frame_pos>page(li,-1) extract 8 then page(li,-1):= false add last_frame_pos; end; noofwords:=0; if ((pl-(tm+bm))-(li+no))>=0 then begin page(li,0):=false add ((no shift 4) add special); li:=li+no; end else begin page(li,0):=false add ((spacing shift 4) add special); li:=li+spacing; page(li,-3):=correction_line; outputpage(1); autopageshift:=true; end; if frame then for i:=1 step 1 until last_frame_pos do page(li,i):="sp"; page(li,-2):=page(li,-1):=false add indents; page(li,-3):=correction_line; cleartemps; if special>3 or charmode=0 then special:=0; end change; end changeline; \f procedure outputpage(no); value no; integer no; begin integer i,j,x,y,ch,centerspaces; if (li=1) and (page(li,-2)==page(li,-1)) then <* do nothing, page already flipped *> else begin if (pi>=first_page) and (pi<=last_page) then begin <* write *> outputtoppage; i:=1; while i<li do begin if lineno then write(zout,<<dddd>,i); x:=page(i,-2) extract 8; y:=page(i,-1) extract 8; special:=page(i,0) extract 4; if po>=2 and page(i,-3) then <* make a correction line *> write(zout,"sp",po-2,"!",1,"sp",x+1) else if (x<y) or bosslinemode then write(zout,"sp",po+x); if special<>0 then begin case special of begin begin <* underline word(s) *> for j:=x+1 step 1 until y do if ((page(i,j) shift (-8)) extract 4)=1 then outchar(zout,95) else outchar(zout,'sp'); outchar(zout,carriage extract 8); if lineno then write(zout,"sp",4); write(zout,"sp",po+x); end; begin <* overprint word(s) *> end; begin <* overprint and underline word(s) *> end; begin <* center line *> centerspaces:=(ll-(indents+(y-x)))//2; write(zout,"sp",centerspaces); end; end case; end; for j:=x+1 step 1 until y do begin ch:=page(i,j) extract 8; if ch=spch then ch:='sp'; outchar(zout,ch); end; if bosslinemode then begin <* write the corresponding bosslineno. *> write(zout,"sp",stdll+10-j-(if special=4 then centerspaces else 0), bossline(i)); end bosslinemode; x:=(page (i,0) shift (-4)) extract 8; write(zout,carriage,1,"nl",1); if (x>1) and (lineno or bosslinemode _ or page(i,-3) <* correction line *>) then begin for j:=i+1 step 1 until i+x-1 do begin <* write linenos or bosslines *> if lineno then write(zout,<<dddd>,j); if page(i,-3) then write(zout,"sp",po-2,<:! :>) else write(zout,"sp",po); if bosslinemode then write(zout,"sp",stdll+9, bossline(i)); outchar(zout,'nl'); end end else write(zout,"nl",x-1); i:=i+x; end i loop; outputbottompage; end write; pi:=pi+1; end flip one page; for i:=2 step 1 until no do begin if (pi>=first_page) and (pi<=last_page) then begin outchar(zout,form_f extract 8); if lineno then write(zout,<<dddd>,pi); outputtoppage; outputbottompage; end; pi:=pi+1; end; li:=1; page(li,-2):=page(li,-1):=false add indents; page(li,-3):=correction_line; first_index_on_page:=true; end outputpage; \f procedure outputtoppage; begin integer i; if header then begin i:=head(1,0) extract 8; if i<>0 then writeno(pi,head,i,1,pnof); outchar(zout,'nl'); if lineno then write(zout,"sp",4); write(zout,"sp",po); for i:=1 step 1 until stdll do outchar(zout,head(1,i) extract 8); write(zout,"nl",tm+1); end else write(zout,"nl",tm); end otp; \f procedure outputbottompage; begin integer i; if footer then begin i:=foot(1,0) extract 8; if i<>0 then writeno(pi,foot,i,1,pnof); write(zout,"nl",(pl-(tm-1))-li,"sp",po); if lineno then write(zout,"sp",4); for i:=1 step 1 until stdll do outchar(zout,foot(1,i) extract 8); end; write(zout,"nl",1,form_f,1); end obp; \f procedure writecontents(lindex,no,etx,pindex,level,start_app); value lindex,no,etx,pindex,level,start_app; integer lindex,no,etx,pindex,level; boolean start_app; begin boolean array pageno(1:1,1:pnof); integer i,ix,lix,inden; lix:=if level=1 then 2 else 1; if ((contli+lix>pl) and level>1) or ((contli+lix+3)>pl and level=1) _ or (contli+lix+5>pl and start_app) then begin contpi:=contpi+1; outchar(contents,form_f extract 8); write(contents,"nl",1,"sp",(stdll//2)+po); write(contents, (case contpi of _ (<:i:>,<:ii:>,<:iii:>,<:iv:>,<:v:>, _ <:vi:>,<:vii:>,<:viii:>,<:ix:>,<:x:>)),"nl",2); if english then write(contents,"sp",po,<:CONTENTS:>,"sp",stdll-8,<:PAGE:>, _ carriage,1, "sp",po, false add 95,stdll+4, "nl",2) else write(contents,"sp",po,<:INDHOLD:>,"sp",stdll-7,<:SIDE:>, _ carriage,1, "sp",po, false add 95,stdll+4, "nl",2); contli:=4; end else begin contli:=contli+lix; write(contents,"nl",lix); end; if start_app then begin <* start appendix section *> if english then write(contents,"sp",po,<:Appendices::>,carriage,1, _ "sp",po,false add 95,11,"nl",2) else write(contents,"sp",po,<:Bilag::>,carriage,1, _ "sp",po,false add 95,6); end appendix else begin <* normal contents line *> ix:=1; writeno(pindex,pageno,ix,1,pnof); inden:= case level of (0,4,9,16); write(contents,"sp",inden+po); for i:=1 step 1 until no do outchar(contents,page(lindex,i) extract 8); outchar(contents,'sp'); if (aix(1)//10) + (aix(2)//10) + (aix(3)//10) + (aix(4)//10) = 0 then outchar(contents,'sp') else inden:=inden-1; for i:=stdindent+1 step 1 until etx do outchar(contents,page(lindex,i) extract 8); write(contents,"sp",1,".",stdll-((etx-stdindent+1)+no+inden)-1); for i:=1 step 1 until pnof do outchar(contents,pageno(1,i) extract 8); end normal contents line; end writec; \f procedure pushindent(no); value no; integer no; begin integer x; while instack(0)<>0 do popindent; <* empty stack *> x:=instack(0)+1; if x>10 then errmess(<:indent level exceeds 10:>,pi,li) else begin instack(x):=indents; indents:=indents+no; instack(0):=x; end; end pi; \f procedure popindent; begin integer x; x:=instack(0); if x>0 then begin indents:=instack(x); instack(0):=x-1; end; end popi; \f procedure settempindent(no); value no; integer no; begin tempindent:=no; indents:=indents+tempindent; end sti; \f procedure moveuntouched(ix); value ix; integer ix; begin integer ci,start,char; ci:=page(li,-1) extract 8; start:=ci+1; while kind(ix)<>8 and ci<=stdll+7 do begin ci:=ci+1; if kind(ix)=tabtype then begin page(li,-1):=false add (ci-1); testout(<:moveunt., bef. tab, p(-1)=:>,page(li,-1) extract 8); tabulate(ix); ci:=(page(li,-1) extract 8) ; end else begin if val(ix)=indexchar then begin ci:=ci-1; if indexon then divert_to_index_file(ix-1); end index char else if val(ix)=hyphenation_char then ci:=ci-1 else page(li,ci):=false add (val(ix) add _ (if val(ix)='sp' then 0 else (charmode shift 8))); ix:=ix+1; end; end; if val(ix)='em' then inputend:=true; if ci>stdll+7 then errmess(<:no fill line exceeds page boundary:>,pi,li); page(li,-1):=false add ci; end moveuntouched; \f integer procedure readoneparam(ix); integer ix; begin integer sign,p1; sign:=1; p1:=0; while kind(ix)=sptype do ix:=ix+1; if (val(ix)='+' or val(ix)='-' ) and (kind(ix)<>8) then begin sign:=if val(ix)='+' then 1 else -1; ix:=ix+1; end; while val(ix)<='9' and val(ix)>='0' and kind(ix)<>8 do begin p1:=p1*10+(val(ix)-'0'); ix:=ix+1; end; p1:=p1*sign; readoneparam:=p1; testout(<:read one param:>,p1); end rop; \f integer procedure read_param_char(ix); integer ix; <* is updated *> begin <* reads a parameter character *> integer char; while kind(ix)=sptype do ix:=ix+1; char:=0; if kind(ix)<>8 then begin read_param_char:=val(ix); char:=val(ix); ix:=ix+1; end else read_param_char:=0; testout(<:read param char:>,char); end read param char; \f procedure cleartemps; begin indents:=indents-tempindent; tempindent:=0; end ct; \f procedure divert_to_index_file(last_pos); value lastpos; integer lastpos; begin <* writes the word up to lastpos in the val-array to the indexfile. the first char is converted to a small letter if 'small_first_letter_in_index' is on and it is the only big letter in the word *> integer char, firstchar, i,firstpos; boolean convert_first_char,continue; if first_index_on_page then begin first_index_on_page:=false; write(index,<<d>,pi,"nl",1); end; i:=lastpos; continue:=true; while i>0 and continue do if val(i)=tabch or val(i)='sp' then continue:=false else i:=i-1; first_pos:=i+1; first_char:=val(first_pos); while ( (firstchar<'A') _ or (firstchar>'Å' and firstchar<'a') _ or (firstchar>'å') ) and (firstpos<lastpos) do begin firstpos:=firstpos+1; firstchar:=val(firstpos); end; if small_first_letter_in_index then begin if first_char>=65 and first_char<=93 then begin <* now find out if there are any other big letters in the word *> convert_first_char:=true; for i:=firstpos+1 step 1 until lastpos do begin char:=val(i); if char>=65 and char<=93 then convert_first_char:=false; end; end first was big else convert_first_char:=false; end else convert_first_char:=false; if convert_first_char then val(first_pos):=first_char+32; for i:=firstpos step 1 until lastpos do begin char:=val(i); if char<>hyphenation_char and char<>tabch and char<>indexchar then outchar(index,if char=spch then 'sp' else char); end; outchar(index,'nl'); end divert to index file; \f procedure indexsrtprc(zin,zout,zhelp,zsort,maxpoint,mess); value maxpoint,mess; integer maxpoint; boolean mess; zone zin,zout,zhelp,zsort; begin <*************************************************** * * i n d e x s o r t * * this procedure is used to assist an author in producing * an index to his manual. * * its function is described in rcsl-no. 52-aa1014 * * files: * zin: holds the input text. the file must be open on call * zout: will contain the index after call. must be open on call * zhelp, * zsort: auxilliary zones. must be closed on call. * the procedure opens them to helplist and outlist resp. * these files must exist. * * programmed october 1979 by oer * modified november 1980 by stb (capital letters) * - april 1981 by stb (procedure) * *********************************************************> \f <********************************************************** strategi: the input comes on file 'zin'. indexsrtprc performs the following steps: 1. scan zin and for each element make a record on file 'zhelp' 2. call mdsortproc. the sorted records are delivered _ on file 'zsort'. 3. scan 'zsort' and for each record write a line/pageno. in the _ file 'zout', which eventually holds the index. ************************************************************> \f <********************************************> <* declarations *> <********************************************> real array rec(1:18), names(1:6); real array infile(1:2),outfile(1:2); real array act_text(1:6); integer array table(0:255), param(1:7), key_descr(1:6,1:2); integer i,j,k,no_of_recs,max_length,result,explanation,act_point; integer line_no,out_pos,out_line,lines_pr_page,in_char,act_char,p1,p2,p3; boolean test; boolean field capitals; integer field len,point,typ; real eof; integer array field iaf; real array field in_text,syn_text, sort_text; \f procedure set_table; begin <*defines an in_table with all characters having class 'text' except 'em' and 'nl'. 'nul' is blind *> integer i,j,k; for i:=1 step 1 until 255 do table(i):=6 shift 12 + i; table(0):=0; table(10):=8 shift 12 + 10; table(25):=8 shift 12 + 25; table(36):=7 shift 12 + 36; for j:=48 step 1 until 57 do table(j):=2 shift 12 + j; table(13):=13; intable(table); end set table; \f procedure create_sort_text; begin <* copies rec.in_text to rec.sort_text while converting capital letters to small letters. if any capital letters occured then rec.capitals is set to true *> boolean caps; integer point, in_char, sort_char,j; real in_db_word, sort_db_word; caps:=false; for point:=1 step 1 until 5 do begin <* copy a double word *> in_db_word:=rec.in_text(point); sort_db_word:=real<::>; if in_db_word <> real<::> then for j:=-40 step 8 until 0 do begin <* copy a letter *> in_char:=in_db_word shift j extract 8; if (in_char>64) and (in_char<94) then begin caps:=true; sort_char:=in_char+32; end else sort_char:=in_char; sort_db_word:=sort_db_word shift 8 add sort_char; end; rec.sort_text(point):=sort_db_word; end; rec.capitals:=caps; end create sort text; \f procedure err1; indexerrmess(<:missing index word:>); procedure err2; indexerrmess(<:too long index word:>); procedure err3; indexerrmess(<:too big page number:>); procedure indexerrmess(s); string s; write(out,<:<10>page: :>,<<dd>,actpoint,"sp",1,s); \f <********************************************> <* initializations *> <********************************************> set_table; sort_text:=4; syn_text:=52; in_text:=32; for i:=1 step 1 until 6 do act_text(i):=real <::>; test:=true; len:=2; iaf:=0; capitals:=29; point:=28; typ:=26; p1:=0; p2:=0; p3:=0; line_no:=10; open(zhelp,4,<:helplist:>,0); \f <********************************************> <* now read the lines and copy them to zhelp as records *> <********************************************> no_of_recs:=0; max_length:=52; act_point:=0; act_char:=0; repeat for i:=1 step 1 until 18 do rec(i):=real<::>; i:=readchar(zin,j); line_no:=line_no+10; case i of begin ; begin <* pagenumber *> repeatchar(zin); read(zin,act_point); if act_point > max_point then err3; end; ;;; begin <* character *> if j=35 then begin <* f or ff *> readchar(zin,j); if j=35 then begin <* ff *> k:=readstring(zin,rec,9); if k=0 then err1; if k>5 then err2; rec.len:=32; rec.typ:=3; rec.point:=act_point; end else begin <* f *> repeatchar(zin); k:=readstring(zin,rec,9); if k=0 then err1; if k>5 then err2; rec.len:=32; rec.typ:=2; rec.point:=act_point; end end else begin <* keyword *> repeatchar(zin); k:=readstring(zin,rec,9); if k=0 then err1; if k>5 then err2; rec.len:=32; rec.typ:=1; rec.point:=act_point; end; end; begin <* synonym *> k:=readstring(zin,rec,9); if k=0 then err1; if k>5 then err2; k:=readstring(zin,rec,14); if k=0 then err1; if k>5 then err2; rec.len:=72; rec.typ:=4; max_length:=72; end; ; end case; if (j<48) or (j>57) then begin create_sort_text; if rec.capitals and (rec.typ<>4) then rec.len:=52; outvar(zhelp,rec); no_of_recs:=no_of_recs+1; end; until i=8; for i:=1 step 1 until 12 do rec(i):=real<::>; rec.len:=32; outvar(zhelp,rec); close(zhelp,false); \f <********************************************************> <* now set up the parameters for the call of mdsortproc *> <********************************************************> param(1):=1; <* segments pr in_block *> param(2):=1; <* clear input is ok *> param(3):=1; <* segments pr out_block *> param(4):=0; <* variable record length *> param(5):=max_length; param(6):=6; <* no of keys *> param(7):=0; <* don't print expected time *> key_descr(1,1):=3; <* type = long, ascending *> key_descr(1,2):=8; <* position *> key_descr(2,1):=3; key_descr(2,2):=12; key_descr(3,1):=3; key_descr(3,2):=16; key_descr(4,1):=3; key_descr(4,2):=20; key_descr(5,1):=3; key_descr(5,2):=24; key_descr(6,1):=2; <* integer, ascending *> key_descr(6,2):=28; names(1):=real<:helpl:> add 'i'; names(2):=real<:st:>; names(3):=real<:outli:> add 's'; names(4):=real<:t:>; names(5):=real<::>; names(6):=real<::>; mdsortproc(param,key_descr,names,eof,no_of_recs,result,explanation); if mess then write(out,<:<10>result of index was:>,result,explanation,"nl",1); \f open(zsort,4,<:outlist:>,0); <*********************************************> <* make the outputfile *> <*********************************************> for i:=1 step 1 until 6 do act_text(i):=real<::>; lines_pr_page:=pl-(tm+bm); out_pos:=0; out_line:=5; act_char:=0; outputtoppage; write(zout,"nl",1,"sp",po); outchar(zout,aix(1)+64); write(zout,".",1,"sp",stdindent-2); if english then write(zout,<:INDEX:>,"sp",stdll-5-stdindent) else write(zout,<:STIKORDSREGISTER:>,"sp",stdll-16-stdindent); outchar(zout,aix(1)+64); outchar(zout,'.'); write(zout,carriage,1,"sp",po, _ false add 95,stdindent+(if english then 5 else 16), _ "nl",2); for i:=1 step 1 until no_of_recs do begin invar(zsort); <* first find out if a new word is coming *> j:=1; while (act_text(j)=zsort.sort_text(j)) and (j<6) do j:=j+1; <* now if j is less than 6 it is a new word *> if j<6 then begin <* new text *> if out_line >lines_pr_page then begin li:=outline; output_bottom_page; out_pos:=0; pi:=pi+1; out_line:=1; outputtoppage; end; in_char:=zsort.sort_text(1) shift (-40) extract (8); if act_char <> in_char then begin <* new first-letter *> act_char:=in_char; write(zout,"nl",1); out_line:=out_line+1; end; write(zout,"nl",1); k:=1; write(zout, ".", 39- write(zout, <: :>, _ if zsort.capitals then string zsort.in_text(increase(k)) _ else string zsort.sort_text(increase(k)) _ ), <: :>); out_line:=out_line+1; out_pos:=41; for j:=1 step 1 until 5 do act_text(j):=zsort.sort_text(j); act_text(6):=real<::>; <* type and page-no. *> end; if (act_text(6)<>zsort.sort_text(6)) or (j<6) then begin act_text(6):=zsort.sort_text(6); <* type and point (i.e. pageno. *> <* this is in order not to print the same pageno. twice, even if the user has specified it twice on the same page (by mistake) *> case zsort.typ of begin begin <* only pagenumber *> if out_pos > 62 then begin out_pos:=write(zout,"nl",1," ",41,zsort.point); out_line:=out_line+1; end else if out_pos<> 41 then out_pos:=out_pos+write(zout,<:,:>,zsort.point) else out_pos:=out_pos+write(zout,zsort.point); end; begin <* pageno and f *> if out_pos > 62 then begin out_pos:=write(zout,"nl",1," ",41,zsort.point,<: f.:>); out_line:=out_line+1; end else if out_pos<>41 then out_pos:=out_pos+write(zout,<:,:>,zsort.point,<: f.:>) else out_pos:=out_pos+write(zout,zsort.point,<: f.:>); end; begin <* pageno and ff *> if out_pos > 62 then begin out_pos:=write(zout,"nl",1," ",41,zsort.point,<: ff.:>); out_line:=out_line+1; end else if out_pos <> 41 then out_pos:=out_pos+write(zout,<:,:>,zsort.point,<: ff.:>) else out_pos:=out_pos+write(zout,zsort.point,<: ff.:>); end; begin <* syn text *> k:=1; out_pos:=out_pos+write(zout,<: :>,string zsort.syn_text(increase(k))); end; end case; end; end for; li:=outline; outputbottompage; end index sort proc; \f procedure insert_register(reg_no,ix); value reg_no; integer reg_no,ix; <* ix is updated *> begin <* inserts the value of the register into the 'val'-array. ix points to the reg_char. after the call ix points just after the inserted number *> integer reg_value, needed_room,i,absval; reg_value:= if reg_no='f' then fig_no else if regno='F' then figno+1 else if regno='e' then exno else if regno='E' then exno+1 else if regno='p' then pi else if regno='P' then pi+1 else if regno='1' then aix(1) else if regno='2' then aix(2) else if regno='3' then aix(3) else if regno='4' then aix(4) else reg(regno); absval:=abs(regvalue); needed_room:=if regvalue=0 then 1 else _ entier( ln(absval)/ln(10) ) _ + (if regvalue<0 then 2 else 1); ix:=needed_room+ix; <* ix points now just after the number *> <* now move the remaining part part of val 'neededroom' positions to the right to give room for the no *> if neededroom=1 then begin <* no: move one pos left !! *> for i:=ix step 1 until chars_read-1 do begin val(i):=val(i+1); kind(i):=kind(i+1); end end else if neededroom>2 then for i:=chars_read+neededroom-1 step -1 until ix+neededroom-1 do begin val(i):=val(i-neededroom); kind(i):=kind(i-neededroom); end; <* if needed room = 2 then do nothing *> i:=ix-1; <* last pos of the number *> repeat val(i):=(absval mod 10) + '0'; kind(i):=chartype; absval:=absval//10; i:=i-1; until absval=0; if regvalue<0 then begin val(i):='-'; kind(i):=chartype; end; charsread:=charsread+(if neededroom=1 then -1 _ else if neededroom=2 then 0 _ else neededroom); end insert register; procedure errmess(s,pi,li); string s; integer pi,li; begin write(out,<:<10>page: :>,<<dd>,pi,<:, line: :>,li); if bosslinemode then write(out,<:, bossline: :>,<<ddddd>,bosslineno,":",1,"sp",1); write(out,s); end err; \f procedure writeno(x,resarray,resix,lix,nowidth); value x,lix,nowidth; integer x,resix,lix,nowidth; boolean array resarray; begin integer ix,i; integer array temp(1:10); ix:=0; while x<>0 do begin ix:=ix+1; temp(ix):=x mod 10; x:=x//10; end; for i:=1 step 1 until (nowidth-ix) do begin resarray(lix,resix):="sp"; resix:=resix+1; end; while ix>0 do begin resarray(lix,resix):=false add (temp(ix)+'0'); ix:=ix-1; resix:=resix+1; end; end writeno; \f procedure write_no_in_text(no); value no; integer no; begin <* the procedure writes 'no' in the text as if it had been typed in a normal inputline. used to insert e.g. references to fig no's and ex no's *> integer needed_room,ci; ci:=page(li,-1) extract 8; needed_room:=(if no<10 then 1 _ else if no<100 then 2 else 3) _ + 1 <* leading space *>; if ll-ci<needed_room then begin changeline(true,1); ci:=page(li,-1) extract 8; end; if ci<>(page(li,-2) extract 8) then begin ci:=ci+1; page(li,ci):="sp"; if join then begin ci:=ci-1; join:=false; end join; end; ci:=ci+1; no_of_words:=no_of_words+1; wordstart(no_of_words):=ci; write_no(no,page,ci,li,0); page(li,-1):=false add (ci-1); end write no in text; \f procedure section(level); value level; integer level; begin <* starts a new section. if level=1 then it's a new chapter and we start a new page. The new section is written in the 'contents' file *> integer i,ci,eno,etx; while instack(0)<>0 do popindent; cleartemps; indents:=stdindent; if (level=1) or (li>pl-(tm+bm)-8) then begin <* new page *> changeline(false,0); outputpage(1); end else changeline(false,2); page(li,-2):=false add 0; ci:=1; aix(level):=aix(level)+1; for i:=level+1 step 1 until 5 do aix(i):=0; if appendix then begin page(li,ci):=false add (aix(1)+64); ci:=ci+1; end else writeno(aix(1),page,ci,li,0); if level=1 then begin <* new chapter *> eno:=ci; page(li,ci):="."; ci:=ci+1; end new chapter else begin <* level > 1 *> for i:=2 step 1 until level do begin page(li,ci):="."; ci:=ci+1; writeno(aix(i),page,ci,li,0); end; eno:=ci-1; end; if ci>=stdindent then begin page(li,ci):="sp"; ci:=ci+1; end; for ci:=ci step 1 until stdindent do page(li,ci):="sp"; page(li,-1):=false add (ci-1); if kind(4)<>8 then moveuntouched(5); ci:=page(li,-1) extract 8; special:=1; for i:=1 step 1 until ci do page(li,i):=page(li,i) add (1 shift 8); etx:=ci; for ci:=ci+1 step 1 until stdll do page(li,ci):="sp"; ci:=ci-1; i:=1; <* now copy the section number *> while (page(li,i) extract 8)<>'sp' do begin ci:=ci+1; page(li,ci):=false add (page(li,i) extract 8); i:=i+1; end; page(li,-1):=false add ci; if level<=clevel then writecontents(li,eno,etx,pi,level,false); changeline(false,2); end section; \f procedure tabulate(inputix); integer inputix; begin integer ix,tabix,wix,wordwidth,tabwidth,i,maxtab; boolean error; error:=false; repeat <* until no more consequtive tabs *> tabix:=ix:=(page(li,-1) extract 8)+1; maxtab:=if fill then ll else stdll+7; while -, tab(1,tabix) and tabix<=maxtab do tabix:=tabix+1; if tabix>maxtab then begin errmess(<:tabulation exceeds page:>, pi,li); changeline(false,0); inputix:=inputix+1; error:=true; end else begin <* tabix points to the next tab pos _ ix points to the first free pos in the line *> if (tab(2,tabix) extract 8)=1 then <* tabulate and left justify *> begin for i:=ix step 1 until tabix-1 do page(li,i):="sp"; ix:=tabix; if test then testout(<:tab left, ix=:>,ix); end else begin <* right or centre tab *> wix:=inputix+1; while kind(wix)=chartype do wix:=wix+1; wordwidth:=wix-inputix-1; tabwidth:=tabix-ix+1; if (tab(2,tabix) extract 8)=3 then <* tabulate and centre word *> wordwidth:=wordwidth//2+1; if test then testout(<:tab c-r, wordwidth=:>,wordwidth); if test then testout(<:tab c-r, tabwidth =:>,tabwidth); if wordwidth>tabwidth then begin errmess(<:C or R tabulation exceeds available room:>,pi,li); inputix:=inputix+1; error:=true; end else for i:=1 step 1 until tabwidth-wordwidth do begin page(li,ix):="sp"; ix:=ix+1; end; end; <* ix points to the first free pos in the line *> if -,error then begin page(li,-1):=false add (ix-1); inputix:=inputix+1; if kind(inputix)=tabtype then begin page(li,ix):="sp"; ix:=ix+1; page(li,-1):=false add (ix-1); end; \f end not error; end not error; until (kind(inputix)<>tabtype) or error; end tabulate; \f procedure testout(s,i); value i; integer i; string s; if test then begin <* write testoutput on current output *> write(out,"nl",1,<:*test* :>,pi,"sp",1,li,"sp",1,bosslineno,"sp",1,s,"sp",1,i); setposition(out,0,0); end testout; \f procedure rightjustify(lineno,noofwords); value lineno, noofwords; integer lineno,noofwords; begin <* the procedure stuffs extra spaces between words on a given line within _ the page, thus right justifying the right margin. _ the algorithm used is found in _ " a data directed approach to program design", _ software practice and experience, vol. 10, 1980. *> integer extrablanks,rightblanks,leftblanks,intersectword,i,wordno,spaces, _ newchpt,oldchpt,lineno1; extrablanks:=ll-page(lineno,-1)extract 8; if extrablanks<>0 then begin <* compute leftblanks, rightblanks, and intersectword *> lineno1:= if spacing mod 2 = 0 then lineno//2 else lineno; <* because otherwise we would always justify to the same side if spacing were e.g. 2 *> if lineno1 mod 2=0 then begin <* justify left line *> rightblanks:=(extrablanks)//(noofwords-1)+1; leftblanks := rightblanks+1; intersectword:=(extrablanks mod (noofwords-1))+1; end else begin <* justify right line *> leftblanks:=(extrablanks)//(noofwords-1)+1; rightblanks:=leftblanks+1; intersectword:=noofwords-(extrablanks mod (noofwords-1)); end; newchpt:=ll+1; oldchpt:=page(lineno,-1) extract 8 +1; for wordno:=noofwords step -1 until 2 do begin <* move word forward and insert spaces to the left *> repeat newchpt:=newchpt-1; oldchpt:=oldchpt-1; page(lineno,newchpt):=page(lineno,oldchpt); until oldchpt=wordstart(wordno); oldchpt:=oldchpt-1; spaces:=if wordno>intersectword then rightblanks else leftblanks; for i:=1 step 1 until spaces do begin newchpt:=newchpt-1; page(lineno,newchpt):="sp"; end; end move word; page(lineno,-1):=false add ll; end extrab<>0; end right just; \f procedure initall; begin boolean boo; real array ra(1:2); text_open(zout); open(contents,4,<:contents:>,0); setposition(contents,0,0); qume:=false; læsfpboo(<:qume:>,qume); if qume then begin form_f:=false add (128+'ff'); carriage:=false add (128+'cr'); end else begin form_f:="ff"; carriage:="cr"; end; english:=false; læsfpboo(<:english:>,english); clock:=false; læsfpboo(<:clock:>,clock); lineno:=false; læsfpboo(<:lineno:>,lineno); clevel:=læsfptal(<:level:>); if clevel=0 then clevel:=4; test:=false; test:=læsfpboo(<:test:>,test); bosslinemode:=false; bosslineno:=0; læsfpboo(<:bosslines:>,bosslinemode); læsfpboo(<:bl:>, bosslinemode); mess:=true; læsfpboo(<:mess:>,mess); læsfpboo(<:message:>,mess); læsfpboo(<:ms:>,mess); first_page:=læsfptal(<:first:>); if first_page=0 then first_page:=læsfptal(<:f:>); last_page:=læsfptal(<:last:>); if last_page=0 then last_page:=læsfptal(<:l:>); if last_page=0 then last_page:=1000000; indexon:=false; small_first_letter_in_index:=false; læsfpboo(<:index:>,indexon); if indexon then begin <* open the index file *> open(index,4,<:index:>,0); first_index_on_page:=true; small_first_letter_in_index:=true; end; indexchar:='^'; for i:=0 step 1 until 127 do reg(i):=0; for i:=0 step 1 until 127 do table(i):= (case i+1 of ( 0, 0, 0, 0, 0, 0, 0, 0, <* ht,nl,ff*> 0,10, 8, 0, 8, 0, 0, 0, ______________ 0, 0, 0, 0, 0, 0, 0, 0, <* em *> 0, 8, 0, 0, 0, 0, 0, 0, <* sp *> 7,10, 9, 9, 9, 9, 9, 9, <*: ; -.*> 9, 9, 9, 9, 9, 9, 9, 9, <*0...*> 9, 9, 9, 9, 9, 9, 9, 9, <*:;?*> 9, 9, 9, 9, 9, 9, 9, 9, <* @ A..*> 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, ______________ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, ______________ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, ______________ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0)) shift 12 +i; for i:=32 step 1 until 126 do for j:=32 step 1 until 126 do action(i,j):=false add 0; for i:=1,2 do for j:=1 step 1 until 100 do tab(i,j):=false; for i:=1 step 1 until 100 do framepos(i):=false; first_frame_pos:=last_frame_pos:=1; inix:=1; figno:=exno:=0; li:=1; pi:=1; stdindent:=8; stdll:=66; ll:=stdll-5; pl:=60; tm:=5; bm:=5; pnof:=3; sptype:=7; chartype:=9; tabtype:=10; po:=8; indents:=stdindent; special:=0; charmode:=0; spacing:=1; blkch:='-'; spch:='@'; hyphenation_char:='_'; tabch:='!'; comch:='>'; reg_char:=0; rightjust:=true; noofwords:=0; fill:=true; contpi:=0; contli:=10000; inputend:=lineend:=false; appendix:=false; frame:=false; join:=false; footer:=false; header:=true; correction_line:=false; autopageshift:=false; version:=0; for i:=1 step 1 until 100 do head(1,i):=foot(1,i):="sp"; foot(1,0):=false add 0; head(1,0):=false add (stdll//2 - 1); for i:=1 step 1 until 5 do aix(1):=0; inlno:=0; tempindent:=0; instack(0):=0; intable(table); page(li,-2):=page(li,-1):=false add indents; page(li,0):=false; page(li,-3):=correction_line; action('s','p'):=false add 1; action('c','c'):=false add 2; action('c','e'):=false add 3; action('t','m'):=false add 4; action('b','m'):=false add 5; action('u','l'):=false add 6; action('i','n'):=false add 7; action('t','i'):=false add 8; action('f','i'):=false add 9; action('n','f'):=false add 10; action('n','p'):=false add 11; action('p','o'):=false add 12; action('a','1'):=false add 13; action('a','2'):=false add 14; action('a','3'):=false add 15; action('a','4'):=false add 16; action('h','e'):=false add 17; action('f','o'):=false add 18; action('p','f'):=false add 19; action('p','n'):=false add 20; action('n','e'):=false add 21; action('b','r'):=false add 22; action('s','s'):=false add 23; action('d','s'):=false add 24; action('t','a'):=false add 25; action('t','d'):=false add 26; action('s','c'):=false add 27; action('t','c'):=false add 28; action('j','u'):=false add 29; action('n','j'):=false add 30; action('r','j'):=false add 31; action('f','g'):=false add 32; action('e','x'):=false add 33; action('b','c'):=false add 34; action('t','b'):=false add 35; action('a','p'):=false add 36; action('h','c'):=false add 37; action('l','l'):=false add 38; action('p','l'):=false add 39; action('f','d'):=false add 40; action('f','b'):=false add 41; action('f','e'):=false add 42; action('m','s'):=false add 43; action('l','s'):=false add 44; action('t','f'):=false add 45; action('t','s'):=false add 46; action('t','l'):=false add 47; action('a','a'):=false add 48; action('i','x'):=false add 50; action('j','o'):=false add 51; action('x','c'):=false add 52; action('f','v'):=false add 53; action('b','l'):=false add 54; action('x','s'):=false add 55; action('a','r'):=false add 56; action('r','c'):=false add 57; action('v','e'):=false add 58; action('c','l'):=false add 59; end initall; \f zone zout, contents, index(128*2,1,stderror); integer array val,kind(1:250), table,reg(0:127), instack(0:10), aix(1:5), _ wordstart(1:52), bossline(1:100); boolean array page(1:100,-3:100), action(32:126,32:126), tab, tabreg(1:2,1:100), _ head,foot(1:1,0:100), frame_pos(1:100); integer i,j,ci,li,pi,no,ll,pl,lb,pb,inix,chartype,inlno,spch,tabch, _______ sptype,bm,tm,indents,comch,tempindent,tabtype,spacing,noofwords, _ special,po,charmode,stdindent,stdll,pnof,contli,clevel,contpi, _ exno,first_page,last_page,figno,blkch,bosslineno, hyphenation_char,first_frame_pos,last_frame_pos,revision,indexchar, chars_read,reg_char,p1,ix,version; real cpu,base,time,cpu2,cpu3; boolean fill,inputend,lineend,header,footer,lineno,test,english,clock, _ rightjust,carriage,form_f,bosslinemode, small_first_letter_in_index,correction_line,autopageshift, appendix,frame,qume,mess,normal_line,join,indexon,first_index_on_page; \f <***************************************************** * * * main program * * *****************************************************> revision:=19; cpu:=systime(1,0,base); cpu3:=cpu2:=0; initall; if mess then write(out,<:<10>ROFF version 1.:>,<<d>,revision); repeat <* until input end *> repeat <* until normal_line *> normal_line:=true; if clock then begin cpu2:=systime(1,base,time)-cpu; if (cpu2-cpu3)>1 then begin write(out,<< dddd.dd>,cpu2); setposition(out,0,0); cpu3:=cpu2; end; end; charsread:=readall(in,val,kind,1); if regchar<>0 then begin <* scan the line and evaluate possible register calls *> ix:=1; while kind(ix)<>8 do begin if val(ix)=regchar then insertregister(val(ix+1),ix) else ix:=ix+1; end while; end regchar<>0; bosslineno:=bosslineno+10; inlno:=inlno+1; inix:=1; if val(1)='sp' then begin while instack(0)<>0 do popindent; changeline(false,0); normalline:=false; moveuntouched(1); page(li,-3):=correctionline; changeline(false,0); end else if val(1)='nl' then begin changeline(false,0); normalline:=false; while instack(0)<>0 do popindent; changeline(false,1); end else if val(1)=blkch then begin if li>(pl-(tm+bm)-5) then begin changeline(false,0); popindent; outputpage(1); pushindent(5); settempindent(-2); changeline(false,0); end else begin pushindent(5); settempindent(-2); changeline(false,0); end; val(2):=spch; kind(2):=chartype; end else \f if val(1)=comch then begin integer cmix; cmix:=action(val(2),val(3)) extract 8; if cmix=0 then begin errmess(<:illegal command:>,pi,li); moveuntouched(1); changeline(false,0); normalline:=false; end else begin ix:=4; case cmix of begin begin <* 1, sp *> p1:=abs readoneparam(ix); if p1>0 then changeline(false,0); changeline(false,p1); end sp; begin <* 2, cc *> comch:=readparamchar(ix); end cc; begin <* 3, ce *>; changeline(false,0); special:=4; end ce; begin <* 4, tm *>; tm:=abs readoneparam(ix); end tm; begin <* 5, bm *> bm:=abs readoneparam(ix); end bm; begin <* 6, ul *> charmode:=1; special:=1; end ul; begin <* 7, in *> p1:=readoneparam(ix); indents:=indents+p1; <* note relative update *> if indents<0 then indents:=0; changeline(false,0); end in; begin <* 8, ti *> p1:=readoneparam(ix); settempindent(p1); changeline(false,0); end ti; begin <* 9, fi *> changeline(false,0); fill:=true; end fi; begin <* 10, nf *> changeline(false,0); fill:=false; end nf; begin <* 11, np *> p1:=abs readoneparam(ix); if p1=0 then p1:=1; changeline(false,1); outputpage(p1); autopageshift:=false; end np; begin <* 12, po *> po:=abs readoneparam(ix); end po; begin <* 13, a1 - start chapter *> section(1); end; begin <* 14, a2 - start section *> section(2); end; begin <* 15, a3 - start subsection *> section(3); end; begin <* 16, a4 - start sub-sub-section *> section(4); end; begin <* 17, he *> integer array sp(1:2); boolean array head2(1:1,0:100); boolean ch; integer i,ix,heix,heix2,delimno,spix,spno; header:=true; for i:=1 step 1 until 100 do head(1,i):=head2(1,i):="sp"; head(1,0):=false add 0; changeline(false,0); delimno:=0; ix:=4; while kind(ix)=sptype do ix:=ix+1; heix2:=1; while kind(ix)<>8 do begin if val(ix)='#' then begin head2(1,heix2):="#"; for i:=1 step 1 until pnof-1 do head(1,heix2+i):="sp"; heix2:=heix2+pnof; end else begin head2(1,heix2):=false add val(ix); if val(ix)='ü' then delimno:=delimno+1; heix2:=heix2+1; end; ix:=ix+1; end while; if delimno>2 then begin errmess(<:too many delimiters, he:>,pi,li); moveuntouched(1); changeline(false,0); end else begin heix2:=heix2-1; spno:=stdll-heix2; if delimno<2 then sp(1):=spno else begin sp(1):=spno//2; sp(2):=spno-sp(1); end; heix:=if delimno=0 then stdll-spno//2 else stdll; spix:=1; while heix>0 and heix2>0 do begin if (head2(1,heix2) extract 8)='ü' then begin for i:=1 step 1 until sp(spix) do begin head(1,heix):="sp"; heix:=heix-1; end; spix:=spix+1; heix:=heix-1; heix2:=heix2-1; end <* if ü *> else begin ch:=head2(1,heix2); if (ch extract 12 = spch) then ch:="sp"; head(1,heix):=ch; if (head(1,heix) extract 8)='#' then begin head(1,0):=false add heix; end; heix:=heix-1; heix2:=heix2-1; end elser; end while; end elser no error; end he; begin <* 18, fo *> integer array sp(1:2); boolean array foot2(1:1,0:100); integer i,ix,foix,foix2,delimno,spix,spno; boolean ch; footer:=true; for i:=1 step 1 until 100 do foot(1,i):=foot2(1,i):="sp"; changeline(false,0); delimno:=0; ix:=4; while kind(ix)=sptype do ix:=ix+1; foix2:=1; while kind(ix)<>8 do begin if val(ix)='#' then begin foot2(1,foix2):="#"; for i:=1 step 1 until pnof-1 do foot(1,foix2+i):="sp"; foix2:=foix2+pnof; end else begin foot2(1,foix2):=false add val(ix); if val(ix)='ü' then delimno:=delimno+1; foix2:=foix2+1; end; ix:=ix+1; end while; if delimno>2 then begin errmess(<:too many delimiters, fo:>,pi,li); moveuntouched(1); changeline(false,0); end else begin foix2:=foix2-1; spno:=stdll-foix2; if delimno<2 then sp(1):=spno else begin sp(1):=spno//2; sp(2):=spno-sp(1); end; foix:=if delimno=0 then stdll-spno//2 else stdll; spix:=1; while foix>0 and foix2>0 do begin if (foot2(1,foix2) extract 8)='ü' then begin for i:=1 step 1 until sp(spix) do begin foot(1,foix):="sp"; foix:=foix-1; end; spix:=spix+1; foix:=foix-1; foix2:=foix2-1; end <* if ü *> else begin ch:=foot2(1,foix2); if (ch extract 12 = spch) then ch:="sp"; foot(1,foix):=ch; if (foot(1,foix) extract 8)='#' then begin foot(1,0):=false add foix; end; foix:=foix-1; foix2:=foix2-1; end elser; end while; end elser no error; end fo; begin <* 19, pf *> pnof:=abs readoneparam(ix); end pf; begin <* 20, pn *> pi:=0; repeat pi:=pi+readoneparam(ix); until kind(ix)=8; if indexon then write(index,<<d>,pi,"nl",1); end pn; begin <* 21, ne *> p1:=readoneparam(ix); if li>(pl-(tm+bm)-p1) then begin changeline(false,0); outputpage(1); autopageshift:=false; end; end ne; begin <* 22, br *> changeline(false,0); end br; begin <* 23, ss *> spacing:=1; end ss; begin <* 24, ds *> spacing:=2; end ds; begin <* 25, ta *> integer maxtab; boolean error; maxtab:=if fill then ll else stdll+7; error:=false; for i:=1,2 do for j:=1 step 1 until 100 do tab(i,j):=false; repeat p1:=abs readoneparam(ix); if p1>0 then begin if p1>maxtab then begin moveuntouched(1); changeline(false,0); errmess(<:tab set beyond page limit, ta:>,pi,li); error:=true; end else begin tab(1,p1):=true; if val(ix)='L' then tab(2,p1):=false add 1 else if val(ix)='R' then tab(2,p1):=false add 2 else if val(ix)='C' then tab(2,p1):=false add 3 else begin tab(2,p1):=false add 1; ix:=ix-1; end; ix:=ix+1; end; end; until p1=0 or kind(ix)=8 or error; end ta; begin <* 26, td *> if (pi>=first_page) and (pi<=last_page) then begin write(zout,"nl",1,"sp",po+(if lineno then 4 else 0)); for i:=1 step 1 until ll do outchar(zout,(if tab(1,i) then '!' else 'sp')); write(zout,"nl",1,"sp",po+(if lineno then 4 else 0)); for i:=1 step 1 until ll do outchar(zout,if tab(1,i) then (case (tab(2,i) extract 8) of ('L', 'R', 'C')) else 'sp'); outchar(zout,'nl'); end; end td; begin <* 27, sc *> spch:=readparamchar(ix); end sc; begin <* 28, tc *> if tabch<>0 then begin <* clear the old tab char *> table(tabch):=(chartype shift 12) + tabch; end; tabch:=readparamchar(ix); if tabch<>0 then table(tabch):=(tabtype shift 12) + tabch; intable(table); end tc; begin <* 29, ju *> changeline(false,0); rightjust:=true; end ju; begin <* 30, nj *> changeline(false,0); rightjust:=false; end nj; begin <* 31, rj *> ci:=page(li,-1) extract 8; for i:=ci+1 step 1 until stdll do page(li,i):="sp"; page(li,-1):=false add stdll; ci:=ll; ll:=100; moveuntouched(4); ll:=ci; changeline(false,0); end rj; begin <* 32, fg *> changeline(false,0); ci:=page(li,-1) extract 8; for i:=1 step 1 until 4 do begin ci:=ci+1; page(li,ci):=case i of ("F","i","g","."); end; ci:=ci+1; figno:=figno+1; writeno(figno,page,ci,li,3); page(li,ci):="."; ci:=ci+1; page(li,ci):="sp"; page(li,-1):=false add ci; moveuntouched(4); special:=4; changeline(false,0); end fg; begin <* 33, ex *> changeline(false,0); if li>(pl-(tm+bm)-5) then outputpage(1); ci:=page(li,-1) extract 8; if english then begin for i:=1 step 1 until 7 do begin ci:=ci+1; page(li,ci):=case i of ("E","x","a","m","p","l","e"); end; end else for i:=1 step 1 until 8 do begin ci:=ci+1; page(li,ci):=case i of ("E","k","s","e","m","p","e","l"); end; ci:=ci+1; exno:=exno+1; writeno(exno,page,ci,li,3); page(li,ci):="."; ci:=ci+1; page(li,ci):="sp"; page(li,-1):=false add ci; moveuntouched(4); special:=1; ci:=page(li,-1) extract 8; for i:=1 step 1 until ci do page(li,i):=page(li,i) add (1 shift 8); changeline(false,0); end ex; begin <* 34, bc - block character *> blkch:=readparamchar(ix); end ; begin <* 35, tb - start text block *> changeline(false,00); if li>(pl-(tm+bm)-5) then outputpage(1); p1:=readoneparam(ix); moveuntouched(ix+1); ci:=page(li,-1) extract 8; for i:=ci+1 step 1 until indents+p1 do page(li,i):="@"; page(li,-1):=false add (indents+p1); pushindent(p1); join:=true; end tb; begin <* 36, ap - appendix start *> appendix:=true; writecontents(0,0,0,0,1,true); for i:=1 step 1 until 5 do aix(i):=0; end ap; begin <* 37, hc - hyphenation character *> hyphenation_char:=readparamchar(ix); end hc; begin <* 38, ll - set line length *> p1:=readoneparam(ix); ll:=ll+ p1; <* note: relative update *> end ll; begin <* 39, pl - set page length *> pl:=abs readoneparam(ix); end pl; begin <* 40, fd - frame definition *> boolean error, first; error:=false; first:=true; for i:=1 step 1 until 100 do frame_pos(i):=false; first_frame_pos:=last_frame_pos:=1; repeat p1:=readoneparam(ix); if (p1>stdll+7) or (p1<=0) then begin error:=true; errmess(<:frame def beyond page limit, fd:>,pi,li); moveuntouched(1); changeline(false,0); end else begin <* position ok *> if first then begin <* first position *> first_frame_pos:=p1; first:=false; end; frame_pos(p1):=true; last_frame_pos:=p1; end position ok; until (kind(ix)=8) or error; end fd; begin <* 41, fb - frame begin *> changeline(false,0); for i:=first_frame_pos step 1 until last_frame_pos do page(li,i):="-"; page(li,-2):= false add (first_frame_pos - 1); page(li,-1):= false add last_frame_pos; frame:=false; changeline(false,1); frame:=true; for i:=1 step 1 until last_frame_pos do page(li,i):="sp"; end fb; begin <* 42, fe - frame end *> frame:=false; changeline(false,0); for i:=first_frame_pos step 1 until last_frame_pos do page(li,i):="-"; page(li,-2):=false add (first_frame_pos-1); page(li,-1):=false add last_frame_pos; changeline(false,1); end fe; begin <* 43, ms - message *> if mess then begin <* write the message on current output *> write(out,<:<10>message from :>,<< dd>,pi,li,":",1,"sp",1); while kind(ix)<>8 do begin outchar(out,val(ix)); ix:=ix+1; end; setposition(out,0,0); end mess; end ms; begin <* 44, ls - line spacing *> p1:=readoneparam(ix); spacing:=if p1=0 then 1 else abs p1; end ls; begin <* 45, tf - tab frame *> integer tabkind,lastpos,cpos; p1:=readparamchar(ix); tabkind:= _ if p1='R' then 2 _ else if p1='C' then 3 _ else 1 <* left *>; <* now clear all tabs *> for i:=1,2 do for j:=1 step 1 until 100 do tab(i,j):=false; case tabkind of begin begin <* left *> for i:=first_frame_pos step 1 until last_frame_pos-3 do if frame_pos(i) then begin tab(1,i+2):=true; tab(2,i+2):=false add 1; end; end left; begin <* right *> for i:=first_frame_pos+3 step 1 until last_frame_pos do if frame_pos(i) then begin tab(1,i-2):=true; tab(2,i-2):=false add 2; end; end right; begin <* centre *> last_pos:=first_frame_pos; for i:=first_frame_pos+1 step 1 until last_frame_pos do if frame_pos(i) then begin cpos:=last_pos + (i-last_pos)//2; tab(1,cpos):=true; tab(2,cpos):=false add 3; lastpos:=i; end; end centre; end case tabkind; end tf; begin <* 46, ts - tabs save *> for i:=1,2 do for j:=1 step 1 until 100 do tabreg(i,j):=tab(i,j); end ts; begin <* 47, tl - tabs load *> for i:=1,2 do for j:=1 step 1 until 100 do tab(i,j):=tabreg(i,j); end tl; begin <* 48, aa - assign section numbers *> i:=1; repeat p1:=readoneparam(ix); p1:=if p1=0 then 1 else abs p1; aix(i):=p1; i:=i+1; until (kind(ix)=8) or (p1=0) or (i=5); aix(i-1):=aix(i-1)-1; for i:=i step 1 until 5 do aix(i):=0; end aa; begin <* 49, unused *> end ; begin <* 50, ix - divert to index file *> if indexon then begin <* first skip possible spaces *> while kind(ix)<>8 and kind(ix)=sptype do ix:=ix+1; if first_index_on_page then begin <* write the page number on the index file *> write(index,<<d>,pi,"nl",1); first_index_on_page:=false; end; while kind(ix)<>8 do begin outchar(index,val(ix)); ix:=ix+1; end; outchar(index,'nl'); end indexon; end ix; begin <* 51, jo - join *> join:=true; end jo; begin <* 52, xc - index char *> indexchar:=readparamchar(ix); end xc; begin <* 53, fv - frame visual definition *> integer pos; boolean error; error:=false; for i:=1 step 1 until 100 do frame_pos(i):=false; pos:=readoneparam(ix); if pos<=0 or pos>100 then error:=true else begin while kind(ix)<>8 and val(ix)<>'!' do ix:=ix+1; first_frame_pos:=pos; while kind(ix)<>8 and -, error do begin if val(ix)='!' then begin if pos>100 then error:=true else begin framepos(pos):=true; lastframepos:=pos; end; end; pos:=pos+1; ix:=ix+1; end while; end 1<pos<100; if error then begin errmess(<:frame def outside page, fv:>,pi,li); moveuntouched(1); changeline(false,0); end error; end fv; begin <* 54, bl - set bossline number *> bosslineno:=readoneparam(ix); end bl; begin <* 55, xs - index convert first letter to small *> p1:=readparamchar(ix); if p1='+' then small_first_letter_in_index:=true else if p1='-' then small_first_letter_in_index:=false else begin errmess(<:command error, xs:>,pi,li); moveuntouched(1); changeline(false,0); end; end xs; begin <* 56, ar - assign to register *> integer reg_no,operator,operation; regno:=readparamchar(ix); reg(regno):=0; repeat operator:=readparamchar(ix); operation:= if operator='*' then 1 _ else if operator='/' then 2 _ else 3; if operation=3 then ix:=ix-1; reg(regno):= case operation of ( _ reg(regno) * readoneparam(ix), _ reg(regno) // readoneparam(ix), _ reg(regno) + readoneparam(ix) ); until kind(ix)=8; end ar; begin <* 57, rc - set register char *> regchar:=readparamchar(ix); end rc; begin <* 58, ve - version definition *> version:=abs readoneparam(ix); end; begin <* 59, cl - correction line *> p1:=readoneparam(ix); if (abs p1)=version then begin correction_line:=p1>0; page(li,-3):=correction_line or fill; end; end cl; end command case; normalline:=false; end command sequence; end command ch; until normalline; lineend:=false; \f if fill then begin <* fill *> repeat <* process normal line *> case kind(inix)-6 of begin begin <* 7, sp *> while kind(inix)=sptype do inix:=inix+1; end; begin <* 8, em, end line, ff *> if val(inix)='em' then inputend:=true else if val(inix)='ff' then begin line_end:=true; inix:=inix+1; bosslineno:=(bosslineno//1000 + 1)*1000 end else line_end:=true; end; begin <* 9, chars *> if enterpage(inix)<>0 then <* inix is updated! *> begin integer ix; ix:=page(li,-2) extract 8; if (page(li,-1) extract 8)=ix then begin while kind(inix)<>8 and ix<=ll do begin ix:=ix+1; page(li,ix):=false add (val(inix) add (charmode shift 8)); inix:=inix+1; end; page(li,-1):=false add ix; changeline(false,1); errmess(<:1 word exceeds line length:>,pi,li); end else changeline(true,1); end; end case 9; begin <* 10, tab char *> tabulate(inix); end case 10; end case; until lineend or inputend; charmode:=0; if special>3 then changeline(false,0); end fill else begin <* no fill *> moveuntouched(1); changeline(false,0); charmode:=0; end no fill; until inputend; \f changeline(false,0); outputpage(1); if indexon then begin zone zhelp,zsort(128,1,stderror); if -,appendix then begin appendix:=true; writecontents(0,0,0,0,1,true); for i:=1 step 1 until 5 do aix(i):=0; end not appendix; aix(1):=aix(1)+1; write(contents,"nl",2,"sp",po,false add (aix(1)+64),1, _ if english then <:. INDEX :> else <:. STIKORDSREGISTER :>, _ ".",stdll-(if english then 9 else 20) , _ <<ddd>,pi); write(index,"em",3); setposition(index,0,0); indexsrtprc(index,zout,zhelp,zsort,pi-1,mess); end; write(contents,"nl",1,form_f,1,"em",3); close(contents,true); write(zout,form_f,1,"em",3); text_close(zout,true); cpu:=systime(1,base,time)-cpu; if mess then write(out,<:<10>elapsed cpu time and real time:>,<<dddd.dd>,cpu,time); setposition(out,0,0); end finis ▶EOF◀