|
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: 39936 (0x9c00) Types: TextFile Names: »tinp«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦1a9e12e70⟧ »ccompose« └─⟦this⟧
\f \f ( inp=algol connect.no fp.yes list.no if ok.yes scope user inp lookup inp ) begin integer buflim ; buflim := 126 ; begin zone input(256,2,endcheck),output,text(128,1,stderror) ; boolean vterm,efrec,lastcom,PGrec,group1,nlrec,wrong,console, bsilgl,incom,incommand,print,name, reread,properline ,lbufstop,cbufstop ; integer minfont,maxfont,minlead,maxlead,minlw,maxlw,minval,maxval, minTS,maxTS,mode,i,j,k,a,separator,htno, ht,posn,p,order,order1,int,a1,length, l,term,routine,linecount,A,pointer1,pointer2, ftposn,cmdposn,preseparator, prechar ,lines ,emchar ,char,class ,sourceparamno; integer array table(0:511) ,actionb(1:28), commandname(1:28),linebuf(1:buflim),compbuf(1:buflim+1,1:2); real t1,t2 ; real array ra(1:2),ERROR(1:20),nl(1:2) ,tform(1:1) ; boolean array line(1:128) ; comment procedures ; integer procedure getchar(char) ; comment getchar hands over the next character of input - skipping illegal non-graphics and composed graphics.The routine initiates input and output as required.Getchar gives the class of the character ; integer char ; begin integer i,separator1,k,b,j,type ,c ; boolean bsgroup ,toolong ; if reread then begin char := prechar extract 12 ; getchar := prechar shift (-12) ; reread := false ; goto OUT2 end ; bsgroup := toolong := false ; \f AGAIN: if p>126 then goto NLINE ; if p=126 then begin NLINE1: outline ; nl(1) :=nl(2) := 0.0 shift (-12) ; NLINE: length :=inline(input,line) ; if abs(length) >1000 then begin length := sgn(length)*(abs(length)-1000) ; error(13,0) ; end ; if length < 0 then begin length := -length ;error(12,0)end ; p := 0 ; end of reading line ; p := p+1 ;comment address next character ; char := line(p) extract 12 ; getchar := prechar := type := if char = 127 then 1 else if char > 127 then 4 else if char > 57 then 11 else case char + 1 of (1,11,11,11,11,11,11,11, 11,6,5,11,5,11,11,11, 11,11,11,11,11,11,11,11, 11,3,11,11,11,11,11,11, 7,11,11,11,11,11,11,11, 11,11,11,9,8,9,11,11, 10,10,10,10,10,10,10,10, 10,10) ; if type > 6 then type := 6 ; case type of begin comment 1 nul and del are skipped ; goto AGAIN ; comment 2 no class; ; comment 3 em char,exit ; begin if efrec then goto EXIT1 ; close(input,true) ; if -,nextsource then goto EXIT1; goto NLINE1 ; end ; comment 4 char with backspace indic,skipped ; begin bsgroup := true ; goto AGAIN end ; comment 5 nl and ff,line is output-next line input and scanned for RO command ; begin outline ; length := inline(input,line) ; if abs(length) >1000 then begin toolong := true ;length := sgn(length)*(abs(length)-1000) end ; \f p := 0 ; separator1 := separator ; for i := 1 step 1 until abs(length) do begin if line(i) extract 12 = separator1 then begin comment look for RO OR SE command ; k := i ;b := 0 ; for j := 1 step 1 until 2 do begin for k := k+1 while ( line (k) extract 12)=32 and k < 127 do ; c := line(k) extract 12 ; c := if c<96 then c add 32 else c ; b := b shift 8 add c end ; if b = 115 shift 8 add 101 then begin comment SE command ; for k := k+1 while ( line (k) extract 12) = 32 and k < 127 do ; if ( line (k) extract 12)>32 then separator1 := ( line (k) extract 12) ; end else if b = 114 shift 8 add 111 then begin comment RO command ; for k := k+1 while ( line (k) extract 12) = 32 and k < 127 do ; if ( line (k) extract 12) = separator1 then begin comment move remainder of the line up in the array,arrange that the nl char is skipped ; for i := 1 step 1 until abs(length) - k do line(i):=line(i+k) ; nl(1) := nl(2) := 0.0 shift (-12) ; if length<0 then begin length := -length ;error(12,0) end ; if toolong then error(17,0) ; toolong := false ; goto AGAIN end RO command found ; end end check command ; end scan of next line ; comment RO command not found,and end of scanned line reached ; LINEEND: if A <> 0 then erroroutput ; if length <0 then begin length := -length ;error(12,0) end ; if toolong then error(13,0) ; toolong := false ; if properline then linecount := linecount + 1 ; properline := false ; end of nl and ff handling ; comment 6 other character ; begin if bsgroup then begin comment ignore character and set error if in command ; if bsilgl then error(1,order add 32) ; bsgroup := false ; goto AGAIN end end end of case statement ; prechar := prechar shift 12 add char ; OUT2: end of procedure getchar ; \f boolean procedure nextsource; begin integer no,sep; array param,ra(1:2); no:=sourceparamno+1; nextsource:=false; for sep:=system(4,no,param) while sep shift (-12)>3 do begin if sep=4 shift 12+10 then begin if system(4,no+1,ra) shift (-12)<6 then begin opendoc(input,param,1 shift 18 + 1 shift 16,0); nextsource:=true; goto F end end; no:=no+1 end; F: sourceparamno:=no; end nextsource; procedure opendoc(z,name,giveup,mode); value giveup,mode; zone z; array name; integer giveup,mode; begin integer i,q; integer array zdes(1:20), tail(1:10); getzone6(z,zdes); zdes(13):=4; setzone6(z,zdes); q:=0; open(z, 4, string name(increase(q)),0); getzone6(z,zdes); zdes(13):=4; setzone6(z,zdes); if mode=0 then begin q:=3; if monitor(42,z,0,tail)<>0 then goto L end; q:=1 shift 1+1; fpproc(27+mode,q,z,name); if q<>0 then begin L: i:=0; write(out,<:***inp end. connect :>, string name(increase(i)),<:, :>,<<d>,q,false add 10,1); terminate(3); end; getzone6(z,zdes); zdes(10):=giveup; zdes(13):=0; if mode=0 then begin zdes(14):=zdes(15):=zdes(19); zdes(16):=0 end; setzone6(z,zdes) end; procedure alarm(s); string s; begin write(out,<:***inp end. :>,s,<:<10>:>); terminate(3); end; \f procedure terminate(result); value result; integer result; begin integer array zdes(1:20); getzone6(input,zdes); if zdes(13)<>4 then close(input,true); getzone6(output,zdes); if zdes(13)<>4 then close(output,true); getzone6(text,zdes); if zdes(13)<>4 then close(text,true); fpproc(7,0,0,result) end terminate; integer procedure increase(i) ; integer i ; increase := i := i+1 ; procedure footfall; comment footfall is called when an error is detected in a command, it may be in the mnemonic code or in the parameters, and the main program has skipped to the next separator. By examining the following characters it is checked wheather the separator really is a end separator and not a start separator and though indicating a missing end separator; begin integer i,j,a,a1; READ2CHAR: order:=order1:=0; name:=true; incommand:=bsilgl:=nlrec:=false; for i:=1,2 do begin for j:=getchar(a) while a=32 or j=5 do if j=5 then nlrec:=true; if a=separator then goto COMMAND; a1:=if a<96 then a+32 else a; order1:=order1 shift 8 add a1; order:=order shift 8 add a; if j<>10 then name:=false end; if nlrec and mode=4 then begin if htno>ht then begin error(8,0); erroroutput end; htno:=0 end; if group1 then begin group1:=false; if -,PGrec then error(9,0) end; reread:=true; \f order1:=order1 shift 8; order:=order shift 8; for cmdposn:=1 step 1 until 26 do if order1=commandname(cmdposn) then goto ACTION else if name then begin comment the 2 first characters after the separator are digits, that is possible start of a name, check if the next 3 characters are 2 digits and 1 separator; name:=true; for i:=1,2 do begin j:=getchar(a); if j<>10 then name:=false end; getchar(a); if a<>separator then name:=false; if name then begin comment skip to next separator; for j:=getchar(a) while a<>separator do; goto READ2CHAR end; end name; goto DATAREAD; comment no missing end separator; end footfall; procedure error(x,a) ; integer x,a ; comment A and ERROR are global,x gives failure number, a value referring to the failure e.g. commandname ; begin wrong:=true; if A< 20 then begin A := A + 1 ; ERROR(A) := 0.0 shift (-12) ; ERROR(A) :=ERROR(A) add a shift 24 add x ; end ; end of procedure ; real procedure pack(count) ; comment packs the line number enclosed by -separators- into a real. uses global - preseparator,which gives the separator at the end of the previous line ; value count ; integer count ; begin integer array table(1:6) ;integer i ;real rcount ; table(1) := table(6) := preseparator ; for i := 2 step 1 until 5 do table (i) := 48 ; comment zeroes ; i := 6 ; for i := i-1 while count <> 0 do begin table(i) := count mod 10 + 48 ; count := count // 10 end ; for i := 1 step 1 until 6 do rcount := rcount shift 8 add table(i) ; pack := rcount ; end of pack procedure ; \f procedure outline ; comment outputs line to data file , and text file,if present ; begin integer c,i,j,k,x,a,action,outlength ; real array B,C(1:44) ; x := i := k := 0 ; for i := i+k while i<126 do begin k := 0 ; x := x + 1 ; B(x):=C(x) := 0.0 shift (-12) ; for j := 1 step 1 until 6 do begin COMP1: k := k+1 ;a := line(i +k) extract 12 ; action := if a = 127 then 1 else if a > 127 then 2 else if a > 31 then 3 else case a+1 of (1,3,3,3,3,3,3,3,3,5,4,3,4,3,3,3, 3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3 ) ; case action of begin comment 1 and 127 ignored ; if i+k > 126 then goto COMP2 else goto COMP1 ; comment 2 bs indication ; begin C(x):=C(x) shift 8 add (a extract 7); B(x):= B(x) shift 8 add (a extract 7 ) ; line(i+k) := false add 8 ; k := k-1 end ; comment 3 other char ; begin if a > 32 then properline := true ; comment graphic in line ; C(x):=C(x) shift 8 add a; B(x) :=B(x) shift 8 add a ; end ; comment 4 nl and em and ff char ; COMP2: begin if j= 1 then x := x-1 else begin k := 8 *(7-j) ; C(x):=C(x) shift k; B(x) :=B(x) shift k ; end ; goto FINISH ; end ; comment 5 HT character; begin B(x):=B(x) shift 8 add a; C(x):=C(x) shift 8 add 38; comment set and in text output; end; end of case statement ; end of inner loop ; end of outer loop ; \f FINISH: outlength := x ; c:= 1 ; if linecount mod 10 = 0 and -, incom and (nl(1) = real <:<10>:> or nl(1)=real <:<12>:>) then begin if linecount >= 10000 then linecount := 0 ; nl(2) := pack(linecount ) ; c := 2 end ; preseparator := separator ; comment set current separator ; incom := incommand ; outdata(output,pointer1,nl,c,1) ; outdata(output,pointer1,B,outlength,1) ; if print then begin if nl(1)=real <:<10>:> then begin comment form feed every 45 lines ; lines := (lines + 1) mod 45 ; if lines = 0 then outdata(text,pointer2,tform,1,1) ; end else if nl(1) = real <:<12>:> then begin lines := 0 ; nl(1) := real <:<10>:> ; outdata(text,pointer2,tform,1,1) ; end ; outdata(text,pointer2,nl,2,1) ; outdata(text,pointer2,C,outlength,1) ; end ; nl(1) := if a = 12 then real <:<12>:> else real <:<10>:> ; comment set ff or nl character ; nl(2) := real <: :> add 32 ; end of outline procedure ; \f procedure erroroutput ; comment this procedure is used after a line is output to give msgs re the errors in the line,the failures have been saved in the array ERROR.Pointer A gives the number of failures ; begin integer i,j,k ; real array msg(0:4) ; for i := 1 step 1 until A do begin j := (ERROR(i) extract 24 )*4 - 4 ; for k := 1 step 1 until 4 do msg (k) := real(case(k+j) of ( <:BS in:> add 32,<:typol:> add 32,<:comma:> add 110,<:d:>, <:inval:> add 105,<:d dat:> add 97,<: :>,<: :>, <:typol:> add 32,<:in te:> add 120,<:t :>,<:DUMMY:>, <:too m:> add 97,<:ny li:> add 110,<:es in:> add 32,<:text:>, <:inval:> add 105,<:d com:> add 109,<:and :>,<: :>, <:comma:> add 110,<:d not:> add 32,<:first:> add 32,<:input:>, <:unkno:> add 119,<:n com:> add 109,<:and :>,<: :>, <:too m:> add 97,<:ny HT:> add 115,<: in p:> add 114,<:eline:>, <:PS co:> add 109,<:mand :> add 110,<:ot in:> add 32,<:group:>, <:no EF:> add 32,<:comma:> add 110,<:d:>,<: :>, <:inval:> add 105,<:d in :> add 112,<:resen:> add 116,<: mode:>, <:illeg:> add 97,<:l cha:> add 114,<:acter:>,<: :>, <:line :> add 116,<:oo lo:> add 110,<:g:>,<: :> )) ; if -, print then begin comment current output ; k := 0 ; write(out,<:<10>* :>,<<dddd>,linecount,<: :>, string(ERROR(i) shift (-24) shift 24) , string msg(increase(k))) ; end else begin comment text file output ; lines := (lines + 1) mod 45 ; if lines = 0 then outdata(text,pointer2,tform,1,1) ; msg(0) := real <:<10>* :> add ( ERROR(i) shift (-24) extract 24 ) ; outdata(text,pointer2,msg,5,0) ; end ; end of inner block ; A := 0 ; comment clear ERROR array ; end of erroroutput procedure ; \f boolean procedure number(sum,vterm,term) ; integer sum,term ; boolean vterm ; comment input classes other space sign digit 0.init 4-0 1-0 2-1 3-2 1-after sign - 1-1 4-0 - 2.after digit - 1-2 - - ; begin integer char,j,state,class,action ,i ; integer array no(1:10) ; boolean sign ; state := 0 ; i := 0 ; number := false; sign := true ; REPEAT: class := (case getchar(char) of (1,1,1,1,1,1,2,1,3,4,1)) + state * 4 ; state := case class of (0,0,1,2,0,1,0,2,0,2,0,2) ; action := case class of (4,1,2,3,4,1,4,3,4,1,4,3) ; case action of begin comment 1 space no action ; ; comment 2 set sign ; if char = 45 then sign := false ; comment 3 set digit ; begin number := true ; i := i+1 ; no(i) := char end ; comment 4 terminate ; goto OUT end ; goto REPEAT ; OUT: sum := 0 ; if i>0 then begin for j := 1 step 1 until i do sum := sum+(no(j)-48)*10**(i-j) ; if -, sign then sum := -sum end ; term := char ; vterm:=term=44; end of procedure ; procedure outdata(a,b,c,d,e) ; comment this procedure builds up a record to be output by standard proc. outrec . a zone name b pointer in buffer c real array with data d no of elements in array e starting point in array ; zone a ; integer b,d,e ; array c ; begin integer i ; for i := e step 1 until (e + d-1 ) do begin if b> 128 then begin outrec(a,128) ; b := 1 end ; a(b) := c(i) ; b := b + 1 ; end ; end of outdata procedure ; \f procedure endcheck(z,s,b) ; zone z ; integer s,b ; comment global emchar is used - this is set up when data for intable is given ; begin if s extract 1 > 0 then stderror(z,s,b) else if s shift (-18) extract 1 = 1 and b = 0 or s shift (-16) extract 1 = 1 then begin b := 2 ; z(1) := 0.0 shift 8 add emchar shift 8 add emchar shift 8 add emchar shift 24 ; end end of blockproc ; integer procedure inline(z,a); zone z; boolean array a; begin comment the procedure reads a line from the zone z and puts the line in the array a with one character pr. element. in case the line contains composed characters, the elements are placed in sequence and characters which should b followed by a bs-character have bit 1 set to 1. parameters: z a zone which should be opened and closed and initialized by setposition outside the procedure. a a boolean array declared with the limits 1:buflim. (concerning buflim see later) after a call of the procedure the array will contain a line where a line is a string of characters terminated by a class 3 character (nl,ff). if an input line has more than buflim characters succeding calls of the procedure will put blocks of buflim characters in the array until a class 3 character is met. for lines longer than buflim positions will backspacing across the buflimth character give an erroneous result. value: after a call inline will assume one of the following values: a +no. of characters in the array under normal conditions. b -no. of characters in the array in the case that one or more characters of class 5 is met. c 1000+no. of characters in the array a in case of the last call of the procedure in connection with a line where the buffer for composed characters is exceeded. both buffers contain max. buflim elements. the characters read until the buffer for composed elements is filled up are placed in a and the rest of the line is skipped. \f method: the buffer for composed characters mentioned above is contained in an array with the limits 1:buflim+1,1:2. the first column contains the character values and the second column the corresponding graphical position in the line. after a line is read the elements in the buffer for composed characters are sorted into sequence corresponding totheir graphical positions. afterwards the buffer is merged with the ordinary line buffer into the array a. global variables: char an integer containing the last read character. char should be initialized to 0 in the start of the program. class an integer containing the class of the last read character. class should be initialized to 0 in the start of the program. lbufstop a boolean which is true when the array a is filled during merging from the linebuffer and else false. cbufstop a booleanwhich is true when the array a is filled up during merging from the buffer for composed characters, and else false. buflim an integer containing the size of the buffers. buflim should be set the max. number of characters in a normal input line in the start of the program. linebuf a one-dimensional array containing a character pr element corresponding to the position in the line. in the case of composed characters is only the first element i linebuf. compbuf a two dimensional array containing the second and the following elements of composed characters. the first column contains the character values and the second the position in the line. linebuf and compbuf should be declared as integer arrays with the limits 1:buflim and 1:buflim+1,1:2 respectively. own varibles: curl an own integer indicating the current index of the linebuffer. curc an own integer indicating the current index of the buffer for composed characters. curcmax an own boolean set true if the buffer for composed characters is exceeded. class5 an own boolean set true if a character of class 5 is met in the line. li, ci own integers containing the index of linebuf and compbuf respectively during merging to the output array a. local variables: lb a boolean set true if the next character read is to be stored in linebuf and set false if it is to be stored in compbuf. point an integer pointing at the actual position of the line. point is counted 1 up for each chracter read with the exception of bs and cr. in the case of bs point is counted 1 down and in the case of cr point is set to 0. ai an integer containing the current index of the output array a. ; integer point,ai; own integer li,ci,curl,curc; boolean lb; own boolean curcmax,class5; comment globals boolean lbufstop ,cbufstop integer class,char,buflim integer array linebuf(1:buflim),compbuf(1:buflim+1,1:2); \f procedure shellsort(a,n); value n; integer array a; integer n; begin integer i,j,k,m,w1,w2; for i:=1 step i until n do m:=2*i-1; for m:=m//2 while m<>0 do begin k:=n-m; for j:=1 step 1 until k do begin for i:=j step -m until 1 do begin if a(i+m,2)>=a(i,2) then goto l1; w1:=a(i,1); w2:=a(i,2); a(i,1):=a(i+m,1); a(i,2):=a(i+m,2); a(i+m,1):=w1; a(i+m,2):=w2; end i; l1: end j; end m; end shellsort; if lbufstop or cbufstop then goto merge; curl:=curc:=point:=0; curcmax:=class5:=false; lb:=true; if class<>3 then begin for class:=class,readchar(z,char) while class<>3 do if class=2 then class2: begin if lb then begin if curl=buflim then goto outp; curl:=curl+1; point:=point+1; linebuf(curl):=char; end else begin if curc=buflim then begin curcmax:=true; for class:=readchar(z,char) while class<>3 do; comment rest of line skipped; if curl<buflim then curl:=curl+1; linebuf(curl):=char; class:=0; goto outp; end; point:=point+1; lb:=point=curl; if char<>32 then begin curc:=curc+1; compbuf(curc,1):=char; compbuf(curc,2):=point end; end lb false; end class =2 else \f if class=0 then begin comment skipped;end else if class=4 then begin lb:=false; point:=if char=8 then point-1 else 0; if point<0 then point:=0; end else begin comment class=5; class5:=true; goto class2 end read loop; end class<>3; comment class=3; if curl<buflim then begin curl:=curl+1; linebuf(curl):=char; class:=0; end; outp: if curc>0 then begin comment sort of compbuf and merging with linebuf; shellsort(compbuf,curc); li:=1; ci:=1; merge: ai:=0; for li:=li step 1 until curl do begin if ai=buflim then begin lbufstop:=true; goto procvalue end; if -,cbufstop then begin ai:=ai+1; a(ai):=false add linebuf(li) end; for ci:=ci while ci<=curc and compbuf(ci,2)=li do begin if ai>0 then a(ai):=a(ai)add 1024; if ai=buflim then begin cbufstop:=true; goto procvalue end; if a(ai) extract 12<>1056 then ai:= ai+1 ; comment <sp><bs> skipped ; a(ai):=false add compbuf(ci,1); ci:=ci+1 end ci loop end li merge loop; \f lbufstop:=cbufstop:=false; end if curc>0 else begin for ai:=1 step 1 until curl do a(ai):=false add linebuf(ai); ai:=curl; end; procvalue: if curcmax and -,(lbufstop or cbufstop) then ai:=ai+1000; inline:=if class5 then -ai else ai; end inline; \f begin comment scan call parameters; integer sep,no,next,q,machine; boolean readtable; real array param,sourcefile,tablefile(1:2); machine:=4; print:=false; readtable:=false; sourceparamno:=0; sep:=system(4,1,param); if sep=6 shift 12+10 then begin system(4,0,param); opendoc(output,param,0,1); end else alarm(<:no object:>); no:=2; for sep:=system(4,no,param) while sep shift (-12)>3 do begin 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>5 or machine<4 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<:text:> then begin sep:=system(4,no+1,param); if sep=8 shift 12+10 then begin opendoc(text,param,0,1); print:=true; next:=no+2 end else if sep shift (-12)<6 then goto sourcename else goto paramerror end else if param(1)=real<:table:> then begin sep:=system(4,no+1,param); if sep=8 shift 12+10 then begin tablefile(1):=param(1); tablefile(2):=param(2); next:=no+2; readtable:=true end else if sep shift (-12)<6 then goto sourcename else goto paramerror; end else begin sourcename: if sourceparamno=0 then begin sourceparamno:=no+1; system(4,no,sourcefile); end; next:=no+1 end; \f if system(4,next,param) shift (-12) >=6 then goto paramerror else no:=next end while; if false then paramerror: begin write(out,<:***inp 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 <: :>); i:=0; if sep extract 12=10 then write(out,string param(increase(i))) else write(out,<<d>,entier(param(1)+.5)); no:=no+1 end; outchar(out,10); terminate(3); end; if sourceparamno=0 then alarm(<:no source:>); opendoc(input,sourcefile,1 shift 18+1 shift 16,0); begin zone intab(256,2,stderror) ; integer i,class,x,y,z ; if readtable then begin comment set up table as user requires ; opendoc(intab,tablefile,0,0); emchar := 511 ; for i := 0 step 1 until 511 do table(i) := 5 shift 12 add 33 ; for i := read(intab,x,y,z) while i = 3 do begin if x<0 or x>511 or (y<0 or y>127 and z<>1) or z<0 or z> 5 then alarm(<:input table data error:>); class := if (y=10 or y=12 or y=25) then 3 else if (y=8 or y=13) then 4 else if (y=0 or y=127) and z<>1 then 0 else z ; table(x) := class shift 12 add y ; if y= 25 and x<emchar then emchar := x ; comment save users lower case value for EM character ; end ; close(intab,true) ; end else \f begin comment set up table for iso-code input and output where non-graphics are illegal chars ; for i := 1 step 1 until 7, 11, 14 step 1 until 24, 26 step 1 until 31, 128 step 1 until 255 do table(i) := 5 shift 12 add 33 ; table(0) := table(127) := 0 ; comment blind characters ; table(10) := table(12) := table(25) := 3 ; comment nl,ff,em line terminators ; table(8) := table(13) := 4 ; comment bs,cr special characters ; for i := 9,32 step 1 until 126 do table(i) := 2 ; for i := 0,8,9,10,12,13,25,32 step 1 until 127 do table(i) := table(i) shift 12 add i ; emchar := 25 ; end ; end setting up intable ; minfont := case machine of (1,1,1,1,1) ; maxfont := case machine of (2,7,1,1,1) ; minlead := case machine of (0,12,12,12,3) ; maxlead := case machine of (31,24,24,24,30) ; minlw := case machine of (0,0,0,0,0) ; maxlw := case machine of (140,325,325,325,325) ; minTS := case machine of (5,1,1,1,1) ; maxTS := case machine of (12,1,1,1,1) ; comment 1 for JUSTOTEXT, 2 for DURA 941, 3 flexo, 4 RC 610 lp 5 diablo ; intable(table) ; tableindex := 0 ; write(out,<:input syntax check begin.:>); systime(1,0,t1); write(out,<< zd dd dd>,systime(2,t1,t2),t2); setposition(out,0,0); end scan and init; incommand :=incom := efrec := reread := lbufstop := cbufstop := properline := bsilgl := line(127) := line(128) :=false ; mode := linecount := 1 ; comment justifying mode and 1st line set ; A := char := class := lines := 0 ; tform(1) := real <:<12><10><10>:> ; p := 127 ; pointer1 := pointer2 := 129 ; comment to initialise input and output ; if print then outdata(text,pointer2,tform,1,1) ; comment form feed for printout ; separator := preseparator := 42 ; comment * ; nl(1) := 0.0 shift (-12) ; nl(2) := real <: :> add 32 ; comment set up tables for actions ; for i := 1 step 1 until 28 do actionb(i) := case i of (1,1,1,1,1,3,3,16,4,4,4,4,5,2,6,7,8,9,10,10,11,12,17,13,14,15,6,4) ; comment set up command name table ; for i := 1 step 1 until 28 do commandname(i) := real (case i of ( <:rj:>,<:sj:>,<:ct:>,<:ta:>,<:qr:>,<:nl:>,<:np:>,<:ns:>,<:ft:>, <:ts:>,<:lw:>,<:ld:>,<:ps:>,<:sc:>,<:se:>,<:pl:>, <:pn:>,<:rh:>,<:fn:>,<:mt:>,<:cm:>,<:ro:>,<:sb:>, <:ef:>,<:lm:>,<:fg:>,<:ds:>,<:sl:>)) shift (-24) extract 24 ; \f ftposn := 8 ; comment N.B. in the command table the mode commands must be the first to occur : commands which depend on mode must be at the start of the table,actiona array gives action related to mode : ft,ts,lw,ld must lie together in that order(these commands are dependent on the typesetting equipment):-ftposn- gives the posn-1 of ft relative to the start of the table ; INITIAL: for i := getchar(a) while a <= 32 do; name := true ; group1 := true ;PGrec := false ; if a = separator then goto COMMAND else error(6,0) ; comment must start with command group ; DATAREAD: for i := getchar(a) while a<>separator do if mode=4 then begin comment tab mode checks ; if i=6 then htno := htno+1 else if i=5 then begin if htno>ht then begin error(8,0) ; erroroutput ; end ; htno := 0 ; end end ; COMMAND: incommand := bsilgl := name := true ; order := order1 := 0 ; for i := 1 step 1 until 2 do begin for j := getchar(a) while a = 32 do ; a1 := if a<96 then a add 32 else a ; order1 := order1 shift 8 add a1 ; order := order shift 8 add a ; if a=separator then begin comment end separator met before valid command read; error(7,order shift 8 add 32); goto COMMEND end; if j <> 10 then name := false ;comment char not digit ; end ; order1 := order1 shift 8 ; order := order shift 8 ; comment as for string with chars left justified,and padded out with zeroes ; for cmdposn := 1 step 1 until 28 do if order1 = commandname(cmdposn) then goto ACTION ; if -, name then error(7,order add 32) ; \f comment either illegal command or -name- to come here ; for i := getchar(a) while a<> separator do if a <> 32 and i <> 10 then name := false ; comment only digits and spaces valid ; if name then begin for i := p,i-1 while line(i) extract 12 <> separator,i do line(i) :=false ; end else footfall; goto COMMEND ; ACTION: routine:=actionb(cmdposn); case routine of begin begin comment 1 RJ,SJ,CT,TA commeands ; if mode=4 then begin if htno>ht then error(8,order add 32) ; htno := 0 ; end check for no of HTs in line ; mode := cmdposn ; comment set new mode ; if mode=4 then begin comment TA command ; htno := 0 ; ht := -1 ; comment no of tabs per line ; vterm := true ; for ht := ht+1 while vterm do if -, number(int,vterm,term) then goto DATAERR ; if term<>separator or ht>24 then goto DATAERR ; end else goto ENDSEPARATOR end ; ENDSEPARATOR: begin comment SC commands ; for i := getchar(a) while a<>separator do if a<>32 then goto CHARERR ; comment only spaces valid ; end ; begin comment 3 NL,NP command ; if number(int,vterm,term) and int<0 or term<>separator then goto DATAERR end ; begin comment 4 FT,TS,LW,LD,SL commands ; if cmdposn=28 then cmdposn:=12; minval := case cmdposn-ftposn of (minfont,minTS,minlw,minlead) ; maxval := case cmdposn-ftposn of (maxfont,maxTS,maxlw,maxlead) ; comment values set up at initialisation depending on typesetting machine ; if -, number(int,vterm,term) or int<minval or int>maxval or term<>separator then goto DATAERR ; end ; \f begin comment 5 PS command ; PGrec := true ; if mode=4 then begin if htno>ht then error(8,order add 32) ; htno := 0 end ; if number(int,vterm,term) then begin if int<0 then goto DATAERR end; if vterm then begin if number(int,vterm,term) and int<0 then goto DATAERR end; if term<>separator then goto DATAERR; end ; begin comment 6 SE command ; for i := getchar(a) while a= 32 do ; if cmdposn=27 and a=separator then goto N; if a<32 or a=45 or a=95 or a=126 then goto CHARERR ; comment non-graphic, hyphen, underline and overline are illegal ; j := a ; for i := getchar(a) while a=32 do ; if a<>separator then goto CHARERR ; if cmdposn=15 then separator := j ; N: end ; begin comment 7 PL command ; integer array arg(1:5) ; for j := 1 step 1 until 5 do arg(j) := case j of (297,30,235,18,10) ; comment set standard arguments ; for j := 1 step 1 until 4 do begin if number(int,vterm,term) then begin arg(j) := int ; if int<0 then goto DATAERR ; end ; if -, vterm then goto DATAERR ; end ; if number(int,vterm,term) then arg(5) := int ; if arg(5)<0 then goto DATAERR ; if term<>separator or arg(5)>arg(4) or arg(2)<arg(4) then goto DATAERR ; end ; \f begin comment 8 PN command ; if -,number(int,vterm,term) or int<0 or int>5 then goto DATAERR ; comment check position ; if -, number(int,vterm,term) or term<>separator or int<0 then goto DATAERR ; comment page number must be positive; end ; begin comment 9 RH command ; for j := getchar(a) while a=32 do ; if a<>separator then begin reread := true ; goto FN end end ; FN: begin comment 10 FN,MT commands ; if -, number(int,vterm,term) or int<minfont or int> maxfont or -, vterm then error(2,order add 32) ; comment test for font ; goto CM end ; CM: begin comment 11 CM command ; bsilgl := wrong := false ; j := 0 ; for k := getchar(a) while a<>separator do if k=5 then j := j+1; if (order1=real <:rh:> shift (-24) extract 24 and j>3) or (order1=real <:mt:> shift (-24) extract 24 and j>0) or (order1=real<:ns:> shift (-24) extract 24 and j>0) then error(4,order add 32) ; comment 3 nl valid in RH text,0 valid in MT+NS text ; if wrong then footfall; end ; begin comment 12 RO command ; error(5,order add 32) ; goto ENDSEPARATOR end invalid RO command ; begin comment 13 EF command ; efrec := true ; if mode=4 then begin if htno>ht then error(8,order add 32) ; htno := 0 ; end ; for i := getchar(a) while a=32 do ; if a<>separator then error(2,order add 32) ; for i := getchar(a) while i=i do ; comment check EF command and read to em which causes jump to EXIT1 ; end ; \f LM: begin comment 14 LM commands ; if -, number(int,vterm,term) or int<0 or term<>separator then goto DATAERR end ; begin comment 15 FG command ; if mode=4 then begin if htno>ht then error(8,order add 32) ; htno := 0 ; end ; goto LM end ; begin comment 16 NS command; if -,number(int,vterm,term) or -,vterm or int<minfont or int>maxfont then goto DATAERR; comment check font; if -,number(int,vterm,term) or -,vterm or int<1 then goto DATAERR; comment check linefeed parameter; goto CM; comment check textstring; end; begin comment 17 SB command; if -,number(int,vterm,term) then begin comment char,parameter expected; if term<32 then goto DATAERR; comment nonprintable; number(int,vterm,term); comment to read terminator; if -,vterm or -,number(int,vterm,term) then goto DATAERR; end else if vterm then begin if -,number(int,vterm,term) then goto DATAERR end numeric char; comment now checkvalue of parameter; if int<1 or int>17 or term<>separator then goto DATAERR end; DATAERR: begin error(2,order add 32) ; if term <> separator then for i := getchar(a) while a <> separator do ; footfall; end ; CHARERR: begin error(2,order add 32) ; for i := getchar(a) while a <> separator do ; footfall; end ; end of case statement : actions for commands and error11 and error2 ; \f COMMEND: incommand := bsilgl := nlrec:=false ; comment outside command; for i := getchar(a) while a = 32 or i = 5 do if i=5 then nlrec:=true ;comment spaces and nl chars ignored between commands ; if a = separator then goto COMMAND ; if nlrec & mode=4 then begin if htno>ht then begin error(8,0); erroroutput end; htno:=0 end; if group1 then begin group1 := false ; if -, PGrec then error(9,0) end ; reread := true ; goto DATAREAD ; comment return to scanning text ; EXIT1: if -, efrec then error(10,0) ; EXIT2: outline ; if A <> 0 then erroroutput ; nl(1) := real <:<25>:> ; comment em ; outdata(output,pointer1,nl,1,1) ; for i := pointer1 step 1 until 128 do output(i) := 0.0 shift (-12) ; comment fill block with nulls ; nl(1) := real <:<10><25>:> ; comment nl and em ; if print then begin outdata(text,pointer2,nl,1,1 ) ; for i := pointer2 step 1 until 128 do text(i) := 0.0 shift (-12) ; comment fill block with nulls ; end ; EXIT3: write(out,<:<10>input syntax check end. :>) ; systime(1,0,t1) ; write(out,<< zd dd dd>,systime(2,t1,t2),t2,<:<10>:>) ; terminate(0); end ; end ▶EOF◀