From bcad568d15f3bfdfc4b7c3768ecd27023a7ac94a Mon Sep 17 00:00:00 2001 From: brian Date: Fri, 21 May 2004 01:53:40 -0700 Subject: [PATCH] more conflict resolution darcs-hash:20040521085340-24bed-61aa11b54ca9823def51216b7f4cbaadc666a1c1.gz --- Makefile | 6 +- upstream/Makefile | 36 +- upstream/build/tex/tangle.p | 790 ------------------------------------------- upstream/build/tex/tex.ch | 690 ------------------------------------- 4 files changed, 7 insertions(+), 1515 deletions(-) delete mode 100644 upstream/build/tex/tangle.p delete mode 100644 upstream/build/tex/tex.ch diff --git a/Makefile b/Makefile index 677899d..4692fec 100644 --- a/Makefile +++ b/Makefile @@ -199,10 +199,9 @@ tex.jar: $(mips_objects) $(runtime_classes:%=build/org/ibex/nestedvm/%.class) up echo -e "Manifest-Version: 1.0\nMain-Class: TeX\n" > .manifest cp upstream/build/tex/TeX.class build cd build && jar cfm ../$@ ../.manifest \ - TeX.class \ $(runtime_classes:%=org/ibex/nestedvm/%.class) \ - org/ibex/nestedvm/*.class \ - org/ibex/nestedvm/util/*.class + org/ibex/nestedvm/Runtime\$$*.class \ + org/ibex/nestedvm/util/Seekable\$$*.class runtime.jar: $(runtime_classes:%=build/org/ibex/nestedvm/%.class) cd build && jar cf ../$@ \ @@ -427,7 +426,6 @@ doc/charts/%.pdf: doc/charts/%.dat doc/charts/%.gnuplot tex := java -cp $(usr)/../../build:.. TeX -#tex := java -cp $(usr)/../../build:.. org.ibex.nestedvm.Interpreter ../tex.mips doc/ivme04.pdf: doc/ivme04.tex doc/acmconf.cls $(charts:%.dat=%.pdf) tex.jar upstream/tasks/extract_texinputs cp upstream/build/tex/tex.pool upstream/build/tex/texinputs/tex.pool cd upstream/build/tex/texinputs; echo '\latex.ltx' | $(tex) diff --git a/upstream/Makefile b/upstream/Makefile index d3c840f..aa22d6a 100644 --- a/upstream/Makefile +++ b/upstream/Makefile @@ -1,13 +1,12 @@ # Inspired by XWT's Makefile.upstream version_gcc = 3.3 -version_gpc = 20030830 -version_texinputs = 1.0 + url_gcc-core = http://mirrors.rcn.net/pub/sourceware/gcc/releases/gcc-$(version_gcc)/gcc-core-$(version_gcc).tar.gz url_gcc-c++ = http://mirrors.rcn.net/pub/sourceware/gcc/releases/gcc-$(version_gcc)/gcc-g++-$(version_gcc).tar.gz patches_gcc = gcc-fixes.patch gcc-fdata-sections-bss.patch configure_gcc = --target=mips-unknown-elf --disable-threads --with-gnu-ld --with-gnu-as --with-newlib=yes --enable-sjlj-exceptions --enable-languages="c" -configure_gcc_step2 = $(configure_gcc) --enable-languages="c,c++" +configure_gcc_step2 = $(configure_gcc) --enable-languages="c,c++,f77" version_gpc = 20030830 url_gpc = http://www.gnu-pascal.de/alpha/gpc-$(version_gpc).tar.gz @@ -86,6 +85,9 @@ gpc_flags += -Wl,-T,$(usr)/mips-unknown-elf/lib/linker.ld # FIXME ugly path hacks evil bad nestedvm := java -cp $(usr)/../build/bcel/bcel-5.1.jar:$(usr)/../../build org.ibex.nestedvm.Compiler -outformat class +version_texinputs = 1.0 +url_texinputs = http://www.megacz.com/tmp/texinputs-$(version_texinputs).tgz + tasks/download_tex: ; mkdir -p build/tex; touch $@ build/tex/tex.web: ; curl -o $@ http://www.math.uni.wroc.pl/~hebisch/tex_p/tex.web build/dtex/tangle.p: ; curl http://www.gnu-pascal.de/crystal/gpc/en/attachments/5593/tangle.p.gz | zcat > $@ @@ -111,17 +113,6 @@ tasks/extract_texinputs: tasks/build_tex tasks/download_texinputs cd build/tex; tar xvzf ../../download/texinputs-1.0.tgz touch $@ -tasks/extract_linpack: tasks/download_linpack ; touch $@ -tasks/download_linpack: - mkdir -p build/linpack - cd build/linpack; wget -N http://www.math.iastate.edu/burkardt/f_src/linpack_bench/linpack_bench.f - touch $@ - -tasks/build_linpack: tasks/full_toolchain tasks/extract_linpack - cd build/linpack; $(g77) linpack_bench.f $(g77_flags) -o linpack.mips - cd build/linpack; $(nestedvm) -o unixruntime -outfile Linpack.class Linpack linpack.mips - touch $@ - tasks/download_%: if [ -z "$(url_$*)" ]; then echo "No url for $*" >&2; false; fi mkdir -p download @@ -161,23 +152,6 @@ tasks/build_%: tasks/patch_% touch $@ tasks/build_gcc_step2: tasks/patch_gcc tasks/build_libc - for f in crt0.o support.o support_aux.o; do \ - rm -f "$(usr)/mips-unknown-elf/lib/$$f"; \ - ln -s "$(root)/build/org/ibex/nestedvm/$$f" "$(usr)/mips-unknown-elf/lib/$$f"; \ - done - - rm -f "$(usr)/mips-unknown-elf/lib/linker.ld" - ln -s "$(root)/src/org/ibex/nestedvm/linker.ld" "$(usr)/mips-unknown-elf/lib/linker.ld" - - if [ ! -e "$(usr)/mips-unknown-elf/include/getopt.h" ]; then \ - echo '#include ' > "$(usr)/mips-unknown-elf/include/getopt.h"; \ - fi - - mips-unknown-elf-gcc -dumpspecs \ - | sed '/startfile:$$/{n;s/crt0%O%s/crt0%O%s support%O%s support_aux%O%s/;};' \ - | sed '/link_command:$$/{n;s/%{T\*}/%{T*} %{!T:-T linker.ld%s}/;};' \ - > "$(usr)/lib/gcc-lib/mips-unknown-elf/$(version_gcc)/specs" - mkdir -p $(usr) mkdir -p build/gcc-obj && cd build/gcc-obj && \ echo | ../gcc-$(version_gcc)/configure --prefix=$(usr) $(configure_gcc_step2) && \ diff --git a/upstream/build/tex/tangle.p b/upstream/build/tex/tangle.p deleted file mode 100644 index dae682c..0000000 --- a/upstream/build/tex/tangle.p +++ /dev/null @@ -1,790 +0,0 @@ -program TANGLE(webfile,changefile,Pascalfile,pool);label 9999;const{8:} -bufsize=100;maxbytes=45000;maxtoks=50000;maxnames=4000;maxtexts=2000; -hashsize=353;longestname=400;linelength=72;outbufsize=144;stacksize=50; -maxidlength=12;unambiglength=7;{:8}type{11:}ASCIIcode=0..255;{:11}{12:} -{:12}{37:}eightbits=0..255; -sixteenbits=0..65535;{:37}{39:}namepointer=0..maxnames;{:39}{43:} -textpointer=0..maxtexts;{:43}{78:} -outputstate=record endfield:sixteenbits;bytefield:sixteenbits; -namefield:namepointer;replfield:textpointer;modfield:0..12287;end;{:78} -var{9:}history:0..3;{:9}{13:}xord:array[char]of ASCIIcode; -xchr:array[ASCIIcode]of char;{:13}{20:}termout:text;{:20}{23:} -webfile:text;changefile:text;{:23}{25:}Pascalfile:text; -pool:text;{:25}{27:}buffer:array[0..bufsize]of ASCIIcode;{:27}{29:} -phaseone:boolean;{:29}{38:} -bytemem:packed array[0..1,0..maxbytes]of ASCIIcode; -tokmem:packed array[0..2,0..maxtoks]of eightbits; -bytestart:array[0..maxnames]of sixteenbits; -tokstart:array[0..maxtexts]of sixteenbits; -link:array[0..maxnames]of sixteenbits; -ilk:array[0..maxnames]of sixteenbits; -equiv:array[0..maxnames]of sixteenbits; -textlink:array[0..maxtexts]of sixteenbits;{:38}{40:}nameptr:namepointer; -stringptr:namepointer;byteptr:array[0..1]of 0..maxbytes; -poolchecksum:integer;{:40}{44:}textptr:textpointer; -tokptr:array[0..2]of 0..maxtoks;z:0..2; -{maxtokptr:array[0..2]of 0..maxtoks;}{:44}{50:}idfirst:0..bufsize; -idloc:0..bufsize;doublechars:0..bufsize; -hash,chophash:array[0..hashsize]of sixteenbits; -choppedid:array[0..unambiglength]of ASCIIcode;{:50}{65:} -modtext:array[0..longestname]of ASCIIcode;{:65}{70:} -lastunnamed:textpointer;{:70}{79:}curstate:outputstate; -stack:array[1..stacksize]of outputstate;stackptr:0..stacksize;{:79}{80:} -zo:0..2;{:80}{82:}bracelevel:eightbits;{:82}{86:}curval:integer;{:86} -{94:}outbuf:array[0..outbufsize]of ASCIIcode;outptr:0..outbufsize; -breakptr:0..outbufsize;semiptr:0..outbufsize;{:94}{95:} -outstate:eightbits;outval,outapp:integer;outsign:ASCIIcode; -lastsign:-1..+1;{:95}{100:}outcontrib:array[1..linelength]of ASCIIcode; -{:100}{124:}ii:integer;line:integer;otherline:integer;templine:integer; -limit:0..bufsize;loc:0..bufsize;inputhasended:boolean;changing:boolean; -{:124}{126:}changebuffer:array[0..bufsize]of ASCIIcode; -changelimit:0..bufsize;{:126}{143:}curmodule:namepointer; -scanninghex:boolean;{:143}{156:}nextcontrol:eightbits;{:156}{164:} -currepltext:textpointer;{:164}{171:}modulecount:0..12287;{:171}{179:} -{troubleshooting:boolean;ddt:integer;dd:integer;debugcycle:integer; -debugskipped:integer;termin:text;}{:179}{185:}{wo:0..1;}{:185}{30:} -{procedure debughelp;forward;}{:30}{31:}procedure error; -var j:0..outbufsize;k,l:0..bufsize;begin if phaseone then{32:} -begin if changing then write(termout,'. (change file ')else write( -termout,'. (');writeln(termout,'l.',line:1,')'); -if loc>=limit then l:=limit else l:=loc; -for k:=1 to l do if buffer[k-1]=9 then write(termout,' ')else write( -termout,xchr[buffer[k-1]]);writeln(termout); -for k:=1 to l do write(termout,' '); -for k:=l+1 to limit do write(termout,xchr[buffer[k-1]]); -write(termout,' ');end{:32}else{33:} -begin writeln(termout,'. (l.',line:1,')'); -for j:=1 to outptr do write(termout,xchr[outbuf[j-1]]); -write(termout,'... ');end{:33};{break(termout);}history:=2; -{debugskipped:=debugcycle;debughelp;}end;{:31}{34:}procedure jumpout; -begin goto 9999;end;{:34}procedure initialize;var{16:}i:0..255;{:16} -{41:}wi:0..1;{:41}{45:}zi:0..2;{:45}{51:}h:0..hashsize;{:51}begin{10:} -history:=0;{:10}{14:}xchr[32]:=' ';xchr[33]:='!';xchr[34]:='"'; -xchr[35]:='#';xchr[36]:='$';xchr[37]:='%';xchr[38]:='&';xchr[39]:=''''; -xchr[40]:='(';xchr[41]:=')';xchr[42]:='*';xchr[43]:='+';xchr[44]:=','; -xchr[45]:='-';xchr[46]:='.';xchr[47]:='/';xchr[48]:='0';xchr[49]:='1'; -xchr[50]:='2';xchr[51]:='3';xchr[52]:='4';xchr[53]:='5';xchr[54]:='6'; -xchr[55]:='7';xchr[56]:='8';xchr[57]:='9';xchr[58]:=':';xchr[59]:=';'; -xchr[60]:='<';xchr[61]:='=';xchr[62]:='>';xchr[63]:='?';xchr[64]:='@'; -xchr[65]:='A';xchr[66]:='B';xchr[67]:='C';xchr[68]:='D';xchr[69]:='E'; -xchr[70]:='F';xchr[71]:='G';xchr[72]:='H';xchr[73]:='I';xchr[74]:='J'; -xchr[75]:='K';xchr[76]:='L';xchr[77]:='M';xchr[78]:='N';xchr[79]:='O'; -xchr[80]:='P';xchr[81]:='Q';xchr[82]:='R';xchr[83]:='S';xchr[84]:='T'; -xchr[85]:='U';xchr[86]:='V';xchr[87]:='W';xchr[88]:='X';xchr[89]:='Y'; -xchr[90]:='Z';xchr[91]:='[';xchr[92]:='\';xchr[93]:=']';xchr[94]:='^'; -xchr[95]:='_';xchr[96]:='`';xchr[97]:='a';xchr[98]:='b';xchr[99]:='c'; -xchr[100]:='d';xchr[101]:='e';xchr[102]:='f';xchr[103]:='g'; -xchr[104]:='h';xchr[105]:='i';xchr[106]:='j';xchr[107]:='k'; -xchr[108]:='l';xchr[109]:='m';xchr[110]:='n';xchr[111]:='o'; -xchr[112]:='p';xchr[113]:='q';xchr[114]:='r';xchr[115]:='s'; -xchr[116]:='t';xchr[117]:='u';xchr[118]:='v';xchr[119]:='w'; -xchr[120]:='x';xchr[121]:='y';xchr[122]:='z';xchr[123]:='{'; -xchr[124]:='|';xchr[125]:='}';xchr[126]:='~';xchr[0]:=' '; -xchr[127]:=' ';{:14}{17:}for i:=1 to 31 do xchr[i]:=' '; -for i:=128 to 255 do xchr[i]:=' ';{:17}{18:} -for i:=0 to 255 do xord[chr(i)]:=32;for i:=1 to 255 do xord[xchr[i]]:=i; -xord[' ']:=32;{:18}{21:}rewrite(termout,'TTY:');{:21}{26:} -rewrite(Pascalfile);rewrite(pool);{:26}{42:} -for wi:=0 to 1 do begin bytestart[wi]:=0;byteptr[wi]:=0;end; -bytestart[2]:=0;nameptr:=1;stringptr:=256;poolchecksum:=271828;{:42} -{46:}for zi:=0 to 2 do begin tokstart[zi]:=0;tokptr[zi]:=0;end; -tokstart[3]:=0;textptr:=1;z:=1 mod 3;{:46}{48:}ilk[0]:=0;equiv[0]:=0; -{:48}{52:}for h:=0 to hashsize-1 do begin hash[h]:=0;chophash[h]:=0;end; -{:52}{71:}lastunnamed:=0;textlink[0]:=0;{:71}{144:}scanninghex:=false; -{:144}{152:}modtext[0]:=32;{:152}{180:}{troubleshooting:=true; -debugcycle:=1;debugskipped:=0;troubleshooting:=false;debugcycle:=99999; -reset(termin,'TTY:','/I');}{:180}end;{:2}{24:}procedure openinput; -begin reset(webfile);reset(changefile);end;{:24}{28:} -function inputln(var f:text):boolean;var finallimit:0..bufsize; -begin limit:=0;finallimit:=0; -if eof(f)then inputln:=false else begin while not eoln(f)do begin buffer -[limit]:=xord[f^];get(f);limit:=limit+1; -if buffer[limit-1]<>32 then finallimit:=limit; -if limit=bufsize then begin while not eoln(f)do get(f);limit:=limit-1; -if finallimit>limit then finallimit:=limit;begin writeln(termout); -write(termout,'! Input line too long');end;loc:=0;error;end;end; -readln(f);limit:=finallimit;inputln:=true;end;end;{:28}{49:} -procedure printid(p:namepointer);var k:0..maxbytes;w:0..1; -begin if p>=nameptr then write(termout,'IMPOSSIBLE')else begin w:=p mod -2; -for k:=bytestart[p]to bytestart[p+2]-1 do write(termout,xchr[bytemem[w,k -]]);end;end;{:49}{53:}function idlookup(t:eightbits):namepointer; -label 31,32;var c:eightbits;i:0..bufsize;h:0..hashsize;k:0..maxbytes; -w:0..1;l:0..bufsize;p,q:namepointer;s:0..unambiglength; -begin l:=idloc-idfirst;{54:}h:=buffer[idfirst];i:=idfirst+1; -while i0 do begin if bytestart[p+2]-bytestart[p]=l then{56:} -begin i:=idfirst;k:=bytestart[p];w:=p mod 2; -while(i0)then{57:} -begin if((p<>nameptr)and(t<>0)and(ilk[p]=0))or((p=nameptr)and(t=0)and( -buffer[idfirst]<>34))then{58:}begin i:=idfirst;s:=0;h:=0; -while(i95 then begin -if buffer[i]>=97 then choppedid[s]:=buffer[i]-32 else choppedid[s]:= -buffer[i];h:=(h+h+choppedid[s])mod hashsize;s:=s+1;end;i:=i+1;end; -choppedid[s]:=0;end{:58};if p<>nameptr then{59:} -begin if ilk[p]=0 then begin if t=1 then begin writeln(termout); -write(termout,'! This identifier has already appeared');error;end;{60:} -q:=chophash[h]; -if q=p then chophash[h]:=equiv[p]else begin while equiv[q]<>p do q:= -equiv[q];equiv[q]:=equiv[p];end{:60};end else begin writeln(termout); -write(termout,'! This identifier was defined before');error;end; -ilk[p]:=t;end{:59}else{61:} -begin if(t=0)and(buffer[idfirst]<>34)then{62:}begin q:=chophash[h]; -while q<>0 do begin{63:}begin k:=bytestart[q];s:=0;w:=q mod 2; -while(k95 then begin if c>=97 then c:=c-32; -if choppedid[s]<>c then goto 32;s:=s+1;end;k:=k+1;end; -if(k=bytestart[q+2])and(choppedid[s]<>0)then goto 32; -begin writeln(termout);write(termout,'! Identifier conflict with ');end; -for k:=bytestart[q]to bytestart[q+2]-1 do write(termout,xchr[bytemem[w,k -]]);error;q:=0;32:end{:63};q:=equiv[q];end;equiv[p]:=chophash[h]; -chophash[h]:=p;end{:62};w:=nameptr mod 2;k:=byteptr[w]; -if k+l>maxbytes then begin writeln(termout); -write(termout,'! Sorry, ','byte memory',' capacity exceeded');error; -history:=3;jumpout;end; -if nameptr>maxnames-2 then begin writeln(termout); -write(termout,'! Sorry, ','name',' capacity exceeded');error;history:=3; -jumpout;end;i:=idfirst;while i34 then ilk[p]:=t else{64:} -begin ilk[p]:=1; -if l-doublechars=2 then equiv[p]:=buffer[idfirst+1]+32768 else begin -equiv[p]:=stringptr+32768;l:=l-doublechars-1; -if l>99 then begin writeln(termout); -write(termout,'! Preprocessed string is too long');error;end; -stringptr:=stringptr+1;write(pool,xchr[48+l div 10],xchr[48+l mod 10]); -poolchecksum:=poolchecksum+poolchecksum+l; -while poolchecksum>536870839 do poolchecksum:=poolchecksum-536870839; -i:=idfirst+1;while i536870839 do poolchecksum:=poolchecksum-536870839; -if(buffer[i]=34)or(buffer[i]=64)then i:=i+2 else i:=i+1;end; -writeln(pool);end;end{:64};end{:61};end{:57};idlookup:=p;end;{:53}{66:} -function modlookup(l:sixteenbits):namepointer;label 31;var c:0..4; -j:0..longestname;k:0..maxbytes;w:0..1;p:namepointer;q:namepointer; -begin c:=2;q:=0;p:=ilk[0];while p<>0 do begin{68:}begin k:=bytestart[p]; -w:=p mod 2;c:=1;j:=1; -while(kl then c:=1 else c:=4 else if j>l then c:=3 -else if modtext[j]maxbytes then begin writeln(termout); -write(termout,'! Sorry, ','byte memory',' capacity exceeded');error; -history:=3;jumpout;end; -if nameptr>maxnames-2 then begin writeln(termout); -write(termout,'! Sorry, ','name',' capacity exceeded');error;history:=3; -jumpout;end;p:=nameptr;if c=0 then link[q]:=p else ilk[q]:=p;link[p]:=0; -ilk[p]:=0;c:=1;equiv[p]:=0; -for j:=1 to l do bytemem[w,k+j-1]:=modtext[j];byteptr[w]:=k+l; -bytestart[nameptr+2]:=k+l;nameptr:=nameptr+1;{:67}; -31:if c<>1 then begin begin writeln(termout); -write(termout,'! Incompatible section names');error;end;p:=0;end; -modlookup:=p;end;{:66}{69:} -function prefixlookup(l:sixteenbits):namepointer;var c:0..4; -count:0..maxnames;j:0..longestname;k:0..maxbytes;w:0..1;p:namepointer; -q:namepointer;r:namepointer;begin q:=0;p:=ilk[0];count:=0;r:=0; -while p<>0 do begin{68:}begin k:=bytestart[p];w:=p mod 2;c:=1;j:=1; -while(kl then c:=1 else c:=4 else if j>l then c:=3 -else if modtext[j]1 then if count=0 then begin writeln(termout); -write(termout,'! Name does not match');error; -end else begin writeln(termout);write(termout,'! Ambiguous prefix'); -error;end;prefixlookup:=r;end;{:69}{73:} -procedure storetwobytes(x:sixteenbits); -begin if tokptr[z]+2>maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=x div 256; -tokmem[z,tokptr[z]+1]:=x mod 256;tokptr[z]:=tokptr[z]+2;end;{:73}{74:} -{procedure printrepl(p:textpointer);var k:0..maxtoks;a:sixteenbits; -zp:0..2; -begin if p>=textptr then write(termout,'BAD')else begin k:=tokstart[p]; -zp:=p mod 3;while k=128 then[75:]begin k:=k+1; -if a<168 then begin a:=(a-128)*256+tokmem[zp,k];printid(a); -if bytemem[a mod 2,bytestart[a]]=34 then write(termout,'"')else write( -termout,' ');end else if a<208 then begin write(termout,'@<'); -printid((a-168)*256+tokmem[zp,k]);write(termout,'@>'); -end else begin a:=(a-208)*256+tokmem[zp,k]; -write(termout,'@',xchr[123],a:1,'@',xchr[125]);end; -end[:75]else[76:]case a of 9:write(termout,'@',xchr[123]); -10:write(termout,'@',xchr[125]);12:write(termout,'@'''); -13:write(termout,'@"');125:write(termout,'@$');0:write(termout,'#'); -64:write(termout,'@@');2:write(termout,'@=');3:write(termout,'@\'); -else write(termout,xchr[a])end[:76];k:=k+1;end;end;end;}{:74}{84:} -procedure pushlevel(p:namepointer); -begin if stackptr=stacksize then begin writeln(termout); -write(termout,'! Sorry, ','stack',' capacity exceeded');error; -history:=3;jumpout;end else begin stack[stackptr]:=curstate; -stackptr:=stackptr+1;curstate.namefield:=p;curstate.replfield:=equiv[p]; -zo:=curstate.replfield mod 3; -curstate.bytefield:=tokstart[curstate.replfield]; -curstate.endfield:=tokstart[curstate.replfield+3];curstate.modfield:=0; -end;end;{:84}{85:}procedure poplevel;label 10; -begin if textlink[curstate.replfield]=0 then begin if ilk[curstate. -namefield]=3 then{91:}begin nameptr:=nameptr-1;textptr:=textptr-1; -z:=textptr mod 3;{if tokptr[z]>maxtokptr[z]then maxtokptr[z]:=tokptr[z]; -}tokptr[z]:=tokstart[textptr]; -{byteptr[nameptr mod 2]:=byteptr[nameptr mod 2]-1;}end{:91}; -end else if textlink[curstate.replfield]0 then begin curstate:=stack[stackptr]; -zo:=curstate.replfield mod 3;end;10:end;{:85}{87:} -function getoutput:sixteenbits;label 20,30,31;var a:sixteenbits; -b:eightbits;bal:sixteenbits;k:0..maxbytes;w:0..1; -begin 20:if stackptr=0 then begin a:=0;goto 31;end; -if curstate.bytefield=curstate.endfield then begin curval:=-curstate. -modfield;poplevel;if curval=0 then goto 20;a:=129;goto 31;end; -a:=tokmem[zo,curstate.bytefield]; -curstate.bytefield:=curstate.bytefield+1;if a<128 then if a=0 then{92:} -begin pushlevel(nameptr-1);goto 20;end{:92}else goto 31; -a:=(a-128)*256+tokmem[zo,curstate.bytefield]; -curstate.bytefield:=curstate.bytefield+1;if a<10240 then{89:} -begin case ilk[a]of 0:begin curval:=a;a:=130;end; -1:begin curval:=equiv[a]-32768;a:=128;end;2:begin pushlevel(a);goto 20; -end;3:begin{90:} -while(curstate.bytefield=curstate.endfield)and(stackptr>0)do poplevel; -if(stackptr=0)or(tokmem[zo,curstate.bytefield]<>40)then begin begin -writeln(termout);write(termout,'! No parameter given for ');end; -printid(a);error;goto 20;end;{93:}bal:=1; -curstate.bytefield:=curstate.bytefield+1; -while true do begin b:=tokmem[zo,curstate.bytefield]; -curstate.bytefield:=curstate.bytefield+1; -if b=0 then storetwobytes(nameptr+32767)else begin if b>=128 then begin -begin if tokptr[z]=maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=b;tokptr[z]:=tokptr[z]+1; -end;b:=tokmem[zo,curstate.bytefield]; -curstate.bytefield:=curstate.bytefield+1; -end else case b of 40:bal:=bal+1;41:begin bal:=bal-1; -if bal=0 then goto 30;end; -39:repeat begin if tokptr[z]=maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=b;tokptr[z]:=tokptr[z]+1; -end;b:=tokmem[zo,curstate.bytefield]; -curstate.bytefield:=curstate.bytefield+1;until b=39;else end; -begin if tokptr[z]=maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=b;tokptr[z]:=tokptr[z]+1; -end;end;end;30:{:93};equiv[nameptr]:=textptr;ilk[nameptr]:=2; -w:=nameptr mod 2;k:=byteptr[w]; -{if k=maxbytes then begin writeln(termout); -write(termout,'! Sorry, ','byte memory',' capacity exceeded');error; -history:=3;jumpout;end;bytemem[w,k]:=35;k:=k+1;byteptr[w]:=k;} -if nameptr>maxnames-2 then begin writeln(termout); -write(termout,'! Sorry, ','name',' capacity exceeded');error;history:=3; -jumpout;end;bytestart[nameptr+2]:=k;nameptr:=nameptr+1; -if textptr>maxtexts-3 then begin writeln(termout); -write(termout,'! Sorry, ','text',' capacity exceeded');error;history:=3; -jumpout;end;textlink[textptr]:=0;tokstart[textptr+3]:=tokptr[z]; -textptr:=textptr+1;z:=textptr mod 3{:90};pushlevel(a);goto 20;end; -else begin writeln(termout); -write(termout,'! This can''t happen (','output',')');error;history:=3; -jumpout;end end;goto 31;end{:89};if a<20480 then{88:}begin a:=a-10240; -if equiv[a]<>0 then pushlevel(a)else if a<>0 then begin begin writeln( -termout);write(termout,'! Not present: <');end;printid(a); -write(termout,'>');error;end;goto 20;end{:88};curval:=a-20480;a:=129; -curstate.modfield:=curval;31:{if troubleshooting then debughelp;} -getoutput:=a;end;{:87}{97:}procedure flushbuffer;var k:0..outbufsize; -b:0..outbufsize;begin b:=breakptr; -if(semiptr<>0)and(outptr-semiptr<=linelength)then breakptr:=semiptr; -for k:=1 to breakptr do write(Pascalfile,xchr[outbuf[k-1]]); -writeln(Pascalfile);line:=line+1; -if line mod 100=0 then begin write(termout,'.'); -if line mod 500=0 then write(termout,line:1);{break(termout);}end; -if breakptrb then b:=breakptr;end; -for k:=breakptr to outptr-1 do outbuf[k-breakptr]:=outbuf[k];end; -outptr:=outptr-breakptr;breakptr:=b-breakptr;semiptr:=0; -if outptr>linelength then begin begin writeln(termout); -write(termout,'! Long line must be truncated');error;end; -outptr:=linelength;end;end;{:97}{99:}procedure appval(v:integer); -var k:0..outbufsize;begin k:=outbufsize;repeat outbuf[k]:=v mod 10; -v:=v div 10;k:=k-1;until v=0;repeat k:=k+1; -begin outbuf[outptr]:=outbuf[k]+48;outptr:=outptr+1;end; -until k=outbufsize;end;{:99}{101:}procedure sendout(t:eightbits; -v:sixteenbits);label 20;var k:0..linelength;begin{102:} -20:case outstate of 1:if t<>3 then begin breakptr:=outptr; -if t=2 then begin outbuf[outptr]:=32;outptr:=outptr+1;end;end; -2:begin begin outbuf[outptr]:=44-outapp;outptr:=outptr+1;end; -if outptr>linelength then flushbuffer;breakptr:=outptr;end; -3,4:begin{103:} -if(outval<0)or((outval=0)and(lastsign<0))then begin outbuf[outptr]:=45; -outptr:=outptr+1; -end else if outsign>0 then begin outbuf[outptr]:=outsign; -outptr:=outptr+1;end;appval(abs(outval)); -if outptr>linelength then flushbuffer;{:103};outstate:=outstate-2; -goto 20;end;5:{104:}begin if(t=3)or({105:} -((t=2)and(v=3)and(((outcontrib[1]=68)and(outcontrib[2]=73)and(outcontrib -[3]=86))or((outcontrib[1]=77)and(outcontrib[2]=79)and(outcontrib[3]=68)) -))or((t=0)and((v=42)or(v=47))){:105})then begin{103:} -if(outval<0)or((outval=0)and(lastsign<0))then begin outbuf[outptr]:=45; -outptr:=outptr+1; -end else if outsign>0 then begin outbuf[outptr]:=outsign; -outptr:=outptr+1;end;appval(abs(outval)); -if outptr>linelength then flushbuffer;{:103};outsign:=43;outval:=outapp; -end else outval:=outval+outapp;outstate:=3;goto 20;end{:104}; -0:if t<>3 then breakptr:=outptr;else end{:102}; -if t<>0 then for k:=1 to v do begin outbuf[outptr]:=outcontrib[k]; -outptr:=outptr+1;end else begin outbuf[outptr]:=v;outptr:=outptr+1;end; -if outptr>linelength then flushbuffer; -if(t=0)and((v=59)or(v=125))then begin semiptr:=outptr;breakptr:=outptr; -end;if t>=2 then outstate:=1 else outstate:=0 end;{:101}{106:} -procedure sendsign(v:integer); -begin case outstate of 2,4:outapp:=outapp*v;3:begin outapp:=v; -outstate:=4;end;5:begin outval:=outval+outapp;outapp:=v;outstate:=4;end; -else begin breakptr:=outptr;outapp:=v;outstate:=2;end end; -lastsign:=outapp;end;{:106}{107:}procedure sendval(v:integer); -label 666,10;begin case outstate of 1:begin{110:} -if(outptr=breakptr+3)or((outptr=breakptr+4)and(outbuf[breakptr]=32))then -if((outbuf[outptr-3]=68)and(outbuf[outptr-2]=73)and(outbuf[outptr-1]=86) -)or((outbuf[outptr-3]=77)and(outbuf[outptr-2]=79)and(outbuf[outptr-1]=68 -))then goto 666{:110};outsign:=32;outstate:=3;outval:=v; -breakptr:=outptr;lastsign:=+1;end;0:begin{109:} -if(outptr=breakptr+1)and((outbuf[breakptr]=42)or(outbuf[breakptr]=47)) -then goto 666{:109};outsign:=0;outstate:=3;outval:=v;breakptr:=outptr; -lastsign:=+1;end;{108:}2:begin outsign:=43;outstate:=3;outval:=outapp*v; -end;3:begin outstate:=5;outapp:=v;begin writeln(termout); -write(termout,'! Two numbers occurred without a sign between them'); -error;end;end;4:begin outstate:=5;outapp:=outapp*v;end; -5:begin outval:=outval+outapp;outapp:=v;begin writeln(termout); -write(termout,'! Two numbers occurred without a sign between them'); -error;end;end;{:108}else goto 666 end;goto 10;666:{111:} -if v>=0 then begin if outstate=1 then begin breakptr:=outptr; -begin outbuf[outptr]:=32;outptr:=outptr+1;end;end;appval(v); -if outptr>linelength then flushbuffer;outstate:=1; -end else begin begin outbuf[outptr]:=40;outptr:=outptr+1;end; -begin outbuf[outptr]:=45;outptr:=outptr+1;end;appval(-v); -begin outbuf[outptr]:=41;outptr:=outptr+1;end; -if outptr>linelength then flushbuffer;outstate:=0;end{:111};10:end; -{:107}{113:}procedure sendtheoutput;label 2,21,22;var curchar:eightbits; -k:0..linelength;j:0..maxbytes;w:0..1;n:integer; -begin while stackptr>0 do begin curchar:=getoutput; -21:case curchar of 0:;{116:} -65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88, -89,90:begin outcontrib[1]:=curchar;sendout(2,1);end; -97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115 -,116,117,118,119,120,121,122:begin outcontrib[1]:=curchar-32; -sendout(2,1);end;130:begin k:=0;j:=bytestart[curval];w:=curval mod 2; -while(k=97 then outcontrib[k]:=outcontrib[k]-32 else if -outcontrib[k]=95 then k:=k-1;end;sendout(2,k);end;{:116}{119:} -48,49,50,51,52,53,54,55,56,57:begin n:=0;repeat curchar:=curchar-48; -if n>=214748364 then begin writeln(termout); -write(termout,'! Constant too big');error;end else n:=10*n+curchar; -curchar:=getoutput;until(curchar>57)or(curchar<48);sendval(n);k:=0; -if curchar=101 then curchar:=69;if curchar=69 then goto 2 else goto 21; -end;125:sendval(poolchecksum);12:begin n:=0;curchar:=48; -repeat curchar:=curchar-48;if n>=268435456 then begin writeln(termout); -write(termout,'! Constant too big');error;end else n:=8*n+curchar; -curchar:=getoutput;until(curchar>55)or(curchar<48);sendval(n);goto 21; -end;13:begin n:=0;curchar:=48; -repeat if curchar>=65 then curchar:=curchar-55 else curchar:=curchar-48; -if n>=134217728 then begin writeln(termout); -write(termout,'! Constant too big');error;end else n:=16*n+curchar; -curchar:=getoutput; -until(curchar>70)or(curchar<48)or((curchar>57)and(curchar<65)); -sendval(n);goto 21;end;128:sendval(curval);46:begin k:=1; -outcontrib[1]:=46;curchar:=getoutput; -if curchar=46 then begin outcontrib[2]:=46;sendout(1,2); -end else if(curchar>=48)and(curchar<=57)then goto 2 else begin sendout(0 -,46);goto 21;end;end;{:119}43,45:sendsign(44-curchar);{114:} -4:begin outcontrib[1]:=65;outcontrib[2]:=78;outcontrib[3]:=68; -sendout(2,3);end;5:begin outcontrib[1]:=78;outcontrib[2]:=79; -outcontrib[3]:=84;sendout(2,3);end;6:begin outcontrib[1]:=73; -outcontrib[2]:=78;sendout(2,2);end;31:begin outcontrib[1]:=79; -outcontrib[2]:=82;sendout(2,2);end;24:begin outcontrib[1]:=58; -outcontrib[2]:=61;sendout(1,2);end;26:begin outcontrib[1]:=60; -outcontrib[2]:=62;sendout(1,2);end;28:begin outcontrib[1]:=60; -outcontrib[2]:=61;sendout(1,2);end;29:begin outcontrib[1]:=62; -outcontrib[2]:=61;sendout(1,2);end;30:begin outcontrib[1]:=61; -outcontrib[2]:=61;sendout(1,2);end;32:begin outcontrib[1]:=46; -outcontrib[2]:=46;sendout(1,2);end;{:114}39:{117:}begin k:=1; -outcontrib[1]:=39;repeat if k0 then begin bracelevel:=bracelevel-1; -if bracelevel=0 then sendout(0,125)else sendout(0,93); -end else begin writeln(termout);write(termout,'! Extra @}');error;end; -129:begin if bracelevel=0 then sendout(0,123)else sendout(0,91); -if curval<0 then begin sendout(0,58);sendval(-curval); -end else begin sendval(curval);sendout(0,58);end; -if bracelevel=0 then sendout(0,125)else sendout(0,93);end;{:121} -127:begin sendout(3,0);outstate:=6;end;2:{118:}begin k:=0; -repeat if k0 do begin if outptr<=linelength then breakptr:=outptr; -flushbuffer;end;outstate:=0;end{:122};else begin writeln(termout); -write(termout,'! Can''t output ASCII code ',curchar:1);error;end end; -goto 22;2:{120:}repeat if k69)and((curchar<48)or(curchar>57)); -if k=linelength then begin writeln(termout); -write(termout,'! Fraction too long');error;end;sendout(3,k); -goto 21{:120};22:end;end;{:113}{127:}function linesdontmatch:boolean; -label 10;var k:0..bufsize;begin linesdontmatch:=true; -if changelimit<>limit then goto 10; -if limit>0 then for k:=0 to limit-1 do if changebuffer[k]<>buffer[k]then -goto 10;linesdontmatch:=false;10:end;{:127}{128:} -procedure primethechangebuffer;label 22,30,10;var k:0..bufsize; -begin changelimit:=0;{129:}while true do begin line:=line+1; -if not inputln(changefile)then goto 10;if limit<2 then goto 22; -if buffer[0]<>64 then goto 22; -if(buffer[1]>=88)and(buffer[1]<=90)then buffer[1]:=buffer[1]+32; -if buffer[1]=120 then goto 30; -if(buffer[1]=121)or(buffer[1]=122)then begin loc:=2; -begin writeln(termout);write(termout,'! Where is the matching @x?'); -error;end;end;22:end;30:{:129};{130:}repeat line:=line+1; -if not inputln(changefile)then begin begin writeln(termout); -write(termout,'! Change file ended after @x');error;end;goto 10;end; -until limit>0;{:130};{131:}begin changelimit:=limit; -if limit>0 then for k:=0 to limit-1 do changebuffer[k]:=buffer[k]; -end{:131};10:end;{:128}{132:}procedure checkchange;label 10; -var n:integer;k:0..bufsize;begin if linesdontmatch then goto 10;n:=0; -while true do begin changing:=not changing;templine:=otherline; -otherline:=line;line:=templine;line:=line+1; -if not inputln(changefile)then begin begin writeln(termout); -write(termout,'! Change file ended before @y');error;end;changelimit:=0; -changing:=not changing;templine:=otherline;otherline:=line; -line:=templine;goto 10;end;{133:} -if limit>1 then if buffer[0]=64 then begin if(buffer[1]>=88)and(buffer[1 -]<=90)then buffer[1]:=buffer[1]+32; -if(buffer[1]=120)or(buffer[1]=122)then begin loc:=2; -begin writeln(termout);write(termout,'! Where is the matching @y?'); -error;end;end else if buffer[1]=121 then begin if n>0 then begin loc:=2; -begin writeln(termout); -write(termout,'! Hmm... ',n:1,' of the preceding lines failed to match') -;error;end;end;goto 10;end;end{:133};{131:}begin changelimit:=limit; -if limit>0 then for k:=0 to limit-1 do changebuffer[k]:=buffer[k]; -end{:131};changing:=not changing;templine:=otherline;otherline:=line; -line:=templine;line:=line+1; -if not inputln(webfile)then begin begin writeln(termout); -write(termout,'! WEB file ended during a change');error;end; -inputhasended:=true;goto 10;end;if linesdontmatch then n:=n+1;end; -10:end;{:132}{135:}procedure getline;label 20; -begin 20:if changing then{137:}begin line:=line+1; -if not inputln(changefile)then begin begin writeln(termout); -write(termout,'! Change file ended without @z');error;end;buffer[0]:=64; -buffer[1]:=122;limit:=2;end; -if limit>1 then if buffer[0]=64 then begin if(buffer[1]>=88)and(buffer[1 -]<=90)then buffer[1]:=buffer[1]+32; -if(buffer[1]=120)or(buffer[1]=121)then begin loc:=2; -begin writeln(termout);write(termout,'! Where is the matching @z?'); -error;end;end else if buffer[1]=122 then begin primethechangebuffer; -changing:=not changing;templine:=otherline;otherline:=line; -line:=templine;end;end;end{:137};if not changing then begin{136:} -begin line:=line+1; -if not inputln(webfile)then inputhasended:=true else if limit= -changelimit then if buffer[0]=changebuffer[0]then if changelimit>0 then -checkchange;end{:136};if changing then goto 20;end;loc:=0; -buffer[limit]:=32;end;{:135}{139:} -function controlcode(c:ASCIIcode):eightbits; -begin case c of 64:controlcode:=64;39:controlcode:=12; -34:controlcode:=13;36:controlcode:=125;32,9:controlcode:=136; -42:begin write(termout,'*',modulecount+1:1);{break(termout);} -controlcode:=136;end;68,100:controlcode:=133;70,102:controlcode:=132; -123:controlcode:=9;125:controlcode:=10;80,112:controlcode:=134; -84,116,94,46,58:controlcode:=131;38:controlcode:=127; -60:controlcode:=135;61:controlcode:=2;92:controlcode:=3; -else controlcode:=0 end;end;{:139}{140:}function skipahead:eightbits; -label 30;var c:eightbits; -begin while true do begin if loc>limit then begin getline; -if inputhasended then begin c:=136;goto 30;end;end;buffer[limit+1]:=64; -while buffer[loc]<>64 do loc:=loc+1;if loc<=limit then begin loc:=loc+2; -c:=controlcode(buffer[loc-1]);if(c<>0)or(buffer[loc-1]=62)then goto 30; -end;end;30:skipahead:=c;end;{:140}{141:}procedure skipcomment;label 10; -var bal:eightbits;c:ASCIIcode;begin bal:=0; -while true do begin if loc>limit then begin getline; -if inputhasended then begin begin writeln(termout); -write(termout,'! Input ended in mid-comment');error;end;goto 10;end;end; -c:=buffer[loc];loc:=loc+1;{142:}if c=64 then begin c:=buffer[loc]; -if(c<>32)and(c<>9)and(c<>42)and(c<>122)and(c<>90)then loc:=loc+1 else -begin begin writeln(termout); -write(termout,'! Section ended in mid-comment');error;end;loc:=loc-1; -goto 10; -end end else if(c=92)and(buffer[loc]<>64)then loc:=loc+1 else if c=123 -then bal:=bal+1 else if c=125 then begin if bal=0 then goto 10; -bal:=bal-1;end{:142};end;10:end;{:141}{145:}function getnext:eightbits; -label 20,30,31;var c:eightbits;d:eightbits;j,k:0..longestname; -begin 20:if loc>limit then begin getline; -if inputhasended then begin c:=136;goto 31;end;end;c:=buffer[loc]; -loc:=loc+1;if scanninghex then{146:} -if((c>=48)and(c<=57))or((c>=65)and(c<=70))then goto 31 else scanninghex -:=false{:146}; -case c of 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85 -,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 -,112,113,114,115,116,117,118,119,120,121,122:{148:} -begin if((c=101)or(c=69))and(loc>1)then if(buffer[loc-2]<=57)and(buffer[ -loc-2]>=48)then c:=0;if c<>0 then begin loc:=loc-1;idfirst:=loc; -repeat loc:=loc+1;d:=buffer[loc]; -until((d<48)or((d>57)and(d<65))or((d>90)and(d<97))or(d>122))and(d<>95); -if loc>idfirst+1 then begin c:=130;idloc:=loc;end;end else c:=69; -end{:148};34:{149:}begin doublechars:=0;idfirst:=loc-1; -repeat d:=buffer[loc];loc:=loc+1; -if(d=34)or(d=64)then if buffer[loc]=d then begin loc:=loc+1;d:=0; -doublechars:=doublechars+1; -end else begin if d=64 then begin writeln(termout); -write(termout,'! Double @ sign missing');error; -end end else if loc>limit then begin begin writeln(termout); -write(termout,'! String constant didn''t end');error;end;d:=34;end; -until d=34;idloc:=loc-1;c:=130;end{:149};64:{150:} -begin c:=controlcode(buffer[loc]);loc:=loc+1; -if c=0 then goto 20 else if c=13 then scanninghex:=true else if c=135 -then{151:}begin{153:}k:=0; -while true do begin if loc>limit then begin getline; -if inputhasended then begin begin writeln(termout); -write(termout,'! Input ended in section name');error;end;goto 30;end; -end;d:=buffer[loc];{154:}if d=64 then begin d:=buffer[loc+1]; -if d=62 then begin loc:=loc+2;goto 30;end; -if(d=32)or(d=9)or(d=42)then begin begin writeln(termout); -write(termout,'! Section name didn''t end');error;end;goto 30;end; -k:=k+1;modtext[k]:=64;loc:=loc+1;end{:154};loc:=loc+1; -if k=longestname-2 then begin begin writeln(termout); -write(termout,'! Section name too long: ');end; -for j:=1 to 25 do write(termout,xchr[modtext[j]]);write(termout,'...'); -if history=0 then history:=1;end{:155}; -if(modtext[k]=32)and(k>0)then k:=k-1;{:153}; -if k>3 then begin if(modtext[k]=46)and(modtext[k-1]=46)and(modtext[k-2]= -46)then curmodule:=prefixlookup(k-3)else curmodule:=modlookup(k); -end else curmodule:=modlookup(k);end{:151} -else if c=131 then begin repeat c:=skipahead;until c<>64; -if buffer[loc-1]<>62 then begin writeln(termout); -write(termout,'! Improper @ within control text');error;end;goto 20;end; -end{:150};{147:} -46:if buffer[loc]=46 then begin if loc<=limit then begin c:=32; -loc:=loc+1;end; -end else if buffer[loc]=41 then begin if loc<=limit then begin c:=93; -loc:=loc+1;end;end; -58:if buffer[loc]=61 then begin if loc<=limit then begin c:=24; -loc:=loc+1;end;end; -61:if buffer[loc]=61 then begin if loc<=limit then begin c:=30; -loc:=loc+1;end;end; -62:if buffer[loc]=61 then begin if loc<=limit then begin c:=29; -loc:=loc+1;end;end; -60:if buffer[loc]=61 then begin if loc<=limit then begin c:=28; -loc:=loc+1;end; -end else if buffer[loc]=62 then begin if loc<=limit then begin c:=26; -loc:=loc+1;end;end; -40:if buffer[loc]=42 then begin if loc<=limit then begin c:=9; -loc:=loc+1;end; -end else if buffer[loc]=46 then begin if loc<=limit then begin c:=91; -loc:=loc+1;end;end; -42:if buffer[loc]=41 then begin if loc<=limit then begin c:=10; -loc:=loc+1;end;end;{:147}32,9:goto 20;123:begin skipcomment;goto 20;end; -125:begin begin writeln(termout);write(termout,'! Extra }');error;end; -goto 20;end;else if c>=128 then goto 20 else end; -31:{if troubleshooting then debughelp;}getnext:=c;end;{:145}{157:} -procedure scannumeric(p:namepointer);label 21,30; -var accumulator:integer;nextsign:-1..+1;q:namepointer;val:integer; -begin{158:}accumulator:=0;nextsign:=+1; -while true do begin nextcontrol:=getnext; -21:case nextcontrol of 48,49,50,51,52,53,54,55,56,57:begin{160:}val:=0; -repeat val:=10*val+nextcontrol-48;nextcontrol:=getnext; -until(nextcontrol>57)or(nextcontrol<48){:160}; -begin accumulator:=accumulator+nextsign*(val);nextsign:=+1;end;goto 21; -end;12:begin{161:}val:=0;nextcontrol:=48; -repeat val:=8*val+nextcontrol-48;nextcontrol:=getnext; -until(nextcontrol>55)or(nextcontrol<48){:161}; -begin accumulator:=accumulator+nextsign*(val);nextsign:=+1;end;goto 21; -end;13:begin{162:}val:=0;nextcontrol:=48; -repeat if nextcontrol>=65 then nextcontrol:=nextcontrol-7; -val:=16*val+nextcontrol-48;nextcontrol:=getnext; -until(nextcontrol>70)or(nextcontrol<48)or((nextcontrol>57)and( -nextcontrol<65)){:162};begin accumulator:=accumulator+nextsign*(val); -nextsign:=+1;end;goto 21;end;130:begin q:=idlookup(0); -if ilk[q]<>1 then begin nextcontrol:=42;goto 21;end; -begin accumulator:=accumulator+nextsign*(equiv[q]-32768);nextsign:=+1; -end;end;43:;45:nextsign:=-nextsign;132,133,135,134,136:goto 30; -59:begin writeln(termout); -write(termout,'! Omit semicolon in numeric definition');error;end; -else {159:}begin begin writeln(termout); -write(termout,'! Improper numeric definition will be flushed');error; -end;repeat nextcontrol:=skipahead until(nextcontrol>=132); -if nextcontrol=135 then begin loc:=loc-2;nextcontrol:=getnext;end; -accumulator:=0;goto 30;end{:159}end;end;30:{:158}; -if abs(accumulator)>=32768 then begin begin writeln(termout); -write(termout,'! Value too big: ',accumulator:1);error;end; -accumulator:=0;end;equiv[p]:=accumulator+32768;end;{:157}{165:} -procedure scanrepl(t:eightbits);label 22,30,31,21;var a:sixteenbits; -b:ASCIIcode;bal:eightbits;begin bal:=0; -while true do begin 22:a:=getnext;case a of 40:bal:=bal+1; -41:if bal=0 then begin writeln(termout);write(termout,'! Extra )'); -error;end else bal:=bal-1;39:{168:}begin b:=39; -while true do begin begin if tokptr[z]=maxtoks then begin writeln( -termout);write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=b;tokptr[z]:=tokptr[z]+1; -end;if b=64 then if buffer[loc]=64 then loc:=loc+1 else begin writeln( -termout);write(termout,'! You should double @ signs in strings');error; -end;if loc=limit then begin begin writeln(termout); -write(termout,'! String didn''t end');error;end;buffer[loc]:=39; -buffer[loc+1]:=0;end;b:=buffer[loc];loc:=loc+1; -if b=39 then begin if buffer[loc]<>39 then goto 31 else begin loc:=loc+1 -;begin if tokptr[z]=maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=39;tokptr[z]:=tokptr[z]+1; -end;end;end;end;31:end{:168};35:if t=3 then a:=0;{167:} -130:begin a:=idlookup(0); -begin if tokptr[z]=maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=(a div 256)+128; -tokptr[z]:=tokptr[z]+1;end;a:=a mod 256;end; -135:if t<>135 then goto 30 else begin begin if tokptr[z]=maxtoks then -begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=(curmodule div 256)+168; -tokptr[z]:=tokptr[z]+1;end;a:=curmodule mod 256;end;2:{169:} -begin begin if tokptr[z]=maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=2;tokptr[z]:=tokptr[z]+1; -end;buffer[limit+1]:=64; -21:if buffer[loc]=64 then begin if loc=limit then begin writeln(termout); -write(termout,'! Verbatim string didn''t end');error; -end else if buffer[loc+1]<>62 then begin writeln(termout); -write(termout,'! You should double @ signs in verbatim strings');error; -end;loc:=loc+2;end{:169}; -133,132,134:if t<>135 then goto 30 else begin begin writeln(termout); -write(termout,'! @',xchr[buffer[loc-1]],' is ignored in Pascal text'); -error;end;goto 22;end;136:goto 30;{:167}else end; -begin if tokptr[z]=maxtoks then begin writeln(termout); -write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=a;tokptr[z]:=tokptr[z]+1; -end;end;30:nextcontrol:=a;{166:} -if bal>0 then begin if bal=1 then begin writeln(termout); -write(termout,'! Missing )');error;end else begin writeln(termout); -write(termout,'! Missing ',bal:1,' )''s');error;end; -while bal>0 do begin begin if tokptr[z]=maxtoks then begin writeln( -termout);write(termout,'! Sorry, ','token',' capacity exceeded');error; -history:=3;jumpout;end;tokmem[z,tokptr[z]]:=41;tokptr[z]:=tokptr[z]+1; -end;bal:=bal-1;end;end{:166}; -if textptr>maxtexts-3 then begin writeln(termout); -write(termout,'! Sorry, ','text',' capacity exceeded');error;history:=3; -jumpout;end;currepltext:=textptr;tokstart[textptr+3]:=tokptr[z]; -textptr:=textptr+1;if z=2 then z:=0 else z:=z+1;end;{:165}{170:} -procedure definemacro(t:eightbits);var p:namepointer; -begin p:=idlookup(t);scanrepl(t);equiv[p]:=currepltext; -textlink[currepltext]:=0;end;{:170}{172:}procedure scanmodule; -label 22,30,10;var p:namepointer;begin modulecount:=modulecount+1;{173:} -nextcontrol:=0; -while true do begin 22:while nextcontrol<=132 do begin nextcontrol:= -skipahead;if nextcontrol=135 then begin loc:=loc-2;nextcontrol:=getnext; -end;end;if nextcontrol<>133 then goto 30;nextcontrol:=getnext; -if nextcontrol<>130 then begin begin writeln(termout); -write(termout,'! Definition flushed, must start with ', -'identifier of length > 1');error;end;goto 22;end;nextcontrol:=getnext; -if nextcontrol=61 then begin scannumeric(idlookup(1));goto 22; -end else if nextcontrol=30 then begin definemacro(2);goto 22; -end else{174:}if nextcontrol=40 then begin nextcontrol:=getnext; -if nextcontrol=35 then begin nextcontrol:=getnext; -if nextcontrol=41 then begin nextcontrol:=getnext; -if nextcontrol=61 then begin begin writeln(termout); -write(termout,'! Use == for macros');error;end;nextcontrol:=30;end; -if nextcontrol=30 then begin definemacro(3);goto 22;end;end;end;end; -{:174};begin writeln(termout); -write(termout,'! Definition flushed since it starts badly');error;end; -end;30:{:173};{175:}case nextcontrol of 134:p:=0;135:begin p:=curmodule; -{176:}repeat nextcontrol:=getnext;until nextcontrol<>43; -if(nextcontrol<>61)and(nextcontrol<>30)then begin begin writeln(termout) -;write(termout,'! Pascal text flushed, = sign is missing');error;end; -repeat nextcontrol:=skipahead;until nextcontrol=136;goto 10;end{:176}; -end;else goto 10 end;{177:}storetwobytes(53248+modulecount);{:177}; -scanrepl(135);{178:} -if p=0 then begin textlink[lastunnamed]:=currepltext; -lastunnamed:=currepltext; -end else if equiv[p]=0 then equiv[p]:=currepltext else begin p:=equiv[p] -;while textlink[p]0 then begin for ii:=0 to changelimit do buffer[ii]:= -changebuffer[ii];limit:=changelimit;changing:=true;line:=otherline; -loc:=changelimit;begin writeln(termout); -write(termout,'! Change file entry did not match');error;end;end{:138}; -phaseone:=false;{:183};{for ii:=0 to 2 do maxtokptr[ii]:=tokptr[ii];} -{112:}if textlink[0]=0 then begin begin writeln(termout); -write(termout,'! No output was specified.');end; -if history=0 then history:=1;end else begin begin writeln(termout); -write(termout,'Writing the output file');end;{break(termout);}{83:} -stackptr:=1;bracelevel:=0;curstate.namefield:=0; -curstate.replfield:=textlink[0];zo:=curstate.replfield mod 3; -curstate.bytefield:=tokstart[curstate.replfield]; -curstate.endfield:=tokstart[curstate.replfield+3];curstate.modfield:=0; -{:83};{96:}outstate:=0;outptr:=0;breakptr:=0;semiptr:=0;outbuf[0]:=0; -line:=1;{:96};sendtheoutput;{98:}breakptr:=outptr;semiptr:=0; -flushbuffer;if bracelevel<>0 then begin writeln(termout); -write(termout,'! Program ended at brace level ',bracelevel:1);error;end; -{:98};begin writeln(termout);write(termout,'Done.');end;end{:112}; -9999:if stringptr>256 then{184:}begin begin writeln(termout); -write(termout,stringptr-256:1,' strings written to string pool file.'); -end;write(pool,'*'); -for ii:=1 to 9 do begin outbuf[ii]:=poolchecksum mod 10; -poolchecksum:=poolchecksum div 10;end; -for ii:=9 downto 1 do write(pool,xchr[48+outbuf[ii]]);writeln(pool); -end{:184};{[186:]begin writeln(termout); -write(termout,'Memory usage statistics:');end;begin writeln(termout); -write(termout,nameptr:1,' names, ',textptr:1,' replacement texts;');end; -begin writeln(termout);write(termout,byteptr[0]:1);end; -for wo:=1 to 1 do write(termout,'+',byteptr[wo]:1); -if phaseone then for ii:=0 to 2 do maxtokptr[ii]:=tokptr[ii]; -write(termout,' bytes, ',maxtokptr[0]:1); -for ii:=1 to 2 do write(termout,'+',maxtokptr[ii]:1); -write(termout,' tokens.');[:186];}{187:} -case history of 0:begin writeln(termout); -write(termout,'(No errors were found.)');end;1:begin writeln(termout); -write(termout,'(Did you see the warning message above?)');end; -2:begin writeln(termout); -write(termout,'(Pardon me, but I think I spotted something wrong.)'); -end;3:begin writeln(termout); -write(termout,'(That was a fatal error, my friend.)');end;end{:187}; -end.{:182} diff --git a/upstream/build/tex/tex.ch b/upstream/build/tex/tex.ch deleted file mode 100644 index 0a2fe05..0000000 --- a/upstream/build/tex/tex.ch +++ /dev/null @@ -1,690 +0,0 @@ -% Change file for GNU Pascal and Linux -% (by Don Knuth, 2000; see ../tex-sparc for the prehistory) -% (I'm no longer keeping the "efficiency" changes; just enuf for TRIP test) -% -% Use this file as is to make an INITEX. To get triptex, use the -% shell script ``ini_to_trip'' and re-TANGLE. - -% History: -% 2000.04.30 first sketch --- untested --- see FIXTHIS for parts not done yet - -% NOTE: the module numbers in this change file refer to Volume B. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [0] WEAVE: only print changes -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -\def\botofcontents{\vskip 0pt plus 1fil minus 1.5in} -@y -\def\botofcontents{\vskip 0pt plus 1fil minus 1.5in} -\let\maybe=\iffalse -\def\title{\TeX82 changes for GNU Pascal} -\def\glob{13}\def\gglob{20, 26} % these are defined in module 1 -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [1.2] banner line -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@d banner=='This is TeX, Version 3.14159' {printed when \TeX\ starts} -@y -@d banner=='This is '#27'[33;1mNesTeX'#27'[0m, Version 3.14159 for '#27'[31;1mJava'#27'[0m' -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [1.7] debug..gubed, stat..tats -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging} -@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging} -@y -@d debug==@{ {the trip test will use debugging} -@d gubed==@t@>@} -@z -@x -@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering - usage statistics} -@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering - usage statistics} -@y -@d stat== -@d tats== -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [1.8] init..tini -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version} -@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version} -@y -@d init== -@d tini== -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [1.10] othercases, feature of ISO Extended Pascal -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@d othercases == others: {default for cases not listed explicitly} -@y -@d othercases == otherwise {default for cases not listed explicitly} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [1.11] compile-time constants -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@!mem_max=30000; {greatest index in \TeX's internal |mem| array; - must be strictly less than |max_halfword|; - must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|} -@!mem_min=0; {smallest index in \TeX's internal |mem| array; - must be |min_halfword| or more; - must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|} -@!buf_size=500; {maximum number of characters simultaneously present in - current lines of open files and in control sequences between - \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|} -@!error_line=72; {width of context lines on terminal error messages} -@!half_error_line=42; {width of first lines of contexts in terminal - error messages; should be between 30 and |error_line-15|} -@!max_print_line=79; {width of longest text lines output; should be at least 60} -@!stack_size=200; {maximum number of simultaneous input sources} -@!max_in_open=6; {maximum number of input files and error insertions that - can be going on simultaneously} -@!font_max=75; {maximum internal font number; must not exceed |max_quarterword| - and must be at most |font_base+256|} -@!font_mem_size=20000; {number of words of |font_info| for all fonts} -@!param_size=60; {maximum number of simultaneous macro parameters} -@!nest_size=40; {maximum number of semantic levels simultaneously active} -@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|} -@!string_vacancies=8000; {the minimum number of characters that should be - available for the user's control sequences and font names, - after \TeX's own error messages are stored} -@!pool_size=32000; {maximum number of characters in strings, including all - error messages and help texts, and the names of all fonts and - control sequences; must exceed |string_vacancies| by the total - length of \TeX's own strings, which is currently about 23000} -@!save_size=600; {space for saving values outside of current group; must be - at most |max_halfword|} -@!trie_size=8000; {space for hyphenation patterns; should be larger for - \.{INITEX} than it is in production versions of \TeX} -@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns} -@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8} -@!file_name_size=40; {file names shouldn't be longer than this} -@!pool_name='TeXformats:TEX.POOL '; - {string of length |file_name_size|; tells where the string pool appears} -@y -@!mem_max=300000; {greatest index in \TeX's internal |mem| array; - must be strictly less than |max_halfword|; - must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|} -@!mem_min=0; {smallest index in \TeX's internal |mem| array; - must be |min_halfword| or more; - must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|} -@!buf_size=5000; {maximum number of characters simultaneously present in - current lines of open files and in control sequences between - \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|} -@!error_line=79; {width of context lines on terminal error messages} -@!half_error_line=50; {width of first lines of contexts in terminal - error messages; should be between 30 and |error_line-15|} -@!max_print_line=79; {width of longest text lines output; should be at least 60} -@!stack_size=200; {maximum number of simultaneous input sources} -@!max_in_open=15; {maximum number of input files and error insertions that - can be going on simultaneously} -@!font_max=127; {maximum internal font number; must not exceed |max_quarterword| - and must be at most |font_base+256|} -@!font_mem_size=40000; {number of words of |font_info| for all fonts} -@!param_size=60; {maximum number of simultaneous macro parameters} -@!nest_size=40; {maximum number of semantic levels simultaneously active} -@!max_strings=30000; {maximum number of strings; must not exceed |max_halfword|} -@!string_vacancies=8000; {the minimum number of characters that should be - available for the user's control sequences and font names, - after \TeX's own error messages are stored} -@!pool_size=100000; {maximum number of characters in strings, including all - error messages and help texts, and the names of all fonts and - control sequences; must exceed |string_vacancies| by the total - length of \TeX's own strings, which is currently about 23000} -@!save_size=6000; {space for saving values outside of current group; must be - at most |max_halfword|} -@!trie_size=30000; {space for hyphenation patterns; should be larger for - \.{INITEX} than it is in production versions of \TeX} -@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns} -@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8} -@!file_name_size=1024; {file names shouldn't be longer than this} -@!pool_name='tex.pool'; - {string of length |file_name_size|; the string pool name} -@.TeXformats@> -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [1.12] sensitive compile-time constants -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX}; - must not be less than |mem_min|} -@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX}; - must be substantially larger than |mem_bot| - and not greater than |mem_max|} -@d font_base=0 {smallest internal font number; must not be less - than |min_quarterword|} -@d hash_size=2100 {maximum number of control sequences; it should be at most - about |(mem_max-mem_min)/10|} -@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|} -@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions} -@y -@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX}; - must not be less than |mem_min|} -@d mem_top==300000 {largest index in the |mem| array dumped by \.{INITEX}; - must be substantially larger than |mem_bot| - and not greater than |mem_max|} -@d font_base=0 {smallest internal font number; must not be less - than |min_quarterword|} -@d hash_size=10000 {maximum number of control sequences; it should be at most - about |(mem_max-mem_min)/10|} -@d hash_prime=3443 {a prime number equal to about 85\pct! of |hash_size|} -@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [2.23] allow any character that we can input to get in -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -for i:=0 to @'37 do xchr[i]:=' '; -for i:=@'177 to @'377 do xchr[i]:=' '; -@y -for i:=0 to @'37 do xchr[i]:=chr(i); -for i:=@'177 to @'377 do xchr[i]:=chr(i); -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [3.25] file types -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@!eight_bits=0..255; {unsigned one-byte quantity} -@!alpha_file=packed file of text_char; {files that contain textual data} -@y -@!eight_bits=ByteCard; {unsigned one-byte quantity} -@!alpha_file=t@&e@&x@&t; {files that contain textual data} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [3.27] file opening -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@ The \ph\ compiler with which the present version of \TeX\ was prepared has -extended the rules of \PASCAL\ in a very convenient way. To open file~|f|, -we can write -$$\vbox{\halign{#\hfil\qquad&#\hfil\cr -|reset(f,@t\\{name}@>,'/O')|&for input;\cr -|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$ -The `\\{name}' parameter, which is of type `{\bf packed array -$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of -the external file that is being opened for input or output. -Blank spaces that might appear in \\{name} are ignored. - -The `\.{/O}' parameter tells the operating system not to issue its own -error messages if something goes wrong. If a file of the specified name -cannot be found, or if such a file cannot be opened for some other reason -(e.g., someone may already be trying to write the same file), we will have -|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows -\TeX\ to undertake appropriate corrective action. -@:PASCAL H}{\ph@> -@^system dependencies@> - -\TeX's file-opening procedures return |false| if no file identified by -|name_of_file| could be opened. - -@d reset_OK(#)==erstat(#)=0 -@d rewrite_OK(#)==erstat(#)=0 - -@p function a_open_in(var f:alpha_file):boolean; - {open a text file for input} -begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f); -end; -@# -function a_open_out(var f:alpha_file):boolean; - {open a text file for output} -begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f); -end; -@# -function b_open_in(var f:byte_file):boolean; - {open a binary file for input} -begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f); -end; -@# -function b_open_out(var f:byte_file):boolean; - {open a binary file for output} -begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f); -end; -@# -function w_open_in(var f:word_file):boolean; - {open a word file for input} -begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f); -end; -@# -function w_open_out(var f:word_file):boolean; - {open a word file for output} -begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f); -end; -@y -@ An external C procedure, |test_access| is used to check whether or not the -open will work. It is declared in the ``ext.h'' include file, and it returns -|true| or |false|. The |Trim(name_of_file)| global holds the file name whose access -is to be tested. -The first parameter for |test_access| is the access mode, -one of |read_access_mode| or |write_access_mode|. - -We also implement path searching in |test_access|: its second parameter is -one of the ``file path'' constants defined below. If |Trim(name_of_file)| -doesn't start with |'/'| then |test_access| tries prepending pathnames -from the appropriate path list until success or the end of path list -is reached. -On return, |Trim(name_of_file)| contains the original name with the path -that succeeded (if any) prepended. It is the name used in the various -open procedures. - -Note that |a_open_in| has been redefined to take an additional argument, -which should be one of the ``file path'' specifiers. -Since |b_open_in| is only used for \.{TFM} files, and -|w_open_in| is only used for format files, we don't need a path specifying -argument for them. -Path searching is not done for output files. - -@d read_access_mode=4 {``read'' mode for |test_access|} -@d write_access_mode=2 {``write'' mode for |test_access|} - -@d no_file_path=0 {no path searching should be done} -@d input_file_path=1 {path specifier for \.{\\input} files} -@d read_file_path=2 {path specifier for \.{\\read} files} -@d font_file_path=3 {path specifier for \.{TFM} files} -@d format_file_path=4 {path specifier for format files} -@d pool_file_path=5 {path specifier for the pool file} - -@p function a_open_in(var f:alpha_file):boolean; - {open a text file for input} -var str:String; -begin -reset(f,name_of_file); -a_open_in:=IOResult=0; -end; - - - -@# -function a_open_out(var f:alpha_file):boolean; - {open a text file for output} -var @!ok:boolean; -begin - rewrite(f,Trim(name_of_file)); -a_open_out:=true; -end; -@# -function b_open_in(var f:byte_file):boolean; - {open a binary file for input} -var @!ok:boolean; -begin - reset(f,Trim(name_of_file)); -b_open_in:=true; -end; -@# -function b_open_out(var f:byte_file):boolean; - {open a binary file for output} -var @!ok:boolean; -begin - rewrite(f,Trim(name_of_file)); -b_open_out:=true; -end; -@# -function w_open_in(var f:word_file):boolean; - {open a word file for input} -var @!ok:boolean; -begin - reset(f,Trim(name_of_file)); -w_open_in:=true; -end; -@# -function w_open_out(var f:word_file):boolean; - {open a word file for output} -var @!ok:boolean; -begin - rewrite(f,Trim(name_of_file)); -w_open_out:=true; -end; -@z - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [3.32] term_in/out are input,output -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@!term_in:alpha_file; {the terminal as an input file} -@!term_out:alpha_file; {the terminal as an output file} - -@y -@!{the terminal as an input file} - -@z - -@x -@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input} -@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output} -@y -@d term_in==Input -@d term_out==Output -@d t_open_in==do_nothing -@d t_open_out==do_nothing -@z - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [3.34] flushing output -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -these operations can be specified in \ph: -@^system dependencies@> - -@d update_terminal == break(term_out) {empty the terminal output buffer} -@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer} -@d wake_up_terminal == do_nothing {cancel the user's cancellation of output} -@y -these operations can be specified with Berkeley {\mc UNIX}: -@^system dependencies@> - -@d update_terminal == {nothing necessary on UNIX} -@d clear_terminal == {nothing necessary on UNIX} -@d wake_up_terminal == {nothing necessary on UNIX} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [4.38] string data -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@!packed_ASCII_code = 0..255; {elements of |str_pool| array} -@y -@!packed_ASCII_code = ByteCard; {elements of |str_pool| array} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [4.51,52,53] make TEX.POOL lowercase in messages -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -else bad_pool('! I can''t read TEX.POOL.') -@y -else bad_pool('! I can''t read tex.pool.') -@z -@x -begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.'); -@y -begin if eof(pool_file) then bad_pool('! tex.pool has no check sum.'); -@z -@x - bad_pool('! TEX.POOL line doesn''t begin with two digits.'); -@y - bad_pool('! tex.pool line doesn''t begin with two digits.'); -@z -@x - bad_pool('! TEX.POOL check sum doesn''t have nine digits.'); -@y - bad_pool('! tex.pool check sum doesn''t have nine digits.'); -@z -@x -done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.'); -@y -done: if a<>@$ then bad_pool('! tex.pool doesn''t match; tangle me again.'); -@z - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [8.110] ranges for quarter,half words FIXTHIS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@d min_quarterword=0 {smallest allowable value in a |quarterword|} -@d max_quarterword=255 {largest allowable value in a |quarterword|} -@d min_halfword==0 {smallest allowable value in a |halfword|} -@d max_halfword==65535 {largest allowable value in a |halfword|} -@y -@d min_quarterword=-128 {smallest allowable value in a |quarterword|} -@d max_quarterword=127 {largest allowable value in a |quarterword|} -@d min_halfword==-2147483648 {smallest allowable value in a |halfword|} -@d max_halfword==2147483647 {largest allowable value in a |halfword|} -@z - -@x -@= -@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} -@!halfword=min_halfword..max_halfword; {1/2 of a word} -@!two_choices = 1..2; {used when there are two variants in a record} -@!four_choices = 1..4; {used when there are four variants in a record} -@y -@= -@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} -@!halfword=min_halfword..max_halfword; {1/2 of a word} -@!two_choices = 1..2; {used when there are two variants in a record} -@!four_choices = 1..4; {used when there are four variants in a record} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [11.165] fix the word "free" so that it doesn't conflict with a runtime proc -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -been included. (You may want to decrease the size of |mem| while you -@^debugging@> -are debugging.) -@y -been included. (You may want to decrease the size of |mem| while you -@^debugging@> -are debugging.) - -@d free==free_arr -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [12.186] glue_ratio fix FIXTHIS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -floating point underflow on the author's computer. -@^system dependencies@> -@^dirty \PASCAL@> - -@= -g:=float(glue_set(p)); -if (g<>float_constant(0))and(glue_sign(p)<>normal) then - begin print(", glue set "); - if glue_sign(p)=shrinking then print("- "); - if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?") - else if abs(g)>float_constant(20000) then - begin if g>float_constant(0) then print_char(">") - else print("< -"); - print_glue(20000*unity,glue_order(p),0); - end - else print_glue(round(unity*g),glue_order(p),0); -@^real multiplication@> - end -@y -floating point underflow on the author's computer. -For the {\mc VAX}, the only possible random value that could hurt is -a reserved value with 1 in the sign bit and 0 for the (excess) exponent. -Because the sign-plus-exponent is in the middle of the word, the chances -of this happening are miniscule, and ignored here. -@^system dependencies@> -@^dirty \PASCAL@> - -@= -g:=float(glue_set(p)); -if (g<>float_constant(0))and(glue_sign(p)<>normal) then - begin print(", glue set "); - if glue_sign(p)=shrinking then print("- "); - if abs(float(glue_set(p)))>20000.0 then - begin if float(glue_set(p))>0 then print_char(">") - else print("< -"); - print_glue(20000*unity,glue_order(p),0); - end - else print_glue(round(float(glue_set(p))*unity),glue_order(p),0); -@^real multiplication@> - end -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [29.513] area and extension rules -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@ The file names we shall deal with for illustrative purposes have the -following structure: If the name contains `\.>' or `\.:', the file area -consists of all characters up to and including the final such character; -otherwise the file area is null. If the remaining file name contains -`\..', the file extension consists of all such characters from the first -remaining `\..' to the end, otherwise the file extension is null. -@^system dependencies@> - -We can scan such file names easily by using two global variables that keep track -of the occurrences of area and extension delimiters: - -@= -@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} -@!ext_delimiter:pool_pointer; {the relevant `\..', if any} -@y -@ The file names we shall deal with for SunOS have the -following structure: If the name contains `\./', the file area -consists of all characters up to and including the final such character; -otherwise the file area is null. If the remaining file name contains -`\..', the file extension consists of all such characters from the first -remaining `\..' to the end, otherwise the file extension is null. -@^system dependencies@> - -We can scan such file names easily by using two global variables that keep -track of the occurrences of area and extension delimiters: - -@= -@!area_delimiter:pool_pointer; {the most recent `\./', if any} -@!ext_delimiter:pool_pointer; {the most recent `\..', if any} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [29.516] more_name -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x - if (c=">")or(c=":") then -@y - if c="/" then -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [29.520] default format -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -@d format_default_length=20 {length of the |TEX_format_default| string} -@d format_area_length=11 {length of its area part} -@d format_ext_length=4 {length of its `\.{.fmt}' part} -@y -Under Linux we don't give the area part, instead depending -on the path searching that will happen during file opening. - -@d format_default_length=9 {length of the |TEX_format_default| string} -@d format_area_length=0 {length of its area part} -@d format_ext_length=4 {length of its `\.{.fmt}' part} -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [29.521] plain format location -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -TEX_format_default:='TeXformats:plain.fmt'; -@y -TEX_format_default:='plain.fmt'; -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [29.524] format file opening: only try once, with path search -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x - pack_buffered_name(0,loc,j-1); {try first without the system file area} - if w_open_in(fmt_file) then goto found; - pack_buffered_name(format_area_length,loc,j-1); - {now try the system format file area} - if w_open_in(fmt_file) then goto found; -@y - pack_buffered_name(0,loc,j-1); - if w_open_in(fmt_file) then goto found; -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [29.525] make_name_string -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -@x -which simply makes a \TeX\ string from the value of |name_of_file|, should -ideally be changed to deduce the full name of file~|f|, which is the file -most recently opened, if it is possible to do this in a \PASCAL\ program. -@^system dependencies@> - -This routine might be called after string memory has overflowed, hence -we dare not use `|str_room|'. - -@p function make_name_string:str_number; -var k:1..file_name_size; {index into |name_of_file|} -begin if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings)or - (cur_length>0) then - make_name_string:="?" -else begin for k:=1 to name_length do append_char(xord[name_of_file[k]]); - make_name_string:=make_string; - end; -end; -@y -which simply makes a \TeX\ string from the value of |name_of_file|, should -ideally be changed to deduce the full name of file~|f|, which is the file -most recently opened, if it is possible to do this in a \PASCAL\ program. -With the Berkeley {\mc UNIX} version, we know that |name_of_file| -contains |name_of_file| prepended with the directory name that was found -by path searching. -If |name_of_file| starts with |'./'|, we don't use that part of the -name, since {\mc UNIX} users understand that. -@^system dependencies@> - -This routine might be called after string memory has overflowed, hence -we dare not use `|str_room|'. - -@p function make_name_string:str_number; -var k,@!kstart:1..file_name_size; {index into |name_of_file|} -begin -k:=1; -while (k" ") do - incr(k); -name_length:=k-1; {the real |name_length|} -if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings)or - (cur_length>0) then - make_name_string:="?" -else begin - if (xord[name_of_file[1]]=".") and (xord[name_of_file[2]]="/") then - kstart:=3 - else - kstart:=1; - for k:=kstart to name_length do append_char(xord[name_of_file[k]]); - make_name_string:=make_string; - end -end; -@z - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [30.563] opening tfm file: now path searching is done -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Set temp_int to value of first byte -@x -@ @= -file_opened:=false; -if aire="" then pack_file_name(nom,TEX_font_area,".tfm") -else pack_file_name(nom,aire,".tfm"); -if not b_open_in(tfm_file) then abort; -file_opened:=true -@y -@ Here we have to ``prime the pump'' for the |temp_int| trick explained below. - - @= -file_opened:=false; -pack_file_name(nom,aire,".tfm"); -if not b_open_in(tfm_file) then abort; -begin - var temp_int:integer; - temp_int:=tfm_file^; - if temp_int<0 then temp_int:=temp_int+256; -end; -file_opened:=true -@z - -- 1.7.10.4