|
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: 109056 (0x1aa00) Types: TextFile Names: »tcompose«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦1a9e12e70⟧ »ccompose« └─⟦this⟧
\f ( compose=algol connect.no fp.yes list.no if ok.yes scope user compose lookup compose ) begin comment TYPOL composing program. VARIABLES IN ALPHABETIC ORDER: a constant,see comment in program. accuw accumulated width of current line. b constant, see comment in program. back true from call of proc backspace until a char.<>underline is read. Used to allow xxxx_xxxx to be interpreted as o n e word. blind true if current line is empty(no visible character). bool1,bool2 working variables. bs constant,special value (5) for backspace. bss constant,backspace-value for the typeset.machine. c zone, connected to the console in case of a online run. class integer array used by the hyphenation routine hyph. c1,c2 pointers in codebuf used when code is to be saved to next line. censp no. of units to be generated before the first character in current line when centering or quadding right mode. chapstd standard value for <chapstart>. chapstart distance in points from upper page limit to start of a new page when pageshift is generated by the user. codebuf buffer for control characters(code) for the typesetting machine in current line. codemode true if last action=putting characters in codebuf. codemask codemask shift i<0 indicates that control characters are generated after word no. i in current line. comno processing a command, comno is assigned the command no. according to the case construction in procedure typol and the table comtab. comtab table with all the commands on ISO-form, each element contains the NUL-character and the two letters. d constant, see comment in program. dropjust true if currnet line dont have to be right-justified, only used in justifying mode. ff constant, ISO-value for formfeed. figroom size in points of figures to be saved to the next page. figsize size in points of figure to be saved until current line is terminated. figur false if a figur is to be saved to next page. finis true when command EF is met. first used in justification part of program, false if additional words are read trying to make the word spacing lesser. fn pointer to first free place in footnote buffer. fnfont array, element no. i contains the font no. for footnote no. i on current page. fnote buffer for footnotes. fnoteno counts the footnotes on current page. fontcode font-character values. folip equal to <arg.1> in command PL. font actual font=the parameter to the last FT-command met. h1,h2 pointers in linebuf used when a word or part of a word is saved to the next line. h3 in case of hyphenation h3 saves the character in linebuf to be replaced by a hyphen. headlim max no. of char. in running head. headmode true when setting a running head. headp equal to <arg.4> in command PL. hyp true if hyphenation has taken place (but not if a natural breakpoint has been found). hypdigit true if proc. hyph is called, used by proc. digit to change the input table for + and -. hyphinf zone connected to a backing store area containing hyphenation information(hyph.mode 1 and 3). hypmode hyphenation mode. hypno value of the hyphenation procedure hyph. i working variable. intab contains the input table, see program description for details. j working variable. k working varaible. klass input class according to the input table of last character read. konvert table for conversion from ISO to the actual typesetting machine code. language language for source text used by the hyph. routine 1 danish 2 english. lc constant, lover case value for the typeset. mach. leading actual leading in points. leftspa used in the justification part, true if wordspace in previous line is bigger in the left part than in the right part of the line. lin pointer to first free place in linebuf. line1 used under setting of running head, false if working on an eventually second line in the head. linelim max no. of char. in linebuf. linebuf the line buffer containing all the words in a line on ISO-form, special arrays (pib and pis) points on start and end of a word. linecount distance in points from upper page limit to actual place on the page. lineno counts lines with visible characters on a page. linewidth line width in units. machine no. on actual typesetting machine. 1. Justotext 70 2. DURA 941 Automatic Typewriter 3. Flexowriter 4. RC 610 Line Printer margin left margin in units. margtext array containing margin text generated by the MT-command. maxnotelim max no. of footnotes on a page. maxfactor constant, maxfactor*maxspace is the upper limit for the average word space in a line, in which case it is not tried to read more words to decrease the wordspace. maxspace constant,maximum allowed word space in units. minfactor minfactor*minspace is the lower limit for the average word space in a line which is allowed(if possible) in the case where the word space in the previous line have been bigger than maxfactor*maxspace. minlead constant, minimum leading on the actual typesetting machine, used in connection with footnotes. minspace minimum allowed word space in units. mode current working mode. 1. justifying, 2. non-justifying, 3. tabulating, 4. centering, 5. quadding right. more false indicates that reading from the source file to current line is terminated. mtext true if margin text is to be placed in following line. mtextlim max no. of char. in margin text. mtfont font no. for margin text. newpage true if the PG-command is met. newpar indentation in units of the following line when the NP-command is met. newpstd standard indentation in units in case of new paragraph. nl constant, ISO-value for new line. nlpar number of new line characters to be generated after current line. nls constant, new line value for the typeset.mach. normsp normal width of a space in units. normw average width of a character in units. notefont font no. for the current note when setting footnotes. notelim max no. of char. in all footnotes on a page. notenumw the width in units of <d) > where d is a digit. notemode true when setting footnotes. nstext true if new section command met. nummode equal to the first parameter in the last PN-command. nump1 equal to <arg. 5> in command PL. oldfont working variable for saving of font value when setting running heads and fottnotes. outcon true if zone out = console. p1mask p1mask shift comno<0 indicates that command no. comno allways contain one or one parameter followed by <text>. p2mask constant, p2mask shift comno<0 indicates that command no. comno contain one optional or more than one parameter. pair integer array used by the hyphenation routine hyph. pagnum actual page number. pagelength distance in points from upper page limit to last real text line. pc points to first free place in codebuf. pco pco(i) is equal to the number of characters placed in codebuf to be written after word no. i. pib pib(i) points in linebuf to start of word no. i. pis pis(i) points in linebuf to end of word no. i. pnfont font no. of page number. point constant, equal to the size in mm of the typographical unit point(0.3532). pr zone connected to the proofreading file. printbuf printbuf(i) contain information about characters to be printed on the proofreading file after word no. i in current line packed in this way: bit 0-11 number of spaces bit 12-23 =1 : indicates a font command, print *) =2 : indicates a leading command, print **) =3 : indicates both , print *) **) printmask printmask shift i<0 indicates that printbuf(i) contains something to be printed after word no. i. printmode true if output is wanted on the list file. prognl true after a programgenerated line shift. progpage true from a programgenerated page shift to first real text line is to be outputted on the following page. q1,q2 working variables. ra working array. rh points to the first free place in rhead. rhead buffer for running head. rhfont font no. for running head. runfont last font no. written on the object file. runhead true if a running head is to be set on the following page. runmode mode for output generation. 1. only list 2. only for the typesetting machine(object file). 3. both s1,s2 working variables. savecode true if control characters are saved from previous line. savelead assigned to leading when entering notemode. savell assigned to linewidth when entering notemode. savemode assigned to mode when entering notemode. saveword true if a word or part of word is saved from previous line. sc1,sc2 saves the pointers c1 and c2 in connection with page shift, the footnote setting maybe destroys them. sep ISO-value for the actual separator. set zone connected to the object file. setmode true if output is wanted on the object file. sh1,sh2,sh3 saves the pointers h1,h2,h3 in connection with page shift. shiftlead true if more than one footnote on current page or the only footnote contain more than one line. shyp save value of hyp in connection with page shift. size actual type size no. smargin the coming left margin in units, used when the LM-command dont occur in connection with line shift. smtext true, if margin text is to be placed in the coming line, used when the MT-command dont occur in connection with line shift. snitspace working variable for average word space. sp constant, ISO-value for space. sp1,sp2,sp3 constants, code-values to the typeset.mach. for 1 unit, 2 unit and 3 units space. spamax true if the average in the previous line is bigger than maxfactor*maxspace. sps constant, space-value for the typeset.mach. ssavecode true if control characters is to be saved under page shift. ssaveword true if a word or part of word is to be saved under page shift. sstab special symbol table, sstab(i) contains class shift 12+value for the character assigned to the special symbol no. i by the SB command. startofline true from end of the output of the previous line until first character in next line is met. startofword true from end of reading of previous word until reading of first character in the next word is read. stop constant, stopcode value for the typeset.mach. swidth the coming line width in units, used when the LW-command dont occur in connection with lineshift. swordbuf buffer for word to be saved under page shift. tabcount counts number of tabulator marks passed in current line. tabno number of tabulator marks. tabpar table with the distance in units between the tabulator marks. test constant,assign it to true if you want the value of the most important variables printed on current output for every line cycle. text zone connected to the source file. textp equal to <arg. 3> in command PL. time constant, assign it to true if you want segment trans- fer time, cpu and real time printed on current output. toppage true from top of a page after a program generated page shift to first significant char. is met, used to avoid dobble page shift. toptext true from top of a page to the first real text line is to be outputted. Used to skip NL-commands in start of a page. typlim number of typol-commands in the actual edition of program. u1 constant, ISO-value=1 which by the table konvert is converted to the value for 1 unit space. uc constant, the upper case value for the typeset.mach. ulinemask ulinemask shift i<0 indicates that the space following word no. i is to be underlined. unit constant, equal to the size in mm of the least space unit on the actual typesett. mach., also used when measuring width of characters. upperp equal to <arg. 2> in command PL. v ISO-value for the last character read. w count the words in current line. wid width in units of first part of a hyphenated word. word false when something signalizing end of a word is met under reading from the source file wordlim max no. of char. in the word possible to be saved from one page to the next; integer linelim,wordlim,mtextlim,headlim,notelim,maxnotelim, hypmode,machine,language,hyphzl,proofzl,objzl; boolean setmode,printmode; real array prooffile,objfile,hyphfile,sourcefile(1:2); begin comment scan call parameters; integer sep,no,next,q; real array param(1:2); machine:=4; language:=1; setmode:=false; printmode:=false; hypmode:=4; objzl:=1; hyphzl:=1; proofzl:=1; sourcefile(1):=real<::>; no:=1; sep:=system(4,1,param); if sep=6 shift 12 + 10 then begin comment left side; system(4,0,objfile); setmode:=true; no:=2; objzl:=128 end; for sep:=system(4,no,param) while sep shift (-12) > 3 do begin comment scan one parameter; if sep extract 12 <> 10 then goto paramerror; if param(1)=real<:machi:> add 110 then begin sep:=system(4,no+1,param); if sep=8 shift 12 + 4 then begin machine:=param(1)+3; if machine<4 or machine>5 then goto paramerror; next:=no+2 end else if sep shift (-12) < 6 then goto sourcename else goto paramerror end else if param(1)=real<:proof:> then begin sep:=system(4,no+1,param); if sep=8 shift 12 + 10 then begin printmode:=true; proofzl:=128; prooffile(1):=param(1); prooffile(2):=param(2); next:=no+2 end else if sep shift (-12) < 6 then goto sourcename else goto paramerror end else <* if param(1)=real<:langu:> add 97 then begin sep:=system(4,no+1,param); if sep=8 shift 12 + 10 then begin if param(1)=real<:d:> then language:=1 else if param(1)=real<:e:> then language:=2 else goto paramerror; next:=no+2 end else if sep shift (-12) < 6 then goto sourcename else goto paramerror end else *> if param(1)=real<:hyphe:> add 110 then begin next:=no+1; q:=0; sep:=system(4,no+1,param); if sep=8 shift 12 + 10 then begin if param(1)=real<:c:> then begin q:=q+1; next:=next+1; sep:=system(4,no+2,param) end; if sep=8 shift 12 + 10 then begin q:=q+2; next:=next+1; hyphzl:=128; hyphfile(1):=param(1); hyphfile(2):=param(2); end; hypmode:=case q of(2,3,1); end else if sep shift (-12) < 6 then goto sourcename else goto paramerror end else begin sourcename: if sourcefile(1)<>real<::> then goto paramerror else begin sourcefile(1):=param(1); sourcefile(2):=param(2); next:=no+1; end; end; if system(4,next,param) shift (-12) >=6 then goto paramerror else no:=next end while; if false then paramerror: begin write(out,<:***compose param :>); for sep:=system(4,no,param), system(4,no,param) while sep shift (-12) > 5 do begin write(out,if sep shift (-12) = 8 then <:.:> else <: :>); q:=1; if sep extract 12 = 10 then write(out,string param(increase(q))) else write(out,<<d>,entier(param(1)+0.5)); no:=no+1 end; outchar(out,10); fpproc(7,0,0,3) end; end scan; linelim:=300; wordlim:=75; mtextlim:=300; headlim:=350; notelim:=400; maxnotelim:=6; begin comment inner block; boolean nl,sp,ff,bs,u1,sp1,sp2,sp3,nls,sps,bss,time,toptext, compinit,runhead,finis,headmode,notemode,stop,shiftlead,nstext,hypdigit, saveword,savecode,hyp,spamax,dropjust,figur,newpage,codemode,prognl,back, toppage,shyp,ssaveword,test1,blind,mtext,smtext,ssavecode,startofword,outcon, word,more,line1,first,bool1,bool2,leftspa,lc,uc,test,startofline,progpage, up,esc,etx,eot,innotout; integer typlim,p1mask,p2mask,mode, font,tabcount,newpstd,newpar,linewidth,margin,pagelength, sep,minlead,size,chapstd,chapstart,folip,upperp,textp, sh1,mtfont,sh2,sh3,sc1,sc2,smargin,swidth,lineno,notenumw,stdlead, headp,nump1,pnfont,pagnum,nummode,leading,maxspace,minspace, runfont,normsp,i,j,k,q1,q2,a,b,d,h1,h2,h3,c1,c2,s1,s2,w,tabno, linecount,pc,lin,printmask,codemask,ulinemask,figroom,figsize, fnoteno,fn,rh,rhfont,accuw,censp,savelead,savemode,savemarg, savell,oldfont,notefont,fcount,klass,v,hypno,wid,comno,nlpar, specdel,delin,subleading; real unit,point,snitspace,maxfactor,minfactor,normw,saveminus; boolean array linebuf(1:linelim),codebuf(0:150),swordbuf(0:wordlim), margtext(1:mtextlim),rhead(1:headlim),fnote(1:notelim); integer array pib,pis,tabpar(1:24),comtab(1:30),printbuf,pco(0:24),sstab(1:18), konvert,width,intab(0:127),fnfont(1:maxnotelim),fontcode(1:7); real array ra(1:3); zone c(5,1,stderror),pr(proofzl,1,stderror),set(objzl,1,stderror), hyphinf(hyphzl,1,stderror); procedure testvar; begin boolean k; procedure d(b);value b; boolean b; write(out,<<dd>,if b then 1 else 0,<:,:>); write(out,nl,1,<:test 1 line :>,<<ddd>,lineno,nl,1); k:=false add 44; d(compinit); d(runhead); d(finis); d(headmode); d(notemode); d(shiftlead); d(saveword); d(savecode); d(hyp); d(dropjust); write(out,nl,1); d(figur); d(newpage); d(codemode); d(word); d(more); d(line1); d(first); d(leftspa); d(smtext); d(spamax); write(out,nl,1); write(out,nl,1,<<ddddd>,mode,k,1,font,k,1,newpar,k,1, linewidth,k,1,margin,k,1,size,k,1,leading,k,1,runfont,k,1, w,k,1,tabcount,k,1,nl,1,h1,k,1,h2,k,1,h3,k,1, sh1,k,1,sh2,k,1,sh3,k,1,c1,k,1,c2,k,1,sc1,k,1,sc2,k,1,nl,1, linecount,k,1,pc,k,1,lin,k,1,printmask,k,1, codemask,k,1,ulinemask,k,1,figroom,k,1,fn,k,1,rh,k,1, accuw,k,1,nl,1,censp,k,1,pagnum,k,1,nummode,k,1,lineno,k,1, figsize,k,1,fnoteno,k,1,hypno,k,1,smargin,k,1, swidth,k,1,v,k,1,nl,1,wid,k,1,nl,1); setposition(out,0,0) end testvar; procedure etext; error(<:no EF command:>,2); procedure error(s,a); value a; string s; integer a; comment handling of logical errors not to be found by the input program; begin write(out,nl,1,<:***typol :>,s); where; if a=2 then goto exit else if a=3 then goto eexit; end error; procedure where; write(out,<: page :>,<<ddd>,pagnum,<: line :>,lineno,nl,1); procedure digit(b); value b; boolean b; comment b=true: makes the input table ready for number reading with the terminator comma and current separator, b=false: restores the input table according to current mode; begin integer i; if b then begin for i:=48 step 1 until 57 do intab(i):=2 shift 12+i; intab(44):=7 shift 12+44; intab(32):=32; if hypdigit then begin saveminus:=real<::> add intab(43) shift 24 add intab(45); intab(10):=7 shift 12+10; for i:=43,45 do intab(i):=3 shift 12+i end else intab(sep):=7 shift 12+sep; end else begin for i:=48 step 1 until 57,44 do intab(i):=5 shift 12+i; intab(32):=(if mode=1 then 2 else 5) shift 12+32; if hypdigit then begin for i:=43,45 do intab(i):=saveminus shift (if i=43 then (-24) else 0) extract 24; intab(10):=2 shift 12+10; end else intab(sep):=3 shift 12+sep; end end digit; integer procedure hyph(a,n1,n2,n3,n4); value n1,n2,n3,n4; boolean array a; integer n1,n2,n3,n4; begin integer pnt,i,k,storen1,n,p; integer array class(0:127); integer procedure breakpt (a,n1,n2,n3,n4); boolean array a; integer n1,n2,n3,n4; begin comment procedure hyph is called when a hyphenation of a line is wanted. depending on the value of the global variable hypmode the information is taken either from procedure breakpt or from procedure breakpt and the console or from the backing store. (see description of hypmode). the value of hyph points at the element in array a after which the break should be made. procedure breakpt has the same parameters as procedure hyph and contains an algorithm for finding a natural breakpoint or a hyphenation point. in case that anenglish text is to be processed the corresponding procedure ebreakpt for english hyphenation will be called. the following possibilities are examined in the mentioned sequence: 1. a natural breakpoint i.e. a point after a punktuation character (p.ex.,:) or a natural terminator (p.ex + -)). 2. a pair of consonants which can not be pronounced. 3. a consonant between two vowels 4. two consonants between two vowels. parameters: a a boolean array, each element containing a character of the line to be hyphenated or breaked. composed characters will have the format: <character><1-unit backspaces><character> <1-unit backspaces>....<1-unit spaces> each element contained in one element of a. n1 an integer pointing at an element of the first character of the actual string (word) in a. n2 an integer pointing at an element of the first character after which a break or hyphenation may be made n3 an integer pointing at an element of the last character before which a break or hyphenation may be made. n4 an integer pointing at an element of the last character of the actual string (word). global variables: language an integer denoting the language of the actual text: 1 for danish and 2 for english. linelim. an integer denoting the upper limit of the array a which should be declared a(1:linelim). hypmode an integer selecting the way of furnishing the hyphenation information. hypmode=1 the procedure prints on the console a proposal of hyphenation (made by call of procedure breakpt) which the user can accept by typing + or reject by typing - and the correct position of hyphenation. the hyphenation - information is stored in zone hyphinf. hypmode=2 like hypmode=1 but the information is not stored. hypmode=3 the hyphenation - information is read from zone hypheninf hypmode=4 the hyphenation - information is taken from the procedure breakpt without communication with the user. variables: class an integer array classifying the characters as follow, where the characters are shown by their ISO-values. class 0 0 class 1 (elements for composed characters only) 39,94,95,96,126 class 2 (punctnation characters) 33,44,46,58,59,63 class 3 (natural terminators) 35,36,37,38,41,43,45,60,61,62,64 class 4 (vowels) 65,69,73,79,85,89,91,92,93 97,101,105,111,117,121,123,124,125 class 5 (consonants) class 6 (digits) class 7 34,40,42,47 and 15<=characters<=31 class 8 (backspace) 5,8 class 9 (1-unit space) 1 2,3,4,5,6,7 class 12 spec. backspaces in start of underlined char. 2 pair an integer one dimensional array containing a tabel denoting the pairs of consonants which can be pronaunced together before the vowel in a syllable. the vertical entrance corresponding to the index of pair denotes the left consonant and the horizontal entrance corresponding to the bit number of the elements in pair denote the right consonant. a bit=1 denotes that the pair can be pronounced. bcdefghijklmnopqrstuvwxz b 000100010000010010010000 c 000100110000010000010000 d 000100010000010010011100 e 111111111111111111111111 f 000100010010110010010000 g 000100010010110010010000 h 000100011000010000011100 i 111111111111111111111111 j 000100010000010000010000 k 000100010010110010011100 l 000100010000010000010000 m 000100010000010000010000 n 000100010000010000010000 o 111111111111111111111111 p 000100010000010010010000 q 000100010000010000010000 r 000100010000010000010000 s 000101011111111000111100 t 000100010000010010011100 u 111111111111111111111111 v 000100010000010010010000 w 000100010000010010010000 x 000100010000010000010000 z 000100010000010000010000 i,k,n,p working variables storen1 the unmodified value of n1 which will be stored if hypmod=1 pnt assigned the value of procedure breakpt and modified to the character no. counted from the left slash and read from the console, in hypmode 1 and 2. in hypmode=3 pnt is assigned the value of the stored breakpoint rightn2 pointers pointing in a at the rightmost element of n2 and rightn3 n3 respectively. rightn3add1 pointer pointing in a at the rightmost element of the character to the right of n3 leftn2 pointers pointing in a at the leftmost element of n2 leftn3 and n3 respectively. konr the values of right and left konl character respectively in a pair of consonants. class2 a boolean set true when a class2 or class3 character is met during searching for a natural breakpoint ; integer i,n, rightn2,rightn3,leftn2,leftn3,k,p,rightn3add1,konr,konl,q,r; boolean class2; integer array pair(0:23); integer procedure pack(o1,o2,o3,o4,o5,o6,o7,o8); integer o1,o2,o3,o4,o5,o6,o7,o8; begin comment the parameters which should be octal digits will be packed in pack in succeding groups of 3 bits; integer k,o,i; k:=0; i:=21; for o:=o1,o2,o3,o4,o5,o6,o7,o8 do begin k:=k+o shift i; i:=i-3; end; pack:=k; end pack; comment initialising of tabel of pairs of consonants; pair(0):=pack(0,4,2,0,2,2,2,0); pair(1):=pack(0,4,6,0,2,0,2,0); pair(2):=pack(0,4,2,0,2,2,3,4); pair(3):=pack(7,7,7,7,7,7,7,6); pair(4):=pack(0,4,2,2,6,2,2,0); pair(5):=pack(0,4,2,2,6,2,2,0); pair(6):=pack(0,4,3,0,2,0,3,4); pair(7):=pack(7,7,7,7,7,7,7,6); pair(8):=pack(0,4,2,0,2,0,2,0); pair(9):=pack(0,4,2,2,6,2,3,0); pair(10):=pack(0,4,2,0,2,0,2,0); pair(11):=pack(0,4,2,0,2,0,2,0); pair(12):=pack(0,4,2,0,2,0,2,0); pair(13):=pack(7,7,7,7,7,7,7,6); pair(14):=pack(0,4,2,0,2,2,2,0); pair(15):=pack(0,4,2,0,2,0,2,0); pair(16):=pack(0,4,2,0,2,0,2,0); pair(17):=pack(0,5,3,7,7,0,7,4); pair(18):=pack(0,4,2,0,2,2,3,4); pair(19):=pack(7,7,7,7,7,7,7,6); pair(20):=pack(0,4,2,0,2,2,2,0); pair(21):=pack(0,4,2,0,2,2,2,0); pair(22):=pack(0,4,2,0,2,0,2,0); breakpt:=0; comment natural break a natural break is made after a class 2 or a class 3 character if they are not followed by a class 2 character. the scan is made against left from the rightmost element of n2. ; leftn2:=charleft(n2,a); leftn3:=charleft(n3,a); rightn3:=charright(n3,a); rightn3add1:=charright(rightn3+1,a); rightn2:=charright(n2,a); n4:=charright(n4,a); n1:=charleft(n1,a); comment find punctuation character; i:=leftn2-1; class2:=false; for i:=i+1 while i<=leftn3-1 and -,class2 do begin k:=class(a(i) extract 7); class2:=k=2 or k=3 end; if class2 then begin comment find the last of succeeding punctuation characters if any occur; k:=charright(i-1,a); p:=k+1; for k:=charright(p,a) while class2 and k<=rightn3add1 do begin class2:=false; for i:=p step 1 until k do if class(a(i) extract 7)=2 then class2:=true; n:=p; p:=k+1 end; if n<=leftn3 then begin breakpt:=-(n-1);goto breakend end; end; comment hyphenation foerst soeges en vokal bagfra hvorefter der soeges et konsonantpar. herefter slaas der op i den tosidede tabel pair med de to konsonanter som indgangsvaerdier. den aktuelle bit i pair er 1 hvis konsonanterne kan udtales sammen og ellers 0. er bitten 0 deles ordet det paagaeldende sted. find vokal; k:=charright(n4,a); i:=k +1; vokal: for i:=i-1 while class(a(i) extract 7)<>4 and i>=leftn2 do; if i>leftn2 then begin comment find konsonant; i:=i+1; kons: for i:=i-1 while class(a(i) extract 7)<>5 and i>rightn2 do; nykonl: if i>rightn2 then begin konr:=a(i) extract 7; konr:=konr-(if konr=90 then 67 else if konr=122 then 99 else if konr>90 then 98 else 66); comment konv. til pair-entrance; comment find nabokonsonant; i:=charleft(i,a)-1; k:=charleft(i,a); i:=i+1; for i:=i-1 while class(a(i) extract 7)<>5 and i>=k do; if i<k then begin comment ingen nabokonsonant; i:=i+1; goto kons end; konl:=a(i) extract 7; konl:=konl-(if konl=90 then 67 else if konl=122 then 99 else if konl>90 then 98 else 66); if (pair(konl) shift (konr-23)) extract 1 <>0 then goto nykonl else if i>=leftn3 then begin i:=charleft(i,a); goto vokal end else begin breakpt:=charright(i,a); goto breakend end end comment deling foran konsonant mellem to vokaler. find vokal; i:=charright(rightn3+1,a)+1; vok: for i:=i-1 while i>rightn2 and class(a(i) extract 7)<>4 do; if i>rightn2 then begin comment vokal fundet, find nabokonsonant; n:=p:=charleft(i,a); k:=charleft(p-1,a); for n:=n-1 while n>=k and class(a(n) extract 7)<>5 do; if n<k then begin i:=p; goto vok end; comment konsonant fundet, find nabovokal; p:=charleft(k-1,a); n:=k; if p>=n1 then begin for n:=n-1 while n>=p and class(a(n) extract 7)<>4 do; if n>=p then begin breakpt:=k-1; goto breakend end else begin i:=p; goto vok end end; end; comment deling mellem to vokaler mellem to konsonanter. find vokal; i:=1+(if n4>rightn3 then charright(rightn3+1,a) else rightn3); q:=charright(rightn2+1,a); voc: for i:=i-1 while i>q and class(a(i) extract 7)<>4 do; if i>q then begin comment vokal fundet. find nabokonsonant; n:=p:=charleft(i,a); k:=charleft(p-1,a); for n:=n-1 while n>=k and class(a(n) extract 7)<>5 do; if n<k then begin i:=p; goto voc end; comment konsonant fundet, find ny nabokonsonant; n:=k; p:=charleft(k-1,a); if p>charright(n1,a) then begin for n:=n-1 while n>=p and class(a(n) extract 7)<>5 do; if n<p then begin i:=k; goto voc end; comment konsonant fundet, find nabovokal; n:=p; r:=charleft(p-1,a); for n:=n-1 while n>r and class(a(n) extract 7)<>4 do; if n<r then begin i:=p; goto voc end; comment vokal fundet; breakpt:=k-1; goto breakend end end i>q; end; breakend: end breakpt; integer procedure charright (p,a); value p; integer p; boolean array a; comment the procedure scans towards right to find the rightmost element of a given character in the array a. p is the index pointing in a at an arbitrary element of the actual character; begin integer k, m,q; if p=linelim then begin charright:= linelim; goto fin end; k:=p-1; m:= class(a(p)extract 7); q:=class(a(p+1) extract 7); for k:=k+1 while (q>7 and q<>12) or (m<>9 and m>7) do begin if k=linelim-1 then begin charright:=linelim; goto fin end; m:=q; q:=class(a(k+2) extract 7); end; charright:=k; fin: end charright; procedure outstring(p,q); value p,q; integer p,q; begin integer k; boolean class8; class8:=false; for i:=p step 1 until q do begin k:=class(a(i) extract 7); write(c, if k<8 and (a(i) extract 7<15 or a(i) extract 7>31) then a(i) else if k=7 then false add 42 else if k=8 and -,class8 then false add 8 else false,1); class8:=k=8; end end outstring; integer procedure charleft(p,a); value p; integer p; boolean array a; comment the procedure is similar to charright but looks for the leftmost element of the actual character; begin integer k,m,q; if p=1 then begin charleft:=1; goto fin end; k:=p+1; m:=class(a(p) extract 7); q:=class(a(p-1) extract 7); for k:=k - 1 while (m>7 and m<>12) or q=8 or q=12 do begin if k=2 then begin charleft:=1; goto fin end; m:=q; q:=class(a(k-2) extract 7); end; charleft:=k; fin: end charleft; <* integer procedure ebreakpt(A,n1,n2,n3,n4) ; value n1,n2,n3,n4 ; boolean array A ; integer n1,n2,n3,n4 ; begin integer array class(0:127) , B(1:29) ,word,posn(0:n4-n1+2); integer i,j,k,l,m,a,b,c,d ,m1,m2,m3,m4,class2,bs,fs ; boolean init,dsmk ,composite,charset,newm2,newm3 ; comment set up arrays and constants ; for i := 0 step 1 until 127 do class(i) := case i + 1 of (3,7,7,7,7,7,7,7, 3,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, 7,8,3,3,3,9,9,3, 3,8,9,3,8,6,5,3, 4,4,4,4,4,4,4,4, 4,4,8,8,9,9,9,8, 9,1,2,2,2,1,2,2, 2,1,2,2,2,2,2,1, 2,2,2,2,2,1,2,2, 2,1,2,1,1,1,9,9, 9,1,2,2,2,1,2,2, 2,1,2,2,2,2,2,1, 2,2,2,2,2,1,2,2, 2,1,2,1,1,1,9,3 ) ; for i := 1 step 1 until 29 do B(i) := case i of (9,8,6,8,9,8,6,1,9,5, 5,5,4,3,10,6,5,2,7,6, 9,5,6,5,9,5,9,9,9 ) ; ebreakpt := 0 ; m1 := 1 ; m2 := n2-n1+1 ; m3 := n3-n1+1 ; m4 := n4-n1+1 ; word(0) := word(m4+1) := 0 ; bs := 8 ; composite := false ; fs := 5 ; comment check for composite chars ; for i := 1 step 1 until m4 do begin word(i) := A(n1+i-1) extract 7 ; posn(i) := n1+i-1 ; if word(i) = bs or word(i) = fs then composite := true ; end ; if composite then begin comment word tidy-remove composites ; j := 0 ; for i := 1,i+1 while j<m4 do begin class2 := 0 ; charset := false ; ABOVE: for j := j+1 while word(j)=bs do ; if word(j)=39 or (word(j)>93 and word(j)<97) or word(j)=126 then begin comment class 1 ; if -, charset then goto INSERT end else begin comment class2 ; class2 := class2+1 ; INSERT: word(i) := word(j) ; charset := true end ; if word(j+1)=bs then goto ABOVE ; for j := j+1 while word(j)=fs do ; if class2>1 then goto OUT ; comment no ebreakpt can be found ; j := j-1 ;posn(i) := n1+j-1 ; comment posn of last char in composite ; end dealing with one composite posn ; m4 := i-1 ; newm2 := newm3 := true ; for i := 1 step 1 until m4 do begin if newm2 then begin if posn(i)>=n2 then begin m2 := i ;newm2 := false end ; end else if newm3 then begin if posn(i)>=n3 then begin m3 := i ; newm3 := false end ; end ; end find new m2,m3 ; end word tidy ; comment look for natural break ; for i := m3-1 step -1 until m2 do begin j := case class(word(i)) of (1,1,1,1,1,2,3,4,4 ) ; k := case class(word(i+1)) of (1,1,1,2,3,1,1,3,1); l := case(j-1)*3+k of (1,1,1,2,1,2,2,2,2,2,2,1) ; if l = 2 then begin ebreakpt := -posn(i) ; goto OUT end natural breakpoint found ; comment table used for case statement : i+1 other digit punctuation i alphanum. 1 1 1 hyphen,minus 2 1 2 non-printing 2 2 2 non-alphan. 2 2 1 ; end ; comment natural break not found,find start and end characters of word ; for i := m2+1,i-1 while i>m1 and class(word(i-1))<6 do ; a := i ; comment first of word ; for i := m2-1,i+1 while i<m4 and class(word(i+1))<6 do ; b:= i ; comment last of word ; comment search valid last vowel in word ; init := true ; for i := b step -1 until m2+1 do begin j := class(word(i)) ; if j>3 then j := 3 ; k := word(i) mod 32 ; case j of begin comment 1 vowel ; begin if k<>5 or (-, init and -, dsmk) then goto VFOUND ; init := dsmk := false end ; comment 2 consonant ; begin dsmk := if init and (k=4 or k=19) then true else false ; init := false ; end; comment 3 other,no action ; ; end of case statement ; end of loop ; comment no vowel found ; goto OUT ; VFOUND: c := if i>m3 then m3 else i ; comment find consonant to start new line ; for i := c step -1 until m2+1 do if class(word(i)) = 2 then begin comment consonant found ; j := word(i) mod 32 ; k := B(j) ; l := if class(word(i-1))>2 then 5 else B(word(i-1) mod 32 ) ; if k>4 or l<6 then goto BELOW ; m := case(l-6)*4+k of (1,1,2,2,1,2,2,2,2,1,2,2,2,1,1,2,2,1,1,1) ; comment table used in case statement : i 1,h 2,r 3,n 4,m i-1 6,invalid with r,h 1 1 2 2 7,------------ h 1 2 2 2 8,------------ r 2 1 2 2 9, vowels - o 2 1 1 2 10, o 2 1 1 1 5 is class of other characters ; case m of begin comment 1 no action ; ; comment 2 test for double consonant ; BELOW: if class(word(i+1))<>2 or j <> word(i+1) mod 32 then goto CFOUND ; end of case statement ; end of consonant check ; goto OUT ; comment no break point ; comment look for vowel before break ; CFOUND: d := i ; for i := a step 1 until d-1 do if class(word(i))=1 then begin ebreakpt := -posn(d-1) ; if class(word(d-1))<3 then ebreakpt := posn(d-1) ; goto OUT end ; OUT: end of ebreakpt procedure ; *> for n:=3 step 1 until 14 do class(n):=11; class(1):=9; class(2):=12; class(5):=class(8):=8; class(0):=0; for n:=15 step 1 until 31 do class(n):=7; n:=32; for i:=11,2,7, 3,3,3,3,1, 7,3,7,3,2, 3,2,7,6,6, 6,6,6,6,6, 6,6,6,2,2, 3,3,3,2,3 do begin class (n):=i; n:=n+1 end; for n:=65 step 1 until 127 do class(n):=5; for i:= 65,69,73,79,85,89,91,92,93 do class(i):= class(i+32):=4; class(94):= class(95):= class (126):=1; class(127):=10; storen1:=n1; n:=case hypmode of (1,1,2,3); digit(true); case n of begin begin comment hypmode=1 or 2 i. e. hyph.-information read on-line; pnt:=<*if language=2 then ebreakpt(a,n1,n2,n3,n4) else *> breakpt(a,n1,n2,n3,n4); n2:=charleft(n2,a); n3:=charleft(n3,a); n:=if pnt=0 then n3-1 else abs(pnt); write(c,<:<10>:>); outstring(n1,n2-1); write(c,<:/:>); outstring(n2,n); if pnt<>0 then begin if pnt>0 then write(c,<:-:>); write(c,<:<10>:>); end; outstring(n+1,n3-1); write(c,<:/:>); outstring(n3,n4); if pnt<>0 then begin write(c,<:<10>+/-: :>); setposition(c,0,0); for i:=readchar(c,k) while -,(k=43 or k=45) do; setposition(c,0,0); end else k:=45; if k=43 then p:=hyph:=pnt else begin posagain: setposition(c,0,0); write(c,<: position: :>); setposition(c,0,0); read(c,pnt); repeatchar(c); readchar(c,k); if k<>10 or pnt>=n3 then goto posagain; setposition(c,0,0); if pnt=0 then hyph:=0 else begin k:=abs(pnt); p:=n2-1; for i:=1 step 1 until k do p:=charright(p+1,a); if p<n2 or p>=n3 then begin write(c,<: position outside limits.:>); goto posagain end; p:=hyph:=sign(pnt)*p; end; end; if hypmode=1 then write(hyphinf,<<ddd>,storen1,<:,:>,p,<: :>); end hypmode=1 or 2; begin comment hypmode=3, hyphenation information read from zone hyphinf where it has been stored in a preceeding run; read(hyphinf,storen1,pnt); if n1=storen1 then hyph:=pnt else error(<:hyph. file not correct:>,2) end hypmode=3; begin comment hypmode=4 , hyphenation-information taken from procedure breakpt only; hyph:=breakpt(a,n1,n2,n3,n4); end end case; digit(false); end procedure hyph; integer procedure typol; comment reads and executes a command or numerical name from the source file. Jumps to labels outside the procedure are done if one of the following commands is met: RJ,SJ,TA,CT,QR. typol is assigned the values: 1 - NL,NS 2 - NP 3 - PS,EF 4 - FG 5 - FN 6 - any other command; begin integer p1,p2,com,q1,q2; integer array par(1:24); q1:=32; for i:=i while q1=32 do readchar(in,q1); if q1>47 & q1<58 then begin comment numerical names generated by the input program; comno:=0; for i:=i while q1<>sep do readchar(in,q1); goto outtyp end; q2:=32; for i:=i while q2=32 do readchar(in,q2); if q1<97 then q1:=q1+32; if q2<97 then q2:=q2+32; com:=q1 shift 8 add q2; i:=0; for i:=i+1 while comtab(i)<>com & i<typlim+1 do; if i=typlim+1 then begin comment illegal command; write(out,nl,1,false add q1,1,false add q2,1,sp,1); error(<:unknown command:>,2) end; comno:=i; comment initialize parameters; digit(true); p1:=par(1):=par(2):=-1; if comno=19 then begin comment pl; par(1):=297; par(2):=30; par(3):=235; par(4):=18; par(5):=10; end; if p1mask shift comno<0 then read(in,p1) else if p2mask shift comno<0 then begin comment command with one optional or with more than one parameter; i:=0; for i:=i+1 while scan(par(1)) do read(in,par(i)); if comno=6 then tabno:=i-1; end; if comno=27 then read(in,p1); if comno=12 then read(in,p2); if comno=24 or comno=16 or comno=26 then begin comment SE and SB; p1:=32; for i:=i while p1=32 do readchar(in,p1); if comno=16 then begin comment SB; if p1<49 and p1>57 then read(in,p2) else begin comment digit first char after SB; readchar(in,q1); if q1=44 then begin comment terminator, eq. 2 parameters; read(in,p2) end else begin comment only one parameter; if q1=sep then begin comment 1 digit; p2:=p1-48; p1:=0 end else if q1>47 and q1<58 then begin comment parameter contains 2 digits; p2:=10+q1-48; p1:=0; readchar(in,q1) end else error(<:SB invalide data:>,2); end only 1 parameter end digit first; if p2> (case machine of(13,12,8,6,8)) then error(<:SB invalide data:>,1); end SB; end; if comno<>10 & comno<>12 & comno<>15 & comno<>22 & comno<>23 then begin comment not FN,RH MT or CM; repeatchar(in); readchar(in,q2); if q2<>sep then begin comment read until separator met; for i:=i while q2<>sep do readchar(in,q2); end; end; if comno=18 then comno:=17; comment proces QR like CT; digit(false); case comno of begin begin comment NL,1; nlpar:=if par(1)>-1 then par(1) else 1; if prognl then begin prognl:=false; nlpar:=nlpar-1 end; q1:=(pagelength-linecount)/leading; if q1<1 then q1:=1; if nlpar>q1 then nlpar:=q1+1; if toptext and w=0 then nlpar:=0; dropjust:=true end; begin comment RJ,2; if mode>3 then calcensp; if mode=1 then goto outtyp; mode:=1; setclass(true); goto if startofline then just else outnonjust end; begin comment SJ,3; if mode>3 then calcensp; if mode=2 then goto outtyp; q1:=mode; mode:=2; setclass(false); if startofline then goto nonjust else begin if q1=1 then begin dropjust:=true; goto linejust end else goto outnonjust end; end; begin comment FT,4; font:=p1; codebuf(pc):=false add fontcode(p1); justpc(1); if machine=2 then begin genstop(true); if printmode then printfont(font shift 2); end else if printmode then printfont(1) end; begin comment NP,5; newpar:=if par(1)>-1 then par(1)/unit else newpstd; if prognl then begin prognl:=false; nlpar:=0 end; if toptext and w=0 then nlpar:=0; dropjust:=true end; begin comment TA,6; if mode>3 then calcensp; q1:=mode; mode:=3; setclass(false); if machine=1 then intab(32):=5 shift 12+6; for i:=1 step 1 until tabno do tabpar(i):=par(i)/unit; for i:=tabno+1 step 1 until 24 do tabpar(i):=0; if startofline then goto tabul else begin if q1=1 then begin dropjust:=true; goto linejust end else goto outnonjust end; end; begin comment LM,7; q1:=p1/unit; q2:=linewidth-q1+margin; if q2<0 then error(<:left margin:>,2); if startofline and -,mtext then begin linewidth:=q2; margin:=q1 end else smargin:=q1 end; begin comment LW,8; q1:=p1/unit; if startofline then begin linewidth:=q1-margin; if linewidth<0 then error(<:left margin:>,2) end else swidth:=q1 end; begin comment FG,9; q1:=p1/point; if pagelength-linecount>=q1 & figur then begin comment room for figure on actual page; q2:=q1/leading; comment no of NL; if startofline then outnl(if prognl then q2-2 else q2-1) else figsize:=q2-1; dropjust:=true; prognl:=false; end else begin comment not room for figur on actual page, save information; figroom:=figroom+q1; figur:=false end end; begin comment FN,10; fnoteno:=fnoteno+1; fnfont(fnoteno):=p1; q1:=0; q2:=fn; fn:=fn-1; fn1:for fn:=fn+1 while q1<>sep do begin comment save note in array fnote; if fn>notelim then error(<:char. in footnotes:>,2); readchar(in,q1); fnote(fn):=false add q1 end; if skipnum(fnote,fn,q1) then goto fn1; k:=linecount; linecount:=linecount+(entier((fn-q2)*normw/ (linewidth+margin-notenumw))+1) *minlead; if fnoteno>1 ! linecount-k>minlead then shiftlead:=true; linecount:=linecount+leading; comment estimated calculation of linespace for the note; w:=w+1; comment place mark in text; linebuf(lin):=false add (fnoteno+48); linebuf(lin+1):=false add 41; pib(w):=lin; pis(w):=lin+1; lin:=lin+2; startofline:=prognl:=false; accuw:=accuw+width(49)+width(41) end; begin comment SC,11; genstop(true) end; begin comment NS,12; mtfont:=p1; nlpar:=p2; q1:=i:=0; for i:=i+1 while q1<>sep do begin comment save new section text in margtext; if i>mtextlim then error(<:char. in new section text:>,2); readchar(in,q1); if q1=8 then begin backspace(margtext,i,false); i:=i-1 end else begin if q1>127 then delim(q1); margtext(i):=false add q1 end; end; margtext(i-1):=false; nstext:=true; if prognl then begin prognl:=false; nlpar:=nlpar-1; end; if pagelength-linecount-nlpar*leading<2*leading then begin newpage:=true; chapstart:=upperp; end; if toptext and w=0 then nlpar:=0; dropjust:=true; end; begin comment TS,13; size:=p1; printfont(1); comment do something if nescesary; end; begin comment PS,14; q2:=if par(2)>-1 then (pagelength-linecount)-par(2)/point else -1; if q2<0 then begin chapstart:=if par(1)>-1 then par(1)/point else chapstd; if toppage then comno:=0 else newpage:=dropjust:=true; end else comno:=0; end; begin comment RH,15; if par(1)>-1 then begin i:=0; q1:=0; rh1:for i:=i+1 while q1<>sep do begin comment save head in array rhead; if i>headlim then error(<:char. in running head:>,2); readchar(in,q1); rhead(i):=false add q1 end; if skipnum(rhead,i,q1) then goto rh1; runhead:=true; pnfont:=rhfont:=par(1) end else runhead:=false end; begin comment SB,16; q2:=sstab(p2); if q2<>0 then begin comment SS in use, restore class and value for old <char.>; q1:=q2 extract 7; comment value; intab(q1):= if q1=45 then (if mode=1 then 6 else 5) shift 12+45 else if q1=95 then (if mode=1 then 4 else 5) shift 12+95 else q2; end; if p1>32 or p1=0 then begin comment <char.> present and not used as SS or no <char.>; sstab(p2):=if p1>32 then intab(p1) else 0; if p1>32 then intab(p1):=5 shift 12+p2+14; end else if p1>14 then begin comment <char.> present and in use as SS; sstab(p2):=sstab(p1-14); sstab(p1-14):=0; intab(sstab(p2)extract 7):=5 shift 12+p2 +14; end else error(<:SB invalide data:>,2) end; begin comment CT and QR,17 and 18; if mode=3 and machine=1 then intab(32):=5 shift 12+32; q1:=mode; mode:=if com extract 7=116 then 4 else 5; if q1=mode then goto outtyp; setclass(false); if startofline then goto (if mode=4 then center else centrh) else begin if q1=1 then begin dropjust:=true; goto linejust end else goto outnonjust end; end;; begin comment PL,19; folip:=par(1)/point; upperp:=par(2)/point; textp:=par(3)/point; headp:=par(4)/point; nump1:=par(5)/point; pagelength:=upperp+textp end; begin comment PN,20; nummode:=par(1); pagnum:=par(2) end; begin comment LD,21; leading:=p1; if machine=1 then begin genstop(true); if printmode then printfont(2); if setmode then begin write(out,nl,1,<:///leading_:>,<<dd>,p1); where; end; end else if machine=5 then begin leading:=(leading//3)*3; codebuf(pc):=esc; codebuf(pc+1):=false add 30; codebuf(pc+2):=false add (entier(leading*2/3)+1); justpc(3) end; end; begin comment MT,22; if smtext then error(<:double margin text:>,2); mtfont:=p1; q1:=i:=0; for i:=i+1 while q1<>sep do begin comment save margin text in array margtext; if i>mtextlim then error(<:char. in margin text:>,2); readchar(in,q1); if q1=8 then begin backspace(margtext,i,false); i:=i-1 end else begin if q1>127 then delim(q1); margtext(i):=false add q1 end end; margtext(i-1):=false; if startofline and -,mtext then begin setmtext; toptext:=false end else if startofline and mtext then error(<:double margin text:>,2) else smtext:=true; end; begin comment CM,23; cm1:q1:=0; for i:=i while q1<>sep do begin q2:=q1; readchar(in,q1) end; if skipnum(rhead,-1,q2) then goto cm1 end; begin comment SE,24; intab(sep):=5 shift 12+sep; intab(p1):=3 shift 12+p1; sep:=p1 end; begin comment EF,25; finis:=dropjust:=true end; begin comment DD,26; intab(specdel):=delin; if p1<>sep then begin delin:=intab(p1); intab(p1):=5 shift 12 + 128; specdel:=p1 end else specdel:=delin:=0 end; begin comment SL,27; subleading:=(p1//3)*3 end end case comno; outtyp: typol:=if comno=1 ! comno=12 then 1 else if comno=5 then 2 else if comno=14 ! comno=25 then 3 else if comno=9 & figur then 4 else if comno=10 then 5 else 6; end typol; \f boolean procedure skipnum(tex,p,q1); integer p,q1; boolean array tex; comment used to decide if a end separator or start of numerical name is met when storing (skipping) the <string> parameter in the commands FN,RH and CM. A numerical name is recognized if the separator is placed between a new line character and a digit. This is not a 100 pct. correct solution. skipnum=true : num. name, skip until term. separator and adjust p. skipnum=false : end separator, signify end string in array tex. p=-1 denotes a CM command, p=-2 denotes call from main routine; begin integer pre; pre:=if p=-1 then q1 else if p=-2 then 10 else if p<3 then 0 else tex(p-2) extract 7; readchar(in,q1); if q1>47 and q1<58 and pre=10 then begin for i:=i while q1<>sep do readchar(in,q1); q1:=0; if p>-1 then p:=p-2; skipnum:=true end else begin repeatchar(in); if p>-1 then tex(p-1):=false; skipnum:=false end end skipnum; procedure printfont(t); value t; integer t; comment places indication of shift of font or leading in printbuf and mark in printmask; begin integer q1,q2; if w>23 then error(<:number of words in line:>,2); q1:=printbuf(w) shift (-12); q2:=if q1>0 & printmask shift w<0 then (if machine=2 then q1 extract 2+t else (if q1<>t then 3 else q1)) else t; printbuf(w):=if printmask shift w<0 then q2 shift 12 +printbuf(w) extract 12 else q2 shift 12; if printmask shift w>=0 then printmask:=printmask+1 shift (23-w) end printfont; procedure printproc(t); value t; integer t; comment prints information contained in printbuf(t); begin write(pr,sp,t extract 12); if machine=2 and t shift (-14) > 0 then begin write(pr,<:<60>:>,<<d>,t shift (-14),<:<62>:>); t:=(t shift (-12) extract 2) shift 12 end; if t shift (-12)>0 then write(pr,false add 42,t shift (-12),<:):>) end printproc; procedure placenum(numcode); value numcode; integer numcode; comment write pagenumber according to the parameter numcode former given in PN-command; begin integer line,numw,dignum,s,m; boolean left; if numcode=0 then goto fin; dignum:=if pagnum<10 then 1 else if pagnum<100 then 2 else 3; s:=case dignum of (real<<d>,real<<dd>,real<<ddd>); left:=pagnum mod 2=0; m:=numcode; line:=margin + linewidth; numw:=dignum * width(49); q1:= if m=1!m=2 then (line-numw)//2 else if (m=5!m=4&-,left)&-,runhead!m=3&-,left then line-numw else if (m=5!m=4&-,left)&runhead then margin+linewidth-accuw-censp-numw else 0; if q1>0 then outspace(q1,false,-2); outnum(pagnum,dignum,s); if m=4&left&runhead then censp:=(line-accuw)//2-numw; fin: end placenum; procedure outnum(p,d,s);value p,d,s;integer p,d; real s; comment outputs the pagenumber p with d digits, lagout s and font pnfont; begin integer q1, q2; if pnfont<>runfont then outfont(pnfont); if printmode then write(pr,string s,p); if setmode then begin q1:=p//100; q2:=p mod 100//10; q1:=if q1>0 then q1+48 else 0; q2:=if d>1 then q2+48 else 0; if up then begin write(set,lc,1); up:=false end; write(set,false add konvert(q1),1,false add konvert(q2),1, false add konvert(p mod 10+48),1); end; if pnfont<>font then outfont(font); end outnum; procedure backspace(buf,p,norm); value norm; boolean norm; integer p; boolean array buf; comment processes a composite character: <char1><BS><char2> or <char1><bs><char2><bs><char3>. p-1 points in buf on char1. norm is false when called from proc. typol. The widest character is placed first. If the composite character contain an underline or a overline a common right edge is establiched in case of end of word else a common left edge; begin integer q1,q2,q3,we,c1,c2,c3,wc1,wc2,wc3; boolean wordend,three,underover; boolean procedure readq(tex,t); integer t; boolean array tex; comment; begin qread(tex,t,c2); qread(tex,t,we); if we=8 then begin comment 3-double composite char.; qread(tex,t,c3); qread(tex,t,we); readq:=true end else begin comment 2-double composite char.; c3:=0; readq:=false end; t:=t-1 end readq; procedure max(c1,c2,c3); integer c1,c2,c3; comment max changes possible the positions of the call characters so the widest is placed first and so on; begin integer i,w1,w2,w3,s1,s2,s3; integer array pos(1:3); for i:=1,2,3 do pos(i):=i; w1:=width(c1); w2:=width(c2); w3:=width(c3); if w1<w2 then begin pos(1):=2; if w2<w3 then begin pos(1):=3; pos(3):=1 end else if w3>w1 then begin pos(2):=3; pos(3):=1 end else pos(2):=1 end else if w2<w3 then begin pos(2):=3; pos(3):=2 end; s1:=c1; s2:=c2; s3:=c3; c1:=case pos(1) of (s1,s2,s3); c2:=case pos(2) of (s1,s2,s3); c3:=case pos(3) of (s1,s2,s3) end max; if p>linelim-5 or p>mtextlim-5 then error(<:char. in line:>,2); c1:=buf(p-1) extract 7; p:=p-1; if norm then accuw:=accuw-width(c1); if headmode then three:=readq(rhead,rh) else if notemode then three:=readq(fnote,fn) else begin readchar(in,c2); readchar(in,we); if we=8 then begin comment 3-double composite char.; readchar(in,c3); readchar(in,we); three:=true end else begin comment 2-double composite char.; c3:=0; three:=false end; repeatchar(in) end; if we=8 then error(<:to much composite char.:>,2); wordend:=if we=9 or we=10 or we=12 or we=32 or we=sep then true else false; comment place the widest char. in c1 and the width in wc1; max(c1,c2,c3); wc1:=width(c1); wc2:=width(c2); wc3:=width(c3); if machine=5 then wc1:=wc2:=wc3:=1; comment diablo; if c2=95 or c2=126 then begin comment a under- or overline must be first char.; q1:=c1; q2:=wc1; c1:=c2; wc1:=wc2; c2:=q1; wc2:=q2; end; underover:=if c1=95 or c1=126 then true else false; if wordend and underover then begin comment terminated an under- or overlined word in a nice way; for q1:=p step 1 until p+wc1-wc2-1 do buf(q1):=false add 2; comment iso 2 is used to signify preceding bss used by the hyph. routine; p:=p+wc1-wc2; end; buf(p):=false add c1; p:=p+1; for q1:=p step 1 until p+(if wordend and underover then wc2 else wc1) -1 do buf(q1):=bs; p:=p+(if wordend then wc2 else wc1); buf(p):=false add c2; p:=p+1; if three then begin for q1:=p step 1 until p+wc2-1 do buf(q1):=bs; p:=p+wc2; buf(p):=false add c3; p:=p+1 end; if underover then begin if three then begin for q1:=p step 1 until p+wc2-wc3-1 do buf(q1):=u1; p:=p+wc2-wc3 end; if norm then accuw:=accuw+width(c2); end else begin for q1:=p step 1 until p+wc1-(if three then wc3 else wc2)-1 do buf(q1):=u1; p:=p+wc1-(if three then wc3 else wc2); if norm then accuw:=accuw+width(c1) end; back:=true; end backspace; boolean procedure scan(p1); value p1; integer p1; comment character reading via the zone text until a digit or separator is met, meeting a komma or <NL> the variabel, i, is increased by 1, terminating on a digit the logical pointer is placed just before the digit, scan=true: digit or minus met scan=false: separator met; begin integer s; repeatchar(in); readchar(in,s); if comno=15 & p1<>-1 ! s=sep then begin scan:=false; goto ud end; rep: readchar(in,s); if s>47 & s<58 ! s=45 then repeatchar(in) else if s=sep then begin scan:=false; goto ud end else begin if s=44 then i:=i+1; goto rep end; scan:=true; ud: end scan; integer procedure hypcall(wid); integer wid; comment generates a call of the hyphenation routine hyph and takes care of placing a eventual hyphen in linebuf, if hyphenation is successfull wid is assigned the length in units from the breakpoint to the end of word; begin integer n1,n2,n3,n4,a,b,i,q1; n1:=pib(w); n4:=pis(w); linebuf(n4+1):=false; a:=accuw+(w-1)*maxspace - linewidth + width(45); b:=accuw+(w-1)*minspace - linewidth + width(45); i:=pis(w)+1; q1:=0; for i:=i-1 while q1<=a do q1:= q1+width(linebuf(i) extract 7); n2:=i+1; if n2<n1 then n2:=n1; i:=pis(w)+1; q1:=0; for i:=i-1 while q1<b do q1:=q1 + width(linebuf(i) extract 7); n3:=i+1; if n3<n1 then n3:=n1; if hypmode<3 then setposition(c,0,0); hypcall:=q1:=hyph(linebuf,n1,n2,n3,n4); if hypmode<3 then setposition(c,0,0); if q1<>0 then begin comment calculate wid; q1:=abs q1+1; wid:=0; for i:=q1 step 1 until pis(w) do wid:=wid + width(linebuf(i) extract 7) end else wid:=0 end hypcall; procedure genstop(m); value m; boolean m; comment m=true: place a stopcode in codebuf m=false : output a stopcode if setmode; begin if m then begin codebuf(pc):=stop; justpc(1) end else if setmode then begin if up then write(set,lc,1); up:=false; write(set,stop,1) end end; procedure justpc(t); value t; integer t; comment adjust pc and pco after putting t characters in codebuf; begin if w>23 then error(<:number of words in line:>,2); pc:=pc+t; pco(w):=if codemode then pco(w)+t else t; if -,codemode then begin codemask:=codemask+1 shift (23-w); codemode:=true end end just pc; procedure outspace(un,m,p); value un,m,p; integer un,p; boolean m; comment shares un units in a minimum number of space characters, if m=true the characters are placed in codebuf (printbuf), if m=false the characters are outputted via the zone set(pr), if p>-1 & ulinemask shift p<0 the spaces are underlined (only set.mach.), if p=-1 only output for setting machine if setmode, if p=-2 output for setting machine and printer; begin integer i,a1,a2,a3,q1; boolean b; if un<=0 then goto esp; if setmode then begin q1:=if machine>1 then (if machine=5 then 3 else 2) else 1; case q1 of begin begin comment justotext 70; if p>-1 & ulinemask shift p<0 then begin comment output underlined space; q1:=width(95); write(set,uc,1,false add 40,un//q1+1,lc,1,bss,q1-un mod q1) end else begin comment normal space; a3:=un//3; q1:=un mod 3; a2:=if q1=2 then 1 else 0; a1:=if q1=1 then 1 else 0; if a2>0 then begin if m then codebuf(pc):=sp2 else write(set,sp2,1) end else if a1>0 then begin if m then codebuf(pc):=sp1 else write(set,sp1,1) end; if m then q1:=if a1>0 ! a2>0 then pc+1 else pc; if a3>0 then begin if m then begin codebuf(q1):=uc; codebuf(q1+a3+1):=lc; for i:=q1+1 step 1 until q1+a3 do codebuf(i):=sp3 end else write(set,uc,1,sp3,a3,lc,1) end; if m then justpc(a1+a2+(if a3>0 then a3+2 else 0)) end end; begin comment Flexowriter; if p>-1 & ulinemask shift p<0 then begin if up then begin write(set,lc,1); up:=false end; b:=machine=2 and runfont=1; q1:=konvert(95); for i:=1 step 1 until un do write(set,false add q1,1,if b then sps else false,1) end else if m then begin for i:=pc step 1 until pc+un-1 do codebuf (i):=sps; justpc(un) end else write(set,sps,un) end; begin comment diablo; if p>-1 and ulinemask shift p<0 then begin a1:=un//normsp; a2:=un mod normsp; write(set,false add 95,a1); if a2>0 then write(set,false add 95,1,esc,1,etx,1, bss,normsp-a2,esc,1,eot,1) end else begin a1:=un//normsp; a2:=un mod normsp; if a2>0 then begin if m then begin codebuf(pc):=codebuf(pc+4):=esc; codebuf(pc+1):=codebuf(pc+5):=false add 31; codebuf(pc+3):=sps; codebuf(pc+6):=false add 13; codebuf(pc+2):=false add (a2*2+1) end else write(set,<:<27><31>:>,false add (a2*2+1),1,<: <27><31><13>:>); end; if m then q1:=if a2>0 then pc+7 else pc; if a1>0 then begin if m then begin for i:=q1 step 1 until q1+a1-1 do codebuf(i):=sps end else write(set,sps,a1) end; if m then justpc(a1+(if a2>0 then 7 else 0)) end end end case; end setmode; if p=-2 & printmode then begin comment output for printer; q1:=un/normw; q1:=if q1=0 then 1 else q1; if m then begin printbuf(w):=if printmask shift w<0 then printbuf(w)+q1 else q1; if printmask shift w>=0 then printmask:=printmask+1 shift (23-w) end else write(pr,sp,q1) end ;esp: end outspace; procedure outfont(f); value f; integer f; comment generates output via zone set according to font no. f; begin if setmode then begin if machine=2 then begin <* change(f); *> write(set,stop,1) end else write(set,false add fontcode(f),1) end; runfont:=f; if printmode then begin if machine=2 then write(pr,<:<60>:>,<<d>,f,<:<62>:>) else write(pr,<:*):>) end end outfont; <* procedure change(fo); value fo; integer fo; begin integer i,p; write(out,nl,1,<:///font :>,<<d>,fo); where; if fo=1 then begin for i:=1 step 1 until 10 do begin p:=case i of(40,41,44,46,48,52,53,55,56,57); konvert(p):=case i of (8+a,25+a,59,107,32,4,21,7,8,25) end; for i:=1 step 1 until 29 do begin p:=case i of (97,98,115,100,117,118,103,104,121,81,82,67,84,69, 70,87,88,73,50,35,52,37,38,55,56,41,112,91,13); konvert(64+i):=p+a; konvert(96+i):=p; konvert(34):=130 end; end fo=1 else if fo>1 and runfont=1 then begin for i:=1 step 1 until 10 do begin p:=case i of(40,41,44,46,48,52,53,55,56,57); konvert(p):=case i of (7+a,14+a,103,82,25,8,4,21,7,14) end; for i:=1 step 1 until 29 do begin p:=case i of (87,59,55,37,52,115,97,41,70, 112,38,56,81,50,88,100,118,69,73,13,35, 67,91,49,121,32,84,98,104); konvert(64+i):=p+a; konvert(96+i):=p end; konvert(34):=2+a end bogstav og tal; for i:=1 step 1 until 12 do begin p:=case i of(35,36,37,38,39,43,45,47,58,63,95,126); konvert(p):= if fo=1 then (case i of (130,130,130,32+a,59+a,64+a, 64,19+a,107+a,130,14,130)) else if fo=5 then (case i of (130,130,4+a,22+a,21+a, 117+a,64,107,19+a,107+a,25+a,130)) else if fo=7 then (case i of (21+a,4+a,130,64+a,103+a,19+a, 107,25+a,82+a,8+a,107+a,130)) else case i of (21+a,1+a,19+a,22+a,103+a,64+a,107,25+a, 82+a,8+a,107+a,64) end; for i:=1 step 1 until 10 do begin p:=case i of(33,42,49,59,60,61,62,64,94,96); konvert(p):=case i of ( (case fo of (1+a,130,130,130,1+a,130,64)), (case fo of (2+a,130,117+a,130,8+a,130,130)), (case fo of (1,56,1,1,1,56,1)), (case fo of (21+a,130,130,130,117,130,117)), (case fo of (49,130,130,130,103+a,130,117+a)), (case fo of (4+a,1,117,4+a,64+a,1,1+a)), (case fo of (49+a,130 ,130,130,82+a,130,130)), (case fo of (130,4+a,4+a,130,130,4+a,130)), (case fo of (130,117,130,117,130,117,117)), (case fo of (130,117+a,130,117+a,130,117+a,130))) end end change; *> procedure outtext(s); string s; begin write(out,nl,1,s); if outcon then setposition(out,0,0) end outtext; procedure settext(p); value p; integer p; comment outputs a textunit placed in linebuf(pib(p):pis(p)) via zone set konverted to the actual typesetting code; begin integer i,v,u,q1,q2,t,lf,u1; for i:=pib(p) step 1 until pis(p) do begin u:=linebuf(i) extract 12; if u>127 then begin u1:=u shift (-7); u:=u extract 7 end else u1:=0; if blind then begin if u<>32 then blind:=false end; v:=konvert(u); if machine=2 and v>128 then begin write(out,nl,1,<:***char :>,<<d>,u); where; v:=11 end; comment only if different char. in the 2 fonts; q1:=if v shift 1 < 0 then (if v shift 2<0 then 2 else 1) else 0; if q1>0 & runfont<>q1 then write(set,stop,1); lf:=2*entier(subleading*2/3)+1; if u1>0 and machine=5 then write(set,esc,1,false add 30,1,false add lf,1, esc,1,false add (if u1=1 then 68 else 85),1); if u=30 and machine=5 then begin t:=linecount-subleading; if t>=0 then begin linecount:=t; write(set,esc,1,false add 30,1,false add lf,1, esc,1,false add 68,1,esc,1,false add 30,1, false add (entier(leading*2/3)+1),1) end end else if u=31 and machine=5 then begin t:=linecount+subleading; if t<=pagelength or notemode then begin linecount:=t; write(set,esc,1,false add 30,1,false add lf,1, esc,1,false add 85,1, esc,1,false add 30,1,false add (entier(leading*2/3)+1),1) end end else if u=59 & machine=1 then write(set,false add konvert(44),1, bss,2,uc,1,false add konvert(58),1,lc,1) else begin if up and v>=0 then begin write(set,lc,1); up:=false end else if v<0 and -,up then begin write(set,uc,1); up:=true end; write(set,false add v,1) end; if u1>0 and machine=5 then begin write(set,esc,1,false add (if u1=1 then 85 else 68),1); write(set,esc,1,false add 30,1,false add (entier(leading*2/3)+1),1) end; if v extract 7=14 then begin if (machine=2 or machine=3 ) and linebuf(i+1) extract 7<>bs extract 7 then write(set,sps,1) end; comment only if different char. in the 2 fonts; if q1>0 & runfont<>q1 then write(set,stop,1); end end settext; procedure setmtext; begin comment set margin text and fill up with spaces to the actual left margin; integer i,v,u,q1,oldfont,q2,q3,u1,lf,t; i:=q1:=0; oldfont:=runfont; v:=-1; if mtfont<>runfont then outfont(mtfont); for i:=i+1 while v<>0 do begin v:=margtext(i) extract 7; q1:=q1+width(v); if q1>margin and -,nstext then begin outspace(margin-q1+width(v),false,-2); goto errmarg end else if q1>linewidth and nstext then error(<:linewidth exceeded:>,1); if setmode then begin v:=margtext(i) extract 12; if v>127 then begin u1:=v shift (-7); v:=v extract 7; end else u1:=0; u:=konvert(v); if machine=2 and u>128 then begin write(out,nl,1,<:***char :>,<<d>,v); where; u:=11 end comment only if different char. in the 2 fonts; q2:=if u shift 1<0 then (if u shift 2<0 then 2 else 1) else 0; if q2>0 and runfont<>q2 then write(set,stop,1); lf:=2*entier(subleading*2/3)+1; if u1>0 and machine=5 then write(set,esc,1,false add 30,1,false add lf,1, esc,1,false add (if u1=1 then 68 else 85),1); if v=30 and machine=5 then begin t:=linecount-subleading; if t>=0 then begin linecount:=t; write(set,esc,1,false add 30,1,false add lf,1, esc,1,false add 68,1,esc,1,false add 30,1, false add (entier(leading*2/3)+1),1) end end else if v=31 and machine=5 then begin t:=linecount+subleading; if t<=pagelength then begin linecount:=t; write(set,esc,1,false add 30,1,false add lf,1, esc,1,false add 85,1,esc,1, false add 30,1, false add (entier(leading*2/3)+1),1) end end else begin if up and u>=0 then begin write(set,lc,1); up:=false end else if u<0 and -,up then begin write(set,uc,1); up:=true end; end; write(set,false add u,1); if u1>0 and machine=5 then write(set,esc,1,false add (if u1=1 then 85 else 68),1, esc,1,false add 30,1,false add (entier(leading*2/3)+1),1); if q2>0 and runfont<>q2 then write(set,stop,1); end; if (u extract 7=14) and setmode then begin if (machine=2 or machine=3) and margtext(i+1) extract 7 <> bs extract 7 then write(set,sps,1); end; if printmode then begin v:=margtext(i) extract 12; if v>14 and v<30 then write(pr,false add 42,1,<<d>,v-14) else if v=30 then write(pr,false add specdel,1,false add 117,1) else if v=31 then write(pr,false add specdel,1,false add 100,1) else if v>127 then write(pr,false add specdel,1, false add (if v<256 then 104 else 108),1, false add (v extract 7),1) else write(pr,false add v,1) end end; if nstext then goto resetfont; outspace(margin-q1,false ,-2); errmarg: if margin-q1<0 then error(<:width of margin text:>,1); resetfont: if mtfont<>oldfont then outfont(oldfont); if nstext then nstext:=false else mtext:=true; end setmtext; procedure outcode(p); value p; integer p; comment outputs code placed in codebuf(pc:pc+pco(p)-1) via zone set; begin integer i,t,q2; t:=pc+pco(p)-1; for i:=pc step 1 until t do begin comment special for justotext 70; q1:=codebuf(i) extract 7 -31; q2:=q1+31; if machine=1 & (q1=1!q1=2) then runfont:=q1; if machine=2 and q2>0 and q2<8 then begin <* change(q2); *> runfont:=q2; end else write(set,codebuf(i),1) end; pc:=t+1 end outcode; procedure outnl(n); value n; integer n; comment outputs n <NL> characters and adjust linecount; begin integer p; if leading>18 and machine<>1 and machine<>5 then p:=leading//stdlead*n else p:=n; if setmode then write(set,nls,p); if printmode then begin if machine=5 then p:=leading//stdlead*n; if p=0 then p:=1; write(pr,nl,p) end; if -,notemode&n>0 then linecount:=linecount+n*leading end outnl; integer procedure qread(tex,p,v); boolean array tex; integer p,v; comment reads next character into v from tex and increase the pointer p by 1, qread is assigned the class of v defined as the actual content of intab, v=0 indicates end of string; begin v:=tex(p) extract 12; p:=p+1; qread:=if (v>15 and v<32) or v>127 then 5 else intab(v) shift (-12) extract 4; if v=0 then begin if first & linewidth-accuw-(w-1)*normsp>=0 then dropjust:=true else if first & linewidth-accuw-(w-1)*minspace<0 then begin v:=-1; p:=p-1 end; word:=more:=false end; end qread; procedure delim(v); integer v; begin integer p,p1,q; integer procedure rd(t); integer t; rd:=if headmode then qread(rhead,rh,t) else if notemode then qread(fnote,fn,t) else readchar(in,t); if v shift (-7) extract 1 = 1 then begin comment special delimiter, must by followed by u,d,h or l return value for v after return value u 30 (half LF up) d 31 (half LF down) h<c> c+128 (half LF up <c> half LF down) l<c> c+256 (half LF down <c> half LF up) ; rd(p); if p=117 then v:=30 else if p=100 then v:=31 else if p=104 or p=108 then begin q:=rd(p1); if q<4 or q>6 or p1>127 then begin v:=63; error(<:invalid char:>,1); end else v:=(if p=104 then 128 else 256)+p1 end else begin v:=63; error(<:invalide char:>,1) end; end end delim; procedure notsep(s); label s; comment used in notemode and headmode when separator is changed between the command FN or RH and the setting; begin klass:=5; goto s end notsep; procedure calcensp; comment calculates censp as the spacewidth in units to be generated to get the textline centered or quadded right; begin if accuw>0 then begin censp:=if mode=4!headmode then (linewidth+(if headmode then margin else 0)-accuw)//2 else linewidth-accuw; if censp<0 then censp:=0; end else censp:=0 end calcensp; procedure setclass(just); value just; boolean just; comment just=true : set input classes as in just. mode just=false :set input classes as in nonjust,tabul, centr. and quadding right mode; begin integer i; if just then begin intab(32):=2 shift 12+32; if intab(95) extract 7=95 then intab(95):=4 shift 12+95; if intab(45) extract 7=45 then intab(45):=6 shift 12+45; intab(9):=0; end else begin intab(32):=5 shift 12+32; for i:=45,95 do if intab(i) extract 7=i then intab(i):=5 shift 12+i; if mode=3 then intab(9):=6 shift 12+9 else intab(9):=0; end; end setclass; \f comment start program; begin integer q,i; procedure connect(z,name,exist); value exist; zone z; array name; boolean exist; begin integer array zdes(1:20),tail(1:10); integer m; q:=1; open(z,4,string name(increase(q)),0); getzone6(z,zdes); zdes(13):=0; setzone6(z,zdes); if exist then begin m:=27; q:=3; if monitor(42,z,0,tail)<>0 then goto L end else m:=28; q:=1 shift 1 + 1; fpproc(m,q,z,name); if q<>0 then begin L: i:=1; write(out,<:***compose end. connect :>, string name(increase(i)),<:, :>,<<d>,q,nl,1); fpproc(7,0,0,3) end; getzone6(z,zdes); zdes(10):=0; zdes(13):=0; if exist then begin zdes(14):=zdes(15):=zdes(19); zdes(16):=0; end; setzone6(z,zdes); end; test:=time:=false; nl:=false add 10; sp:=false add 32; ff:=false add 12; bs:=false add 5; if printmode then connect(pr,prooffile,false); if setmode then connect(set,objfile,false); if hypmode=1 or hypmode=3 then connect(hyphinf,hyphfile,hypmode=3); if hypmode<3 then open(c,8,<:terminal:>,0); if sourcefile(1)<>real<::> then begin fpproc(29,0,in,0); fpproc(27,q,in,sourcefile); if q<>0 then begin i:=1; write(out,<:***compose end. connect :>, string sourcefile(increase(i)),<:, :>, <<d>,q,nl,1); fpproc(7,0,0,3); end; end; if test then begin write(out, <:<10>machine :>,machine, <:<10>language :>,language, <:<10>setmode :>,if setmode then <:yes:> else <:no:>, <:<10>printmode :>,if printmode then <:yes:> else <:no:>, <:<10>hypmode :>,hypmode); outchar(out,10); test:=false; setposition(out,0,0) end; end; write(out,<:compose begin. :>); systime(1,0,ra(1)); write(out,<< zd dd dd>,systime(2,ra(1),ra(2)),ra(2)); setposition(out,0,0); comment initialize tables and variables dependent of machine; a:=1 shift 23; b:=1 shift 22; d:=b+1 shift 21; comment the bit positions contained in a,b and d in table konvert have the following meaning: a: upper case character b: only existing in font no. 1 d: only existing in font no. 2; leading:=stdlead:=12; q1:=if machine=3 then 2 else machine; case q1 of begin begin comment Justotext 70; for i:=0 step 1 until 127 do begin konvert(i):= case i+1 of ( 0,8,49,32,33,49,8+a,0,0,41,37,0,35,0,0,2,57,40+a,48+a,45, 57+a,45+a,50+a,38+a,46,46+a,8,8+a,0,0,0,0,4,34+a,57,60+a,60+a,50+a,58+a,2+a, 27+a,31+a,60+a,56+a,38,40,34,54+a,31,42,60,56,52,50,54,58,48,27,52+a,2+a, 57,42+a,57+a,38+a,60+a,24+a,19+a,14+a,18+a,16+a, 22+a,11+a,5+a,12+a,26+a,30+a,9+a,7+a,6+a,3+a, 13+a,29+a,10+a,20+a,1+a,28+a,15+a,25+a,23+a,21+a, 17+a,36+a,44+a,46+a,45+a,40+a,45,24,19,14, 18,16,22,11,5,12,26,30,9,7,6,3,13,29,10,20,1,28,15,25, 23,21,17,36,44,46,60+a,63); width(i):= case i+1 of ( 0,1,-1,0,0,-1,3,0,-1,0,0,0,0,0,0,0,3,5,2,0, 3,0,4,3,3,4,1,3,0,0,0,0,2,2,3,3,3,4,4,0, 2,2,4,3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2, 3,3,3,3,3,4,4,4,4,4,4,4,4,2,3,4,4,5,4,4, 4,4,4,3,4,4,4,5,4,4,4,5,4,4,0,5,0,3,3,3, 3,3,2,3,3,2,2,3,2,5,3,3,3,3,3,3,2,3,3,4, 3,3,3,4,3,3,3,0); end i; unit:=0.53107; comment dependent of type size; nls:=false add 37; bss:=false add 49; sps:=sp2:=false add 4; sp1:=false add 8; sp3:=false add 8; u1:=false add 1; lc:=false add 47; uc:=false add 39; normsp:=2; normw:=2.7; fontcode(1):=32; fontcode(2):=33; minlead:=10; stop:=false add 35; minspace:=1; maxspace:=5; maxfactor:=0.50; minfactor:=1.5; end Justotext 70; begin comment Flexowriter; for i:=0 step 1 until 127 do konvert(i):= case i+1 of ( 0,0,0,0,0,0,0,0,0,62,128,0,11,0,0, 22+a+b,7+a+b,14+a+b,13+b,13+a+b, 16,103+a+d,19+a+d,22+a+d,8+a+d,2+a+d,117+d, 0,0,0,0,0,16,1+a,130,130,130,130,32+a,59+a, 8+a,25+a,2+a,64+a,59,64,107,19+a,32,1,2,19,4,21,22,7,8,25,107+a,21+a, 49,4+a,49+a,130,130,97+a,98+a,115+a,100+a,117+a, 118+a,103+a,104+a,121+a, 81+a,82+a,67+a,84+a,69+a,70+a, 87+a,88+a,73+a,50+a,35+a,52+a,37+a,38+a,55+a,56+a, 41+a,112+a,91+a,13+a,130,14,130,97,98,115, 100,117,118,103,104,121,81,82,67,84,69,70,87,88,73,50,35,52,37,38, 55,56,41,112,91,13,130,127); for i:=0 step 1 until 14,27 step 1 until 31,127 do width(i):=0; width(8):=width(5):=-1; for i:=32 step 1 until 126,15,16,17,18,19,20 ,21, 22,23,24,25,26 do width(i):=1; unit:=if machine=2 then 2.5435 else 2.1139; sp1:=sp2:=sp3:=u1:=false; nls:=false add 128; sps:=false add 16; lc:=false add 122; uc:=false add 124; for i:=1,2,3,4,5,6,7 do fontcode(i):=i; normsp:=1; normw:=1; minlead:=12; stop:=false add 11; minspace:=1; maxspace:=2; maxfactor:=0.67; minfactor:=1.0; end Flexowriter;; begin comment RC 610 Line Printer; for i:=0 step 1 until 127 do konvert(i):=i; for i:=15 step 1 until 20 do konvert(i):=case i-14 of (37,63,34,125,93,32); for i:=15 step 1 until 20,32 step 1 until 126 do width(i):=1; for i:=0 step 1 until 14,21 step 1 until 31,127 do width(i):=0; konvert(5):=8; width(5):=width(8):=-1; unit:=2.5429; lc:=uc:=sp1:=sp2:=sp3:=u1:=false; nls:=false add 10; sps:=false add 32; normsp:=1; fontcode(1):=fontcode(2):=127; stop:=false add 127; normw:=1.0; minlead:=12; minspace:=1; maxspace:=2; maxfactor:=0.67; minfactor:=1.0; end Line Printer; begin comment diablo; for i:=0 step 1 until 14,21 step 1 until 31,127 do konvert(i):=width(i):=0 ; for i:=32 step 1 until 126 do konvert(i):=i; for i:=15 step 1 until 22 do konvert(i):=case i-14 of(35,36,37,38,64,32,94,126); konvert(5):=konvert(2):=8; konvert(10):=10; for i:=15 step 1 until 22,32 step 1 until 126 do width(i):=6; width(5):=width(2):=-6; unit:=0.4233; lc:=uc:=false; nls:=false add 10; sps:=false add 32; normsp:=6; normw:=6; minlead:=12; minspace:=3; maxspace:=10; minfactor:=1.3; maxfactor:=0.6; fontcode(1):=fontcode(2):=127; bss:=false add 8; etx:=false add 51; esc:=false add 27; eot:=false add 52; stop:=false; end diablo end case machine; comment initialize variables independent of machine; begin integer procedure q(s); string s; q:=real s shift (-32) extract 16; for i:=1 step 1 until 27 do comtab(i):=case i of ( q(<:nl:>),q(<:rj:>),q(<:sj:>),q(<:ft:>),q(<:np:>),q(<:ta:>), q(<:lm:>),q(<:lw:>),q(<:fg:>),q(<:fn:>),q(<:sc:>),q(<:ns:>), q(<:ts:>),q(<:ps:>),q(<:rh:>),q(<:sb:>),q(<:ct:>),q(<:qr:>),q(<:pl:>), q(<:pn:>),q(<:ld:>),q(<:mt:>),q(<:cm:>),q(<:se:>),q(<:ef:>), q(<:ds:>),q(<:sl:>)); end; typlim:=27; specdel:=delin:=0; subleading:=6; for i:=0 step 1 until 31,127 do intab(i):=i; intab(25):=8 shift 12+25; for i:=10,12,32 do intab(i):=2 shift 12+i; intab(8):=7 shift 12+8; for i:=33 step 1 until 126 do intab(i):=5 shift 12+i; intab(95):=4 shift 12+95; intab(45):=6 shift 12+45; tableindex:=0; intable(intab); for i:=1 step 1 until 18 do sstab(i):=0; compinit:=startofword:=figur:=toptext:=true; runhead:=finis:=headmode:=notemode:=saveword:= hypdigit:=savecode:=hyp:=spamax:=progpage:=back:=false; toppage:=false; point:=0.3532; comment A4-format; folip:=297/point; upperp:=30/point; textp:=235/point; headp:=18/point; nump1:=10/point; pagelength:=textp+upperp; chapstart:=chapstd:=50/point; margin:=newpar:=0; linewidth:=140/unit; newpstd:=5/unit; notenumw:=width(49)+width(41)+2*normsp; pagnum:=lineno:=nlpar:=1; nummode:=5; font:=pnfont:=runfont:=fn:=lineno:=nlpar:=1; size:=1; comment dummy in this implementation; mode:=1; sep:=42; intab(42):=3 shift 12+42; p1mask:=1 shift 19+1 shift 16+1 shift 15+1 shift 14+1 shift 13+1 shift 11+ 1 shift 10+ 1 shift 2+ 1 shift 1; comment FT LM LW FG FN NS TS LD MT; p2mask:=1 shift 22+1 shift 18+1 shift 17+1 shift 9+1 shift 8+ 1 shift 4+1 shift 3; comment NL NP TA PS RH PL PN; figroom:=linecount:=figsize:=fnoteno:=censp:=0; smargin:=swidth:=-1; newpage:=ssaveword:=ssavecode:=smtext:=mtext:=nstext:=prognl:=false; if printmode then write(pr,ff,1); ra(1):=systime(1,0,ra(2)); blocksread:=0; up:=false; if setmode and machine=2 then write(set,lc,1); goto lineinit;\f pageshift: if compinit then begin compinit:=false; goto firstpage end; ssaveword:=ssavecode:=false; if saveword then begin comment save information about word to be transferred to next page; ssaveword:=true; saveword:=false; if h2-h1>wordlim then error(<:char. in word:>,2); shyp:=hyp; sh1:=h1; sh2:=h2; sh3:=h3; for i:=0 step 1 until h2-h1 do swordbuf(i):=linebuf(i+h1); end; if savecode then begin comment save information about code to be transferred to next page; ssavecode:=true; savecode:=false; sc1:=c1; sc2:=c2 end; if fnoteno=0 then goto pagenumb; comment write footnotes in justifying mode; if newpage ! finis then outnl((pagelength-linecount)/leading); comment if pageshift because of PG or EF then lead to bottom; outnl(1); if mode<>1 then setclass(true); savelead:=leading; if leading<>minlead & shiftlead then begin comment use minleading for footnotes; leading:=minlead; if machine=1 then begin genstop(false); if setmode then begin write(out,nl,1,<:///leading :>,<<dd>,minlead); where; end; end else if machine=5 then write(set,esc,1,false add 30,1,false add (entier(leading*2/3)+1),1); end; savemode:=mode; mode:=1; notemode:=true; savemarg:=margin; savell:=linewidth; linewidth:=linewidth+margin; margin:=0; oldfont:=notefont:=runfont; fcount:=0; fn:=1; outnote: fcount:=fcount+1; accuw:=0; if fcount>maxnotelim then error(<:number of footnotes:>,2); if fcount<=fnoteno then begin comment more footnotes; q1:=fnfont(fcount); if q1<> notefont then begin comment change font; outfont(q1); notefont:=q1 end; if up then begin write(set,lc,1); up:=false end; if setmode then write(set,false add konvert(fcount+48),1,uc,1, false add konvert(41),1,lc,1,sps,2); if printmode then write(pr,<<d>, fcount,<:)__:>); accuw:=accuw+notenumw; goto notestart end else begin comment restore variables; if savemode <>1 then setclass(false); if leading<>savelead then begin leading:=savelead; if machine=1 then begin genstop(false); if setmode then begin write(out,nl,1,<:///leading :>,<<dd>,leading); where end; end else if machine=5 and setmode then write(set,esc,1,false add 30,1,false add (entier(leading*2/3)+1),1); end; margin:=savemarg; mode:=savemode; fnoteno:=0; linewidth:=savell; notemode:=false; if notefont<>oldfont then outfont(oldfont) end; pagenumb: bool1:=printmode; if nummode=1 ! nummode=3 then begin comment place pagenumber at pagebottom; outnl((folip-linecount-nump1)/leading); placenum(nummode); printmode:=false; if machine<>4 then outnl(nump1/leading) end else begin printmode:=false; if machine<>4 then outnl((folip-linecount)/leading); end; printmode :=bool1; pagnum:=pagnum+1; if printmode then write(pr,ff,1); comment position is now on page limit; firstpage: q1:=if machine=3 then 2 else machine; if setmode then begin case q1 of begin write(set,false add 34,25); begin write(out,nl,1,<:///top of page :>,<<ddd>,pagnum,nl,1); if up then write(set,lc,1); up:=false; write(set,false add 139,1,false,60); end;; write(set,ff,1); write(set,false add 139,1,<:<27><30>:>,false add (entier(leading*2/3)+1),1) end; end; if finis then goto exit; linecount:=0; fnoteno:=0; fn:=nlpar:=1; shiftlead:=false; lineno:=1; if nummode=2 then begin comment pagenumber centered on pagestop; outnl(nump1/leading); lineno:=2; placenum(nummode); outnl((headp-nump1)/leading) end else outnl(headp/leading); if (nummode=4 ! nummode=5) & -,runhead then begin comment pagenumber to left or right and no head; placenum(nummode); outnl((upperp-headp)/leading); lineno:=2 end else if runhead then begin comment running head; if mode=1 then setclass(false); headmode:=line1:=true; rh:=1; savelead:=leading; if leading<>stdlead and machine>1 then begin leading:=stdlead; if machine=5 and setmode then write(set,esc,1,false add 30 ,1,false add (entier(leading*2/3)+1),1) end; goto lineinit; headlab: headmode:=false; if font<>runfont then outfont(font); if savelead<>leading then begin leading:=savelead; if machine=5 and setmode then write(set,esc,1,false add 30,1,false add (entier(leading*2/3)+1),1) end; if mode=1 then setclass(true); outnl((upperp-linecount)/leading) end else outnl((upperp-headp)/leading); comment position is now on first normal line; if newpage then begin comment PG; outnl((chapstart-upperp)/leading); newpage:=false end; if figroom>0 then begin comment figure(s) saved from previous page; q1:=pagelength-linecount; if figroom<=q1 then begin outnl(figroom/leading); figur:=true; figroom:=0 end else begin outnl(q1/leading+1); figroom:=figroom-q1 end end; if ssaveword then begin comment restore inf. about word to be saved; saveword:=true; hyp:=shyp; h1:=sh1; h2:=sh2; h3:=sh3; for i:=0 step 1 until h2-h1 do linebuf(h1+i):=swordbuf(i); end; if ssavecode then begin comment restore inf. about code to be saved; savecode :=true; c1:=sc1; c2:=sc2; end; toptext:=true; if progpage then begin progpage:=false; toppage:=true; end; \f lineinit: if smtext then begin comment margin text in the following line; setmtext; smtext:=toptext:=false end; if smargin>-1 then begin linewidth:=(if swidth>-1 then swidth else linewidth)-smargin+margin; if linewidth<0 then error(<:left margin:>,2); margin:=smargin; smargin:=-1 end; if swidth>-1 then begin linewidth:=swidth-margin; if linewidth<0 then error(<:left margin:>,2); swidth:=-1 end; if figsize>0 then begin outnl(figsize); figsize:=0 end; accuw:=0; if notemode then begin outspace(notenumw,false,-2); accuw:=notenumw end; notestart: w:=0; comment initialize pointer etc; q1:=nlpar; lin:=pc:=nlpar:=1; first:=startofline:=true; codemask:=printmask:=0; more:=true; codemode:=dropjust:=false; if notemode then goto just; comment footnotes; if headmode then goto centrh; if nstext then begin comment set new section text; if margin>0 and q1>0 then outspace(margin,false,-2); comment only if <linefeed> in NS command>0; setmtext; toptext:=false; outnl(1) end; if linecount>=pagelength then begin progpage:=true; goto pageshift end; if newpar>0 then begin comment new paragraph; outspace(newpar,false,-2); accuw:=newpar; newpar:=0; end; goto case mode of (just,nonjust,tabul,center,centrh); just: if saveword then begin comment word or part of word from previous line; if hyp then begin comment hyphenation in previous line; linebuf(1):=false add h3; accuw:=accuw+width(h3); i:=2; q1:=h2-h1+2; end else begin i:=1; q1:=h2-h1+1 end; j:=0; for i:=i step 1 until q1 do begin linebuf(i):=linebuf(h1+j); j:=j+1; accuw:=accuw+width(linebuf(i) extract 7) end; w:=1; pib(w):=1; pis(w):=q1; lin:=pis(w)+1; hyp:=false; if ulinemask<0 then begin comment word followed by a underline was saved; ulinemask:=1 shift 22 end else ulinemask:=0; toppage:=startofline:=prognl:=false end else ulinemask:=0; if savecode then begin comment code saved from previous line; for j:=c2 step 1 until c2+c1-1 do codebuf(pc+j-c2):=codebuf(j); justpc(c1); end; saveword:=savecode:= false; if linewidth-accuw<=0 then goto outline; justfn: more:=true; for i:=i while more do begin klass:=if notemode then qread(fnote,fn,v) else readchar(in,v); if klass=6 then klass:=5; comment hyphen in start of word ok; branch: case klass+1 of begin;;; begin comment separator; if notemode then notsep(branch); q1:=typol; if q1<5 ! q1=5 & linewidth-accuw-(w-1)*maxspace<=0 then more:=false; end; begin comment underline; if notemode then qread(fnote,fn,q1) else readchar(in,q1); if notemode then fn:=fn-1 else repeatchar(in); if ulinemask shift w >=0 or q1=8 then goto comp end; comp: begin comment start of word; toppage:=codemode:=startofline:=prognl:=false; word:=true; w:=w+1; pib(w):=lin; continueword: for i:=i while word do begin next: if startofword then startofword:=false else klass:=if notemode then qread(fnote,fn,v) else readchar(in,v); if klass<>4 then back:=false; e1: case klass+1 of begin;; word:=false; begin comment separator; if notemode then notsep(e1); word:=false; repeatchar(in) end; begin comment underline; if lin>linelim then error(<:char. in line:>,2); if notemode then qread(fnote,fn,q1) else readchar(in,q1); if q1<>8 then begin comment not backspace; if notemode then fn:=fn-1 else repeatchar(in); if back then begin word:=false; ulinemask:=ulinemask add (1 shift (23-w)) end else goto e2; end else begin if notemode then fn:=fn-1 else repeatchar(in); goto e2 end; end; e2: begin comment part of word; if v>127 then delim(v); linebuf(lin):=false add v; lin:= lin+1; accuw:=accuw+width(v extract 7); end; begin comment hyphen; klass:=if notemode then qread(fnote,fn,q1) else readchar(in,q1); if q1=10 then begin e3: for i:=i while klass=2 do klass:=if notemode then qread(fnote,fn,q1) else readchar(in,q1); if klass=3 and -,notemode then begin if skipnum(fnote,-2,i) then begin klass:=2; goto e3 end else begin linebuf(lin):=false add v; lin:=lin+1; accuw:=accuw+width(v); pis(w):=lin-1; startofword:=true; goto branch end end separator met; if notemode then fn:=fn-1 else repeatchar(in); goto next end else begin if notemode then fn:=fn-1 else repeatchar(in); goto e2 end end; backspace(linebuf,lin,true); etext end case; end word; startofword:=true; pis(w):=lin-1; if linewidth-accuw-(w-1)*maxspace<=0 then more:=false end;;; etext end case; end more; goto outline; nonjust: for i:=i while more do begin klass:=readchar(in,v); case klass+1 of begin;; more:=false; if typol<5 then more:=false;; begin comment start of textunit; toppage:=codemode:=startofline:=prognl:=false; word:=true; w:=w+1; pib(w):=lin; repeatchar(in); for i:=i while word do begin klass:=readchar(in,v); case klass+1 of begin;; word:=more:=false; begin comment separator; word:=false; repeatchar(in); end;; begin comment part of textunit; if lin>linelim then error(<:char. in line:>,2); if v>127 then delim(v); linebuf(lin):=false add v; lin:=lin+1; accuw:=accuw+width(v extract 7); end;; backspace(linebuf,lin,true); etext end case; end word; pis(w):=lin-1; end;;; etext end case; end more; goto outline; tabul: tabcount:=1; q2:=k:=accuw; comment q2 holds the width of the text between the tab. marks; for i:=i while more do begin klass:=readchar(in,v); case klass+1 of begin;; more:=false; if typol<5 then more:=false;; begin comment start of textunit; toppage:=codemode:=startofline:=prognl:=false; word:=true; w:=w+1; pib(w):=lin; repeatchar(in); for i:=i while word do begin klass:=readchar(in,v); case klass+1 of begin;; more:=word:=false; begin comment separator; word:=false; repeatchar(in) end;; begin comment part of textunit; if lin>linelim then error(<:char. in line:>,2); if v>127 then delim(v); linebuf(lin):=false add v; lin:=lin+1; q2:=q2+width(v extract 7) end; begin comment HT, calculate and output the space room ,q1, from the actual position to the nearest tab. mark; word:=false; repeatchar(in) end; backspace(linebuf,lin,true); etext end case; end word; pis(w):=lin-1; accuw:=accuw+q2; k:=q2; q2:=0 end textunit; begin comment HT; q1:=tabpar(tabcount)-k; for tabcount:=tabcount+1 while q1<0 & tabcount<tabno+1 do q1:=q1+tabpar(tabcount); if tabcount>=tabno+1 & q1<0 then begin comment no more tab.marks in line; error(<:last tab.mark exceeded:>,1); q1:=0; comment read until end of line; end else outspace(q1,true,-2); accuw:=accuw+q1; q2:=k:=0; end;; etext end case end more; goto outline; center: v:=32; for i:=i while v=32 do readchar(in,v); repeatchar(in); centrh: for i:=i while more do begin klass:=if headmode then qread(rhead,rh,v) else readchar(in,v); cen: case klass+1 of begin;; more:=false; begin if headmode then notsep(cen); if typol<5 then more:=false else if startofline then goto center end;; begin comment start of textunit; toppage:=codemode:=startofline:=prognl:=false; word:=true; w:=w+1; pib(w):=lin; if headmode then rh:=rh-1 else repeatchar(in); for i:=i while word do begin klass:=if headmode then qread(rhead,rh,v) else readchar(in,v); ce1: case klass+1 of begin;; word:=more:=false; begin comment separator; if headmode then notsep(ce1); word:=false; repeatchar(in) end;; begin comment part of textunit; if lin>linelim then error(<:char. in line:>,2); if v>127 then delim(v); linebuf(lin):=false add v; lin:=lin+1; accuw:=accuw+width(v extract 7) end;; backspace(linebuf,lin,true); etext end case; end word; pis(w):=lin-1 end textunit;;; etext end case; end more; calcensp; \f outline: if mode=1 & -,headmode ! notemode then goto linejust; comment output line in nonjust,tabul or centr mode; outnonjust: if linewidth+(if headmode then margin else 0)-accuw<0 then error(<:linewidth exceeded:>,1); pc:=1; blind:=true; bool1:=headmode&nummode=4&pagnum mod 2=0&line1; bool2:=headmode&(nummode=5!nummode=4&pagnum mod 2=1)&line1; if mtext then mtext:=false else if margin>0 & -,headmode and w>0 then outspace(margin,false,-2); if bool1 then placenum(4); if censp>0 then outspace(censp,false,-2); if headmode and runfont<>rhfont then outfont(rhfont); if setmode then begin comment output for setting machine; if codemask<0 then outcode(0); for i:=1 step 1 until w do begin settext(i); if codemask shift i <0 then outcode(i) end end; if printmode then begin comment output for printer; if printmask<0 then printproc(printbuf(0)); for i:=1 step 1 until w do begin for j:=pib(i) step 1 until pis(i) do begin q1:=linebuf(j) extract 12; if blind then begin if false add q1 extract 7 <>32 then blind:=false end; if q1>14 & q1<30 ! q1=6 then begin if q1=6 then write(pr,sp,1) else write(pr,false add 42,1,<<d>,q1-14) end else if q1=30 then write(pr,false add specdel,1,false add 117,1) else if q1=31 then write(pr,false add specdel,1,false add 100,1) else if q1>127 then write(pr,false add specdel,1,false add (if q1<256 then 104 else 108),1, false add (q1 extract 7),1) else write(pr,false add (q1 extract 7),1); comment indicate special symbol as * followed by the number; end; if printmask shift i<0 then printproc(printbuf(i)) end; end; if test then begin testvar; if printmode then setposition(pr,0,0); if setmode then setposition(set,0,0); end; if bool2 then placenum(nummode); if -,blind then lineno:=lineno+1; if toptext and w=0 then nlpar:=0; if -,headmode and w>0 then toptext:=false; censp:=0; outnl(nlpar); line1:=false; goto if v=0 then headlab else if (newpage ! finis) & -,headmode then pageshift else lineinit; linejust: if dropjust and linewidth-accuw-(w-1)*normsp>=0 then goto outputline; hypno:=-999; if first then begin comment the justification part starts here, the width of the words read until now is with max. spacing bigger than or equal the linewidth; if linewidth-accuw-(w-1)*minspace>=0 then begin comment hyphenatron not necessary; if w>1 then begin if (linewidth-accuw)/(w-1)>=maxfactor*maxspace then begin comment max. spacing; first:=false;goto justfn end end end else begin hypdigit:=true; hypno:=hypcall(wid); hypdigit:=false; end; end else begin comment the next word is read trying to change the max. spacing; q1:=linewidth-accuw; q2:=w-1; snitspace:=q1/q2; if q1-q2*minspace>=0 then begin comment justification possible; if snitspace>=minfactor*minspace & snitspace<maxfactor*maxspace then first:=true else begin comment not normal spacing; if snitspace>=maxfactor*maxspace then goto justfn else if -,spamax then first:=true end end end; if first then begin comment all words read participate in this line; if hypno<>-999 then begin comment hyphenation has taken place; if hypno<>0 then begin comment no problems; h1:=abs hypno+(if hypno>0 then 2 else 1); h2:=pis(w); saveword:=true; if hypno>0 then begin comment hyphen; h3:=linebuf(hypno+1) extract 7; hyp:=true; linebuf(hypno+1):=false add 45 end; pis(w):=if hypno>0 then hypno+1 else abs hypno; accuw:=accuw-(if hypno>0 then wid-width(45) else wid) end else begin comment problems,justify by increasing maxspace; if w>2 then goto savelastword else error(<:justification impossible:>,2) end end hypno<>-999 end first else savelastword: begin comment the last word read is saved to the next line; h1:=pib(w); h2:=pis(w); saveword:=true; if ulinemask shift w<0 then ulinemask:=ulinemask+1 shift 23; w:=w-1; if codemask shift w<0 then begin comment save generated code to the next line; c1:=pco(w); c2:=pc-pco(w); savecode:=true end; for i:=h1 step 1 until h2 do accuw:=accuw-width(linebuf(i) extract 7); end; if -,notemode then prognl:=true; comment calculate the spacing; q1:=linewidth-accuw; q2:=w-1; if q2=0 then q2:=10000; snitspace:=q1/q2; if snitspace>=maxfactor*maxspace then spamax:=true else spamax:=false; s1:=q1//q2; k:=q1 mod q2; s2:=if k>0 then s1+1 else s1; outputline: if mtext then mtext:=false else if margin>0 and nlpar>0 then outspace(margin,false,-2); pc:=1; if setmode then begin comment output for setting machine; if codemask<0 then outcode(0); for i:=1 step 1 until w do begin settext(i); if codemask shift i<0 then outcode(i); q1:=if dropjust then normsp else if leftspa then (if i>k then s1 else s2) else if i>q2-k then s2 else s1; comment q1=the wordspace in units between word no. i and i+1; if i<w then outspace(q1,false,if ulinemask shift i < 0 then i else -1); end; if k>0 & -,dropjust then leftspa:=-,leftspa end setmode; if printmode then begin comment output for printer; if printmask<0 then printproc(printbuf(0)); for i:=1 step 1 until w do begin for j:=pib(i) step 1 until pis(i) do begin q1:=linebuf(j) extract 12; if q1>14 & q1<30 then write(pr,false add 42,1,<<d>,q1-14) else if q1=30 then write(pr,false add specdel,1,false add 117,1) else if q1=31 then write(pr,false add specdel,1,false add 100,1) else if q1>128 then write(pr,false add specdel, 1,false add (if q1<256 then 104 else 108),1, false add (q1 extract 7),1) else write(pr,false add q1,1) end; if i<w & ulinemask shift i>=0 then write(pr,sp,1) else if i<w then write(pr,false add 95,1); if printmask shift i<0 then printproc(printbuf(i)); end; end printmode; if test then begin testvar; if printmode then setposition(pr,0,0); if setmode then setposition(set,0,0); end; if w>0 then begin lineno:=lineno+1; toptext:=false end; if -,compinit then outnl(nlpar); goto if notemode & v=0 & -,saveword then outnote else if (newpage ! finis) & -,notemode then pageshift else lineinit; exit: getzone(set,pib); if setmode then begin if machine=2 then write(set,false add 150,1,false ,100) else if machine=5 then write(set,false add 150,1) else write(set,false,100, if pib(1)=4 then false add 25 else false ,1); end; if printmode then write(pr,false add 25,1); if hypmode=1 then write(hyphinf,false add 25,1); if hypmode<3 then begin close(c,false) end; eexit: if time then begin write(out,nl,1,<:segment transfer time: :>,blocksread//55); ra(1):=systime(1,ra(2),ra(2))-ra(1); write(out,nl,1,<:cpu and real time: :>,<<dddd.dd>,ra(1),ra(2)); end; close(pr,true); close(set,true); close(hyphinf,true); write(out,<:<10>compose end. :>); systime(1,0,ra(1)); write(out,<< zd dd dd>,systime(2,ra(1),ra(2)),ra(2),nl,1); fpproc(7,0,0,0) end end ▶EOF◀