DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T t

⟦67967fce4⟧ TextFile

    Length: 63029 (0xf635)
    Types: TextFile
    Names: »tangle.p«

Derivation

└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
    └─⟦this⟧ »./tex82/Unsupported/tangle.p« 
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
    └─⟦beba6c409⟧ »unix3.0/Unsupported.tar.Z« 
        └─⟦25c524ae4⟧ 
            └─⟦this⟧ »Unsupported/tangle.p« 

TextFile

{2:}
{4:}
{$C-,A+,D-}
{[$C+,D+]}
{:4}

program TANGLE(webfile, changefile, Pascalfile, pool);
label
    9999; {8:}
const
    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} {11:}
type
    ASCIIcode = 0..127; {:11} {12:}
    textfile = packed file of char; {: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} {9:}
var
    history: 0..3; {:9} {13:}
    xord: array [char] of ASCIIcode;
    xchr: array [ASCIIcode] of char; {:13} {20:}
    termout: textfile; {:20} {23:}
    webfile: textfile;
    changefile: textfile; {:23} {25:}
    Pascalfile: textfile;
    pool: textfile; {: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:}
    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:textfile;}
    {: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 begin {32:}
	    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 else begin {:32} {33:}
	    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 {debughelp;}
    end; {:31} {34:}

    procedure jumpout;
    begin
	goto 9999
    end; {:34}

    procedure initialize; {16:}
    var
	i: 0..127; {:16} {41:}
	wi: 0..1; {:41} {45:}
	zi: 0..2; {:45} {51:}
	h: 0..hashsize; {:51} {10:}
    begin
	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] := ' '; {:17} {18:}
	for i := 0 to 127 do 
	    xord[chr(i)] := 32;
	for i := 1 to 126 do 
	    xord[xchr[i]] := i;
{: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 := 128;
	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');}
    end;
    {:180} {:2} {24:}

    procedure openinput;
    begin
	reset(webfile);
	reset(changefile)
    end; {:24} {28:}

    function inputln(var f: textfile): 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;
		    begin
			writeln(termout);
			write(termout, '! Input line too long')
		    end;
		    loc := 0;
		    error
		end
	    end;
	    readln(f);
	    limit := finallimit;
	    inputln := true
	end
    end; { inputln }
{: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 i < idloc do begin
	    h := ((h + h) + buffer[i]) mod hashsize;
	    i := i + 1
	end {:54};
{55:}
	p := hash[h];
	while p <> 0 do begin
	    if (bytestart[p + 2] - bytestart[p]) = l then begin {56:}
		i := idfirst;
		k := bytestart[p];
		w := p mod 2;
		while (i < idloc) and (buffer[i] = bytemem[w, k]) do begin
		    i := i + 1;
		    k := k + 1
		end;
		if i = idloc then 
		    goto 31
	    end {:56};
	    p := link[p]
	end;
	p := nameptr;
	link[p] := hash[h];
	hash[h] := p;
    31: {:55}
	null;
	if (p = nameptr) or (t <> 0) then begin {57:}
	    if (((p <> nameptr) and (t <> 0)) and (ilk[p] = 0)) or (((p = nameptr) and (t = 0)) and (buffer[idfirst] <> 34)) then begin {58:}
		i := idfirst;
		s := 0;
		h := 0;
		while (i < idloc) and (s < unambiglength) do begin
		    if buffer[i] <> 95 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 begin {59:}
		if ilk[p] = 0 then begin
		    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 else begin {:59} {61:}
		if (t = 0) and (buffer[idfirst] <> 34) then begin {62:}
		    q := chophash[h];
		    while q <> 0 do begin {63:}
			begin
			    k := bytestart[q];
			    s := 0;
			    w := q mod 2;
			    while (k < bytestart[q + 2]) and (s < unambiglength) do begin
				c := bytemem[w, k];
				if c <> 95 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: {:63}
			    null
			end;
			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 i < idloc do begin
		    bytemem[w, k] := buffer[i];
		    k := k + 1;
		    i := i + 1
		end;
		byteptr[w] := k;
		bytestart[nameptr + 2] := k;
		nameptr := nameptr + 1;
		if buffer[idfirst] <> 34 then 
		    ilk[p] := t {64:}
		else 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 i < idloc do begin
			    write(pool, xchr[buffer[i]]);
			    poolchecksum := (poolchecksum + poolchecksum) + buffer[i];
			    while poolchecksum > 536870839 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 ((k < bytestart[p + 2]) and (j <= l)) and (modtext[j] = bytemem[w, k]) do begin
		    k := k + 1;
		    j := j + 1
		end;
		if k = bytestart[p + 2] then 
		    if j > l then 
			c := 1
		    else 
			c := 4
		else if j > l then 
		    c := 3
		else if modtext[j] < bytemem[w, k] then 
		    c := 0
		else 
		    c := 2
	    end {:68};
	    q := p;
	    if c = 0 then 
		p := link[q]
	    else if c = 2 then 
		p := ilk[q]
	    else 
		goto 31
	end; {67:}
	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;
	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 ((k < bytestart[p + 2]) and (j <= l)) and (modtext[j] = bytemem[w, k]) do begin
		    k := k + 1;
		    j := j + 1
		end;
		if k = bytestart[p + 2] then 
		    if j > l then 
			c := 1
		    else 
			c := 4
		else if j > l then 
		    c := 3
		else if modtext[j] < bytemem[w, k] then 
		    c := 0
		else 
		    c := 2
	    end {:68};
	    if c = 0 then 
		p := link[p]
	    else if c = 2 then 
		p := ilk[p]
	    else begin
		r := p;
		count := count + 1;
		q := ilk[p];
		p := link[p]
	    end;
	    if p = 0 then begin
		p := q;
		q := 0
	    end
	end;
	if count <> 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<tokstart[p+3]do begin a:=tokmem[zp,k];
if a>=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,'@\');
others: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 begin {91:}
		nameptr := nameptr - 1;
		textptr := textptr - 1;
		{if tokptr[z]>maxtokptr[z]then maxtokptr[z]:=tokptr[z];
		}
		z := textptr mod 3;
		tokptr[z] := tokstart[textptr]
	    end
{byteptr[nameptr mod 2]:=byteptr[nameptr mod 2]-1;} {:91}
	end else if textlink[curstate.replfield] < maxtexts then begin
	    curstate.replfield := textlink[curstate.replfield];
	    zo := curstate.replfield mod 3;
	    curstate.bytefield := tokstart[curstate.replfield];
	    curstate.endfield := tokstart[curstate.replfield + 3];
	    goto 10
	end;
	stackptr := stackptr - 1;
	if stackptr > 0 then begin
	    curstate := stack[stackptr];
	    zo := curstate.replfield mod 3
	end;
    10:
	null
    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 begin {92:}
		pushlevel(nameptr - 1);
		goto 20
	    end else  {:92}
		goto 31;
	a := ((a - 128) * 256) + tokmem[zo, curstate.bytefield];
	curstate.bytefield := curstate.bytefield + 1;
	if a < 10240 then begin {89:}
	    if ilk[a] in
		[0, 1, 2, 3] then
		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 
					if b in
					    [40, 41, 39] then
					    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
					    end
					else
					    null;
				    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}
			    null;
			    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
		end
	    else
		begin
		    writeln(termout);
		    write(termout, '! This can''t happen (', 'output', ')');
		    error;
		    history := 3;
		    jumpout
		end;
	    goto 31
	end {:89};
	if a < 20480 then begin {88:}
	    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 breakptr < outptr then begin
	    if outbuf[breakptr] = 32 then begin
		breakptr := breakptr + 1;
		if breakptr > b 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; {102:}
    begin
    20:
	if outstate in
	    [1, 2, 3, 4, 5, 0] then
	    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:
		    begin {104:}
			if (t = 3) or ((((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)))) then begin {105:} {:105} {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
	    end
	else
	    null {: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
	if outstate in
	    [2, 4, 3, 5] then
	    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
	    end
	else
	    begin
		breakptr := outptr;
		outapp := v;
		outstate := 2
	    end;
	lastsign := outapp
    end; {:106} {107:}

    procedure sendval(v: integer);
    label
	666, 10;
    begin
	if outstate in
	    [1, 0, 2, 3, 4, 5] then
	    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
	    end
	else {:108}
	    goto 666;
	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:
	null
    end; { sendval }
{: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:
	    if curchar in
		[0, 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, 130, 48, 49,
		 50, 51, 52, 53, 54, 55, 56, 57,
		 125, 12, 13, 128, 46, 43, 45, 4,
		 5, 6, 31, 24, 26, 28, 29, 30,
		 32, 39, 33, 34, 35, 36, 37, 38,
		 40, 41, 42, 44, 47, 58, 59, 60,
		 61, 62, 63, 64, 91, 92, 93, 94,
		 95, 96, 123, 124, 9, 10, 129, 127,
		 2, 3] then
		case curchar of
		    0:
			null; {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 < maxidlength) and (j < bytestart[curval + 2]) do begin
				k := k + 1;
				outcontrib[k] := bytemem[w, j];
				j := j + 1;
				if outcontrib[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:
			begin {117:}
			    k := 1;
			    outcontrib[1] := 39;
			    repeat
				if k < linelength then 
				    k := k + 1;
				outcontrib[k] := getoutput
			    until (outcontrib[k] = 39) or (stackptr = 0);
			    if k = linelength then begin
				writeln(termout);
				write(termout, '! String too long');
				error
			    end;
			    sendout(1, k);
			    curchar := getoutput;
			    if curchar = 39 then 
				outstate := 6;
			    goto 21
			end; {:117}
{115:}
		    33, 34, 35, 36, 37, 38, 40,
		    41, 42, 44, 47, 58, 59, 60,
		    61, 62, 63, 64, 91, 92, 93,
		    94, 95, 96, 123, 124: {:115}
			sendout(0, curchar); {121:}
		    9:
			begin
			    if bracelevel = 0 then 
				sendout(0, 123)
			    else 
				sendout(0, 91);
			    bracelevel := bracelevel + 1
			end;
		    10:
			if bracelevel > 0 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:
			begin {118:}
			    k := 0;
			    repeat
				if k < linelength then 
				    k := k + 1;
				outcontrib[k] := getoutput
			    until (outcontrib[k] = 2) or (stackptr = 0);
			    if k = linelength then begin
				writeln(termout);
				write(termout, '! Verbatim string too long');
				error
			    end;
			    sendout(1, k - 1)
			end; {:118}
		    3:
			begin {122:}
			    sendout(1, 0);
			    while outptr > 0 do begin
				if outptr <= linelength then 
				    breakptr := outptr;
				flushbuffer
			    end;
			    outstate := 0
			end
		end
	    else
		begin {:122}
		    writeln(termout);
		    write(termout, '! Can''t output ASCII code ', curchar: 1);
		    error
		end;
	    goto 22;
    2: {120:}
	    repeat
		if k < linelength then 
		    k := k + 1;
		outcontrib[k] := curchar;
		curchar := getoutput;
		if (outcontrib[k] = 69) and ((curchar = 43) or (curchar = 45)) then begin
		    if k < linelength then 
			k := k + 1;
		    outcontrib[k] := curchar;
		    curchar := getoutput
		end else if curchar = 101 then 
		    curchar := 69
	    until (curchar <> 69) 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:
	    null
	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:
	null
    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:
	    null
	end;
    30: {:129}
	null; {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:
	null
    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:
	null
    end; {:132} {135:}

    procedure getline;
    label
	20;
    begin
    20:
	if changing then begin {137:}
	    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
	if c in
	    [64, 39, 34, 36, 32, 9, 42, 68,
	     100, 70, 102, 123, 125, 80, 112, 84,
	     116, 94, 46, 58, 38, 60, 61, 92] then
	    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
	    end
	else
	    controlcode := 0
    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:
	null
    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};
	if c in
	    [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, 34, 64, 46, 58,
	     61, 62, 60, 40, 42, 32, 9, 123] then
	    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:
		    begin {148:}
			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:
		    begin {149:}
			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:
		    begin {150:}
			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 begin {151:} {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 - 1) then 
				    k := k + 1;
				if (d = 32) or (d = 9) then begin
				    d := 32;
				    if modtext[k - 1] = 32 then 
					k := k - 1
				end;
				modtext[k] := d
			    end;
    30: {155:}
			    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 else if c = 131 then begin {:151}
			    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
	    end
	else
	    null;
    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; {158:}
    begin
	accumulator := 0;
	nextsign := +1;
	while true do begin
	    nextcontrol := getnext;
    21:
	    if nextcontrol in
		[48, 49, 50, 51, 52, 53, 54, 55,
		 56, 57, 12, 13, 130, 43, 45, 132,
		 133, 135, 134, 136, 59] then
		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:
			null;
		    45:
			nextsign := -nextsign;
		    132, 133, 135, 134, 136:
			goto 30;
		    59:
			begin
			    writeln(termout);
			    write(termout, '! Omit semicolon in numeric definition');
			    error
			end
		end
	    else
		begin {159:}
		    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;
    30: {:158}
	null;
	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;
    var
	a: sixteenbits;
	b: ASCIIcode;
	bal: eightbits;
    begin
	bal := 0;
	while true do begin
    22:
	    a := getnext;
	    if a in
		[40, 41, 39, 35, 130, 135, 2, 133,
		 132, 134, 136] then
		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:
			begin {168:}
			    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: {:168}
			    null
			end;
		    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:
			begin {169:}
			    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;
			    while buffer[loc] <> 64 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]] := buffer[loc];
				    tokptr[z] := tokptr[z] + 1
				end;
				loc := loc + 1;
				if loc < limit then 
				    if (buffer[loc] = 64) and (buffer[loc + 1] = 64) 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]] := 64;
					    tokptr[z] := tokptr[z] + 1
					end;
					loc := loc + 2
				    end
			    end;
			    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
		end
	    else
		null {:167};
	    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 if nextcontrol = 40 then begin {174:}
		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}
	null; {175:}
	if nextcontrol in
	    [134, 135] then
	    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
	    end
	else
	    goto 10; {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] < maxtexts do 
		p := textlink[p];
	    textlink[p] := currepltext
	end;
	textlink[currepltext] := maxtexts; {:178} {:175}
    10:
	null
    end; {:172} {181:}
{procedure debughelp;label 888,10;var k:integer;
begin debugskipped:=debugskipped+1;
if debugskipped<debugcycle then goto 10;debugskipped:=0;
while true do begin write(termout,'#');break(termout);read(termin,ddt);
if ddt<0 then goto 10 else if ddt=0 then begin goto 888;
888:ddt:=0;
end else begin read(termin,dd);case ddt of 1:printid(dd);
2:printrepl(dd);3:for k:=1 to dd do write(termout,xchr[buffer[k]]);
4:for k:=1 to dd do write(termout,xchr[modtext[k]]);
5:for k:=1 to outptr do write(termout,xchr[outbuf[k]]);
6:for k:=1 to dd do write(termout,xchr[outcontrib[k]]);
others:write(termout,'?')end;end;end;10:end;}
{:181}
{182:}

begin
    initialize; {134:}
    openinput;
    line := 0;
    otherline := 0;
    changing := true;
    primethechangebuffer;
    changing := not changing;
    templine := otherline;
    otherline := line;
    line := templine;
    limit := 0;
    loc := 1;
    buffer[0] := 32;
    inputhasended := false; {:134}
    writeln(termout, 'This is TANGLE, Version 2.8'); {183:}
    phaseone := true;
    modulecount := 0;
    repeat
	nextcontrol := skipahead
    until nextcontrol = 136;
    while not inputhasended do 
	scanmodule; {138:}
    if changelimit <> 0 then begin
	for loc := 0 to changelimit do 
	    buffer[loc] := changebuffer[loc];
	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 zo:=0 to 2 do maxtokptr[zo]:=tokptr[zo];}
{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 > 128 then begin {184:}
	begin
	    writeln(termout);
	    write(termout, stringptr - 128: 1, ' strings written to string pool file.')
	end;
	write(pool, '*');
	for stringptr := 1 to 9 do begin
	    outbuf[stringptr] := poolchecksum mod 10;
	    poolchecksum := poolchecksum div 10
	end;
	for stringptr := 9 downto 1 do 
	    write(pool, xchr[48 + outbuf[stringptr]]);
	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);
    write(termout,' bytes, ',maxtokptr[0]:1);
    for zo:=1 to 2 do write(termout,'+',maxtokptr[zo]: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}