blob: 1969e693eef5ba91aa8135889c9c08ae4b03d042 [file] [log] [blame]
program MF(input, output); {6:}
{------------------------------}
{ declarations are in mf2ps1.h }
{------------------------------}
label
1, 9998, 9999;
{:6} {11:}
const
memmax = 30000;
maxinternal = 100;
bufsize = 500;
errorline = 79;
halferrorline = 50;
maxprintline = 79;
screenwidth = 1024;
screendepth = 1024;
stacksize = 30;
maxstrings = 2000;
stringvacancies = 8000;
poolsize = 32000;
movesize = 5000;
maxwiggle = 300;
gfbufsize = 800;
filenamesize = 256;
poolname = 'mf.pool';
pathsize = 300;
bistacksize = 785;
headersize = 100;
ligtablesize = 300;
maxfontdimen = 50; {:11} {18:}
type
ASCIIcode = 0..127; {:18}
{24:}
eightbits = 0..255;
alphafile = text;
{------------------}
postscript = text;
{------------------}
UNIXfilename = packed array [1..filenamesize] of char;
bytefile =
record
stdioptr: ^ integer;
locptr: ^ integer;
filename: UNIXfilename
end; {:24} {37:}
poolpointer = 0..poolsize;
strnumber = 0..maxstrings; {:37}
{101:}
scaled = integer;
smallnumber = 0..63; {:101} {105:}
fraction = integer;
{:105}
{106:}
angle = integer; {:106} {156:}
quarterword = -128..127;
halfword = -32768..32767;
twochoices = 1..2;
threechoices = 1..3;
twohalves = packed
record
rh: halfword;
case twochoices of
1: (
lh: halfword
);
2: (
b0: quarterword;
b1: quarterword
)
end;
fourquarters = packed
record
b0: quarterword;
b1: quarterword;
b2: quarterword;
b3: quarterword
end;
memoryword =
record
case threechoices of
1: (
int: integer
);
2: (
hh: twohalves
);
3: (
qqqq: fourquarters
)
end;
wordfile = file of memoryword; {:156} {186:}
commandcode = 1..82; {:186} {565:}
screenrow = 0..screendepth;
screencol = 0..screenwidth;
transspec = array [screencol] of screencol;
pixelcolor = 0..1; {:565} {571:}
windownumber = 0..15; {:571} {627:}
instaterecord =
record
indexfield: quarterword;
startfield, locfield, limitfield, namefield: halfword
end; {:627} {1151:}
gfindex = 0..gfbufsize;
gfbuftype = array [gfindex] of eightbits; {:1151} {13:}
var
bad: integer; {:13} {20:}
xord: array [char] of ASCIIcode;
xchr: array [ASCIIcode] of char; {:20} {25:}
nameoffile, realnameoffile: UNIXfilename;
namelength: 0..filenamesize; {:25}
{29:}
buffer: array [0..bufsize] of ASCIIcode;
first: 0..bufsize;
last: 0..bufsize;
maxbufstack: 0..bufsize; {:29} {38:}
strpool: packed array [poolpointer] of ASCIIcode;
strstart: array [strnumber] of poolpointer;
poolptr: poolpointer;
strptr: strnumber;
initpoolptr: poolpointer;
initstrptr: strnumber;
maxpoolptr: poolpointer;
maxstrptr: strnumber; {:38} {42:}
strref: array [strnumber] of 0..127; {:42} {50:}
poolfile: alphafile; {:50} {54:}
logfile: alphafile;
{-------------------------------------------------------------}
psfile :postscript; { the PostScript code }
g :postscript; { holds the character information after re-arrange}
lastx0 , lasty0 :real ; { last point in sunpath }
lastx3 , lasty3 :real ; { make optimization on commands }
prevtox3 , prevtoy3 :real;
lastyearval , { mark entering to macros }
lastmonthval :integer; { STROKE , FILL , and ERASE }
{ in MY plain.mf }
my_xx , my_yy :integer; { hold the values of xx & yy }
LineSource : integer; { Identifier for sendline source }
CurveSource : integer; { Identifier for makemoves source }
foundnew : boolean; { true while xchr[s]='[' until ']' }
ascval : integer; { holds the ascii of curr. letter }
ascii_on : boolean; { reading ascval is 'on' }
{-------------------------------------------------------------}
selector: 0..5;
dig: array [0..22] of 0..15;
tally: integer;
termoffset: 0..maxprintline;
fileoffset: 0..maxprintline;
trickbuf: array [0..errorline] of ASCIIcode;
trickcount: integer;
firstcount: integer; {:54} {68:}
interaction: 0..3; {:68} {71:}
deletionsallowed: boolean;
history: 0..3;
errorcount: -1..100; {:71} {74:}
helpline: array [0..5] of strnumber;
helpptr: 0..6;
useerrhelp: boolean;
errhelp: strnumber; {:74} {91:}
interrupt: integer;
OKtointerrupt: boolean;
{:91}
{97:}
aritherror: boolean; {:97} {129:}
twotothe: array [0..30] of integer;
speclog: array [1..28] of integer; {:129} {137:}
specatan: array [1..26] of angle; {:137} {144:}
nsin, ncos: fraction; {:144}
{148:}
randoms: array [0..54] of fraction;
jrandom: 0..54; {:148} {158:}
tempptr: halfword; {:158} {159:}
mem: array [-30000..memmax] of memoryword;
lomemmax: halfword;
himemmin: halfword; {:159} {160:}
varused, dynused: integer;
{:160}
{161:}
avail: halfword;
memend: halfword; {:161} {166:}
rover: halfword;
{:166}
{178:}
freearr: packed array [-30000..memmax] of boolean;
wasfree: packed array [-30000..memmax] of boolean;
wasmemend, waslomax, washimin: halfword;
panicking: boolean; {:178} {190:}
internal: array [1..maxinternal] of scaled;
intname: array [1..maxinternal] of strnumber;
intptr: 40..maxinternal; {:190}
{196:}
oldsetting: 0..5; {:196} {198:}
charclass: array [ASCIIcode] of 0..20;
{:198}
{200:}
hashused: halfword;
stcount: integer; {:200} {201:}
hash: array [1..2241] of twohalves;
eqtb: array [1..2241] of twohalves; {:201}
{225:}
gpointer: halfword; {:225} {230:}
bignodesize: array [13..14] of smallnumber; {:230} {250:}
saveptr: halfword;
{:250}
{267:}
pathtail: halfword; {:267} {279:}
deltax, deltay, delta: array [0..pathsize] of scaled;
psi: array [1..pathsize] of angle; {:279} {283:}
theta: array [0..pathsize] of angle;
uu: array [0..pathsize] of fraction;
vv: array [0..pathsize] of angle;
ww: array [0..pathsize] of fraction; {:283}
{298:}
st, ct, sf, cf: fraction; {:298} {308:}
move: array [0..movesize] of integer;
moveptr: 0..movesize; {:308} {309:}
bisectstack: array [0..bistacksize] of integer;
bisectptr: 0..bistacksize;
{:309}
{327:}
curedges: halfword;
curwt: integer; {:327} {371:}
tracex: integer;
tracey: integer;
traceyy: integer; {:371} {379:}
octant: 1..8; {:379} {389:}
curx, cury: scaled; {:389} {395:}
octantdir: array [1..8] of strnumber; {:395}
{403:}
curspec: halfword;
turningnumber: integer;
curpen: halfword;
curpathtype: 0..2;
maxallowed: scaled; {:403} {427:}
before, after: array [0..maxwiggle] of scaled;
nodetoround: array [0..maxwiggle] of halfword;
curroundingptr: 0..maxwiggle;
maxroundingptr: 0..maxwiggle; {:427} {430:}
curgran: scaled; {:430} {448:}
octantnumber: array [1..8] of 1..8;
octantcode: array [1..8] of 1..8; {:448}
{455:}
revturns: boolean; {:455} {461:}
ycorr, xycorr, zcorr: array [1..8] of 0..1;
xcorr: array [1..8] of -1..1; {:461}
{464:}
m0, n0, m1, n1: integer;
d0, d1: 0..1; {:464} {507:}
envmove: array [0..movesize] of integer; {:507} {552:}
tolstep: 0..6; {:552}
{555:}
curt, curtt: integer;
timetogo: integer;
maxt: integer; {:555} {557:}
delx, dely: integer;
tol: integer;
uv, xy: 0..bistacksize;
threel: integer;
apprt, apprtt: integer; {:557} {566:}
{screenpixel:array[screenrow,screencol]of pixelcolor;}
{:566}
{569:}
screenstarted: boolean;
screenOK: boolean; {:569} {572:}
windowopen: array [windownumber] of boolean;
leftcol: array [windownumber] of screencol;
rightcol: array [windownumber] of screencol;
toprow: array [windownumber] of screenrow;
botrow: array [windownumber] of screenrow;
mwindow: array [windownumber] of integer;
nwindow: array [windownumber] of integer;
windowtime: array [windownumber] of integer; {:572} {579:}
rowtransition: transspec; {:579} {585:}
serialno: integer; {:585} {592:}
fixneeded: boolean;
watchcoefs: boolean;
depfinal: halfword; {:592} {624:}
curcmd: eightbits;
curmod: integer;
cursym: halfword; {:624} {628:}
inputstack: array [0..stacksize] of instaterecord;
inputptr: 0..stacksize;
maxinstack: 0..stacksize;
curinput: instaterecord; {:628} {631:}
inopen: 0..6;
inputfile: array [1..6] of alphafile;
line: integer;
linestack: array [1..6] of integer; {:631} {633:}
paramstack: array [0..150] of halfword;
paramptr: 0..150;
maxparamstack: integer; {:633} {634:}
fileptr: 0..stacksize; {:634} {659:}
scannerstatus: 0..6;
warninginfo: integer; {:659} {680:}
forceeof: boolean;
{:680}
{699:}
bgloc, egloc: 1..2241; {:699} {738:}
condptr: halfword;
iflimit: 0..4;
curif: smallnumber;
ifline: integer; {:738} {752:}
loopptr: halfword; {:752} {767:}
curname: strnumber;
curarea: strnumber;
curext: strnumber; {:767} {768:}
areadelimiter: poolpointer;
extdelimiter: poolpointer; {:768} {775:}
MFbasedefault: packed array [1..10] of char; {:775} {782:}
jobname: strnumber;
logname: strnumber; {:782} {785:}
gfext: strnumber; {:785} {791:}
gffile: bytefile;
outputfilename: strnumber; {:791} {796:}
curtype: smallnumber;
curexp: integer; {:796} {813:}
maxc: array [17..18] of integer;
maxptr: array [17..18] of halfword;
maxlink: array [17..18] of halfword; {:813} {821:}
varflag: 0..82; {:821} {954:}
txx, txy, tyx, tyy, tx, ty: scaled; {:954} {1077:}
startsym: halfword; {:1077}
{1084:}
longhelpseen: boolean; {:1084} {1087:}
tfmfile: bytefile;
metricfilename: strnumber; {:1087} {1096:}
bc, ec: eightbits;
tfmwidth: array [eightbits] of scaled;
tfmheight: array [eightbits] of scaled;
tfmdepth: array [eightbits] of scaled;
tfmitalcorr: array [eightbits] of scaled;
charexists: array [eightbits] of boolean;
chartag: array [eightbits] of 0..3;
charremainder: array [eightbits] of eightbits;
headerbyte: array [1..headersize] of -1..255;
ligkern: array [0..ligtablesize] of fourquarters;
nl: 0..ligtablesize;
kern: array [eightbits] of scaled;
nk: 0..256;
exten: array [eightbits] of fourquarters;
ne: 0..256;
param: array [1..maxfontdimen] of scaled;
np: 0..maxfontdimen;
nw, nh, nd, ni: 0..256; {:1096} {1119:}
perturbation: scaled; {:1119} {1125:}
dimenhead: array [1..4] of halfword; {:1125} {1130:}
maxtfmdimen: scaled;
tfmchanged: integer; {:1130} {1149:}
gfminm, gfmaxm, gfminn, gfmaxn: integer;
gfprevptr: integer;
totalchars: integer;
charptr: array [eightbits] of integer;
gfdx, gfdy: array [eightbits] of integer; {:1149} {1152:}
gfbuf: gfbuftype;
halfbuf: gfindex;
gflimit: gfindex;
gfptr: gfindex;
gfoffset: integer; {:1152}
{1162:}
bocc, bocp: integer; {:1162} {1183:}
baseident: strnumber; {:1183}
{1188:}
basefile: wordfile; {:1188} {1203:}
readyalready: integer; {:1203}
{1214:}
editnamestart: poolpointer;
editnamelength, editline: integer; {:1214}
procedure unskew(x, y: scaled; octant: smallnumber);external;
procedure sendcurve(x0,x1,x2,x3,y0,y1,y2,y3,octant:integer);external;
procedure sendline(x0,y0,x1,y1,octant,LineSource:integer);external;
procedure confusion(s: strnumber);external;
function abvscd(a, b, c, d: integer): integer;external;
procedure makemoves(xx0, xx1, xx2, xx3, yy0, yy1, yy2, yy3: scaled; xicorr, etacorr: smallnumber;CurveSource:integer;oc:smallnumber);external;
procedure print_start(var f:postscript);external;
procedure print_end(var f:postscript);external;
procedure init_ps(var f:postscript);external;
procedure tini_ps(var f:postscript);external;
procedure auxslowprint(s: integer);external;
procedure auxprintnl(s: strnumber);external;
procedure sendascii(asc: integer);external;
{------------------------------}
{ $Header$ }
{ declarations for external C assist routines for MetaFont }
procedure exit(x : integer);
external;
procedure closea(var f:text);
external;
procedure closew(var f:wordfile);
external;
procedure dateandtime(var minutes, day, month, year : integer);
external;
procedure setpaths;
external;
function testaccess(var nameoffile, realnameoffile: UNIXfilename;
accessmode:integer; filepath:integer): boolean;
external;
procedure calledit(var filename: ASCIIcode; fnlength, linenumber: integer);
external;
function bopenout(var f: bytefile; var name: UNIXfilename): boolean;
external;
procedure bclose(var f: bytefile);
external;
procedure bgetname(var f: bytefile; var name: UNIXfilename);
external;
procedure bwritebuf(var f: bytefile; var buf: gfbuftype;
first, last: integer);
external;
procedure bwritebyte(var f: bytefile; b: integer);
external;
procedure bwrite2bytes(var f: bytefile; b: integer);
external;
procedure bwrite4bytes(var f: bytefile; b: integer);
external;
function makefraction(p, q: integer): fraction;
external;
function takefraction(q: integer; f: fraction): integer;
external;
{ $Header$ }
{ External procedures for UNIX MetaFont VIRMF for display graphics }
function initscreen: boolean;
external;
procedure updatescreen;
external;
procedure blankrectangle(leftcol, rightcol: screencol; toprow, botrow: screenrow);
external;
procedure paintrow(r: screenrow; b: pixelcolor; var a: transspec; n: screencol);
external;
procedure initialize; {19:}
var
i: 0..127; {:19} {130:}
k: integer; {:130} {21:}
begin
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] := ' '; {:21} {22:}
for i := 1 to 31 do
xchr[i] := ' ';
xchr[9] := chr(9);
xchr[12] := chr(12); {:22}
{23:}
for i := 0 to 127 do
xord[chr(i)] := 127;
for i := 1 to 126 do
xord[xchr[i]] := i; {:23} {69:}
interaction := 3; {:69} {72:}
deletionsallowed := true;
errorcount := 0; {:72} {75:}
helpptr := 0;
useerrhelp := false;
errhelp := 0; {:75} {92:}
interrupt := 0;
OKtointerrupt := true;
{:92}
{98:}
aritherror := false; {:98} {131:}
twotothe[0] := 1;
for k := 1 to 30 do
twotothe[k] := 2 * twotothe[k - 1];
speclog[1] := 93032640;
speclog[2] := 38612034;
speclog[3] := 17922280;
speclog[4] := 8662214;
speclog[5] := 4261238;
speclog[6] := 2113709;
speclog[7] := 1052693;
speclog[8] := 525315;
speclog[9] := 262400;
speclog[10] := 131136;
speclog[11] := 65552;
speclog[12] := 32772;
speclog[13] := 16385;
for k := 14 to 27 do
speclog[k] := twotothe[27 - k];
speclog[28] := 1; {:131}
{138:}
specatan[1] := 27855475;
specatan[2] := 14718068;
specatan[3] := 7471121;
specatan[4] := 3750058;
specatan[5] := 1876857;
specatan[6] := 938658;
specatan[7] := 469357;
specatan[8] := 234682;
specatan[9] := 117342;
specatan[10] := 58671;
specatan[11] := 29335;
specatan[12] := 14668;
specatan[13] := 7334;
specatan[14] := 3667;
specatan[15] := 1833;
specatan[16] := 917;
specatan[17] := 458;
specatan[18] := 229;
specatan[19] := 115;
specatan[20] := 57;
specatan[21] := 29;
specatan[22] := 14;
specatan[23] := 7;
specatan[24] := 4;
specatan[25] := 2;
specatan[26] := 1; {:138} {179:}
{wasmemend:=-30000;waslomax:=-30000;washimin:=memmax;panicking:=false;}
{:179}
{191:}
for k := 1 to 40 do
internal[k] := 0;
intptr := 40; {:191} {199:}
for k := 48 to 57 do
charclass[k] := 0;
charclass[46] := 1;
charclass[32] := 2;
charclass[37] := 3;
charclass[34] := 4;
charclass[44] := 5;
charclass[59] := 6;
charclass[40] := 7;
charclass[41] := 8;
for k := 65 to 90 do
charclass[k] := 9;
for k := 97 to 122 do
charclass[k] := 9;
charclass[95] := 9;
charclass[60] := 10;
charclass[61] := 10;
charclass[62] := 10;
charclass[58] := 10;
charclass[124] := 10;
charclass[96] := 11;
charclass[39] := 11;
charclass[43] := 12;
charclass[45] := 12;
charclass[47] := 13;
charclass[42] := 13;
charclass[92] := 13;
charclass[33] := 14;
charclass[63] := 14;
charclass[35] := 15;
charclass[38] := 15;
charclass[64] := 15;
charclass[36] := 15;
charclass[94] := 16;
charclass[126] := 16;
charclass[91] := 17;
charclass[93] := 18;
charclass[123] := 19;
charclass[125] := 19;
for k := 0 to 31 do
charclass[k] := 20;
charclass[127] := 20;
charclass[9] := 2;
charclass[12] := 2; {:199} {202:}
hash[1].lh := 0;
hash[1].rh := 0;
eqtb[1].lh := 41;
eqtb[1].rh := -30000;
for k := 2 to 2241 do begin
hash[k] := hash[1];
eqtb[k] := eqtb[1]
end; {:202} {231:}
bignodesize[13] := 12;
bignodesize[14] := 4;
{:231}
{251:}
saveptr := -30000; {:251} {396:}
octantdir[1] := 415;
octantdir[5] := 416;
octantdir[6] := 417;
octantdir[2] := 418;
octantdir[4] := 419;
octantdir[8] := 420;
octantdir[7] := 421;
octantdir[3] := 422; {:396} {428:}
maxroundingptr := 0; {:428} {449:}
octantcode[1] := 1;
octantcode[2] := 5;
octantcode[3] := 6;
octantcode[4] := 2;
octantcode[5] := 4;
octantcode[6] := 8;
octantcode[7] := 7;
octantcode[8] := 3;
for k := 1 to 8 do
octantnumber[octantcode[k]] := k; {:449} {456:}
revturns := false; {:456} {462:}
xcorr[1] := 0;
ycorr[1] := 0;
xycorr[1] := 0;
xcorr[5] := 0;
ycorr[5] := 0;
xycorr[5] := 1;
xcorr[6] := -1;
ycorr[6] := 1;
xycorr[6] := 0;
xcorr[2] := 1;
ycorr[2] := 0;
xycorr[2] := 1;
xcorr[4] := 0;
ycorr[4] := 1;
xycorr[4] := 1;
xcorr[8] := 0;
ycorr[8] := 1;
xycorr[8] := 0;
xcorr[7] := 1;
ycorr[7] := 0;
xycorr[7] := 1;
xcorr[3] := -1;
ycorr[3] := 1;
xycorr[3] := 0;
for k := 1 to 8 do
zcorr[k] := xycorr[k] - xcorr[k]; {:462} {570:}
screenstarted := false;
screenOK := false; {:570} {573:}
for k := 0 to 15 do begin
windowopen[k] := false;
windowtime[k] := 0
end; {:573}
{593:}
fixneeded := false;
watchcoefs := true; {:593} {739:}
condptr := -30000;
iflimit := 0;
curif := 0;
ifline := 0; {:739} {753:}
loopptr := -30000; {:753} {776:}
MFbasedefault := 'plain.base'; {:776} {797:}
curexp := 0; {:797} {822:}
varflag := 0; {:822} {1078:}
startsym := 0; {:1078} {1085:}
longhelpseen := false;
{:1085}
{1097:}
for k := 0 to 255 do begin
tfmwidth[k] := 0;
tfmheight[k] := 0;
tfmdepth[k] := 0;
tfmitalcorr[k] := 0;
charexists[k] := false;
chartag[k] := 0;
charremainder[k] := 0
end;
for k := 1 to headersize do
headerbyte[k] := -1;
bc := 255;
ec := 0;
nl := 0;
nk := 0;
ne := 0;
np := 0; {:1097} {1150:}
gfprevptr := 0;
totalchars := 0; {:1150} {1153:}
halfbuf := gfbufsize div 2;
gflimit := gfbufsize;
gfptr := 0;
gfoffset := 0; {:1153} {1184:}
baseident := 0; {:1184} {1215:}
editnamestart := 0
end; {:1215} {57:}
procedure println;
begin
case selector of
3:
begin
writeln(output);
writeln(logfile);
termoffset := 0;
fileoffset := 0
end;
2:
begin
writeln(logfile);
fileoffset := 0
end;
1:
begin
writeln(output);
termoffset := 0
end;
0, 4, 5:
end
end; {:57} {58:}
procedure printchar(s: ASCIIcode);
var tmp : integer;
begin
case selector of
3:
begin
{----------------------------------}
if xchr[s] = '[' then
begin
ascii_on := true;
ascval := 0;
end
else if xchr[s] = ']' then
begin
ascii_on := false;
sendascii(ascval);
end
else if ascii_on then
begin
tmp := s - ord('0');
ascval := ascval*10+tmp;
end;
{-------------------------------------}
write(output, xchr[s]);
write(logfile, xchr[s]);
termoffset := termoffset + 1;
fileoffset := fileoffset + 1;
if termoffset = maxprintline then begin
writeln(output);
termoffset := 0
end;
if fileoffset = maxprintline then begin
writeln(logfile);
fileoffset := 0
end
end;
2:
begin
write(logfile, xchr[s]);
fileoffset := fileoffset + 1;
if fileoffset = maxprintline then
println
end;
1:
begin
write(output, xchr[s]);
termoffset := termoffset + 1;
if termoffset = maxprintline then
println
end;
0:
;
4:
if tally < trickcount then
trickbuf[tally mod errorline] := s;
5:
begin
if poolptr < poolsize then begin
strpool[poolptr] := s;
poolptr := poolptr + 1
end
end
end;
tally := tally + 1
end; {:58} {59:}
procedure print(s: integer);
var
j: poolpointer;
begin
if (s < 0) or (s >= strptr) then
s := 131;
j := strstart[s];
while j < strstart[s + 1] do begin
printchar(strpool[j]);
j := j + 1
end
end; {:59}
{60:}
procedure slowprint(s: integer);
var
j: poolpointer;
begin
if (s < 0) or (s >= strptr) then
s := 131;
j := strstart[s];
while j < strstart[s + 1] do begin
print(strpool[j]);
j := j + 1
end
end; {:60}
{62:}
procedure printnl(s: strnumber);
begin
if ((termoffset > 0) and odd(selector)) or ((fileoffset > 0) and (selector >= 2)) then
println;
print(s)
end; {:62} {63:}
procedure printthedigs(k: eightbits);
begin
while k > 0 do begin
k := k - 1;
printchar(48 + dig[k])
end
end; {:63} {64:}
procedure printint(n: integer);
var
k: 0..23;
m: integer;
begin
k := 0;
if n < 0 then begin
printchar(45);
if n > (-100000000) then
n := -n
else begin
m := (-1) - n;
n := m div 10;
m := (m mod 10) + 1;
k := 1;
if m < 10 then
dig[0] := m
else begin
dig[0] := 0;
n := n + 1
end
end
end;
repeat
dig[k] := n mod 10;
n := n div 10;
k := k + 1
until n = 0;
printthedigs(k)
end; {:64} {103:}
procedure printscaled(s: scaled);
var
delta: scaled;
begin
if s < 0 then begin
printchar(45);
s := -s
end;
printint(s div 65536);
s := (10 * (s mod 65536)) + 5;
if s <> 5 then begin
delta := 10;
printchar(46);
repeat
if delta > 65536 then
s := (s + 32768) - (delta div 2);
printchar(48 + (s div 65536));
s := 10 * (s mod 65536);
delta := delta * 10
until s <= delta
end
end; {:103} {104:}
procedure printtwo(x, y: scaled);
begin
printchar(40);
printscaled(x);
printchar(44);
printscaled(y);
printchar(41)
end; {:104} {187:}
procedure printtype(t: smallnumber);
begin
if t in
[1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 16, 17,
18, 15, 19, 20, 21, 22, 23] then
case t of
1:
print(194);
2:
print(195);
3:
print(196);
4:
print(197);
5:
print(198);
6:
print(199);
7:
print(200);
8:
print(201);
9:
print(202);
10:
print(203);
11:
print(204);
12:
print(205);
13:
print(206);
14:
print(207);
16:
print(208);
17:
print(209);
18:
print(210);
15:
print(211);
19:
print(212);
20:
print(213);
21:
print(214);
22:
print(215);
23:
print(216)
end
else
print(217)
end; {:187} {195:}
procedure begindiagnostic;
begin
oldsetting := selector;
if (internal[13] <= 0) and (selector = 3) then begin
selector := selector - 1;
if history = 0 then
history := 1
end
end; { begindiagnostic }
procedure enddiagnostic(blankline: boolean);
begin
printnl(155);
if blankline then
println;
selector := oldsetting
end; {:195} {197:}
procedure printdiagnostic(s, t: strnumber; nuline: boolean);
begin
begindiagnostic;
if nuline then
printnl(s)
else
print(s);
print(320);
printint(line);
print(t);
printchar(58)
end; {:197} {773:}
procedure printfilename(n, a, e: integer);
begin
print(a);
print(n);
print(e)
end; {:773} {73:}
procedure normalizeselector;
forward;
procedure getnext;
forward;
procedure terminput;
forward;
procedure showcontext;
forward;
procedure beginfilereading;
forward;
procedure openlogfile;
forward;
procedure closefilesandtermina;
forward;
procedure clearforerrorprompt;
forward; {procedure debughelp;forward;} {43:}
procedure flushstring(s: strnumber);
begin
if s < (strptr - 1) then
strref[s] := 0
else
repeat
strptr := strptr - 1
until strref[strptr - 1] <> 0;
poolptr := strstart[strptr]
end; {:43} {:73} {76:}
procedure jumpout;
begin
goto 9998
end; {:76} {77:}
procedure error;
label
22, 10;
var
c: ASCIIcode;
s1, s2, s3: integer;
j: poolpointer;
begin
if history < 2 then
history := 2;
printchar(46);
showcontext;
if interaction = 3 then {78:}
while true do begin
22:
clearforerrorprompt;
begin
print(135);
terminput
end;
if last = first then
goto 10;
c := buffer[first];
if c >= 97 then
c := c - 32; {79:}
if c in
[48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 69, 72, 73, 81, 82, 83,
88] then
case c of
48, 49, 50, 51, 52, 53, 54,
55, 56, 57:
if deletionsallowed then begin {83:}
s1 := curcmd;
s2 := curmod;
s3 := cursym;
OKtointerrupt := false;
if ((last > (first + 1)) and (buffer[first + 1] >= 48)) and (buffer[first + 1] <= 57) then
c := ((c * 10) + buffer[first + 1]) - (48 * 11)
else
c := c - 48;
while c > 0 do begin
getnext;
{743:}
if curcmd = 39 then begin
if strref[curmod] < 127 then
if strref[curmod] > 1 then
strref[curmod] := strref[curmod] - 1
else
flushstring(curmod)
end {:743};
c := c - 1
end;
curcmd := s1;
curmod := s2;
cursym := s3;
OKtointerrupt := true;
begin
helpptr := 2;
helpline[1] := 148;
helpline[0] := 149
end;
showcontext;
goto 22
end {:83}; {68:begin debughelp;goto 22;end;}
69:
if fileptr > 0 then begin
editnamestart := strstart[inputstack[fileptr].namefield];
editnamelength := strstart[inputstack[fileptr].namefield + 1] - strstart[inputstack[fileptr].namefield];
editline := line;
jumpout
end;
72:
begin {84:}
if useerrhelp then begin {85:}
j := strstart[errhelp];
while j < strstart[errhelp + 1] do begin
if strpool[j] <> 37 then
print(strpool[j])
else if (j + 1) = strstart[errhelp + 1] then
println
else if strpool[j + 1] <> 37 then
println
else begin
j := j + 1;
printchar(37)
end;
j := j + 1
end {:85};
useerrhelp := false
end else begin
if helpptr = 0 then begin
helpptr := 2;
helpline[1] := 150;
helpline[0] := 151
end;
repeat
helpptr := helpptr - 1;
print(helpline[helpptr]);
println
until helpptr = 0
end;
begin
helpptr := 4;
helpline[3] := 152;
helpline[2] := 151;
helpline[1] := 153;
helpline[0] := 154
end;
goto 22
end; {:84}
73:
begin {82:}
beginfilereading;
if last > (first + 1) then begin
curinput.locfield := first + 1;
buffer[first] := 32
end else begin
begin
print(147);
terminput
end;
curinput.locfield := first
end;
first := last + 1;
curinput.limitfield := last;
goto 10
end; {:82}
81, 82, 83:
begin {81:}
errorcount := 0;
interaction := (0 + c) - 81;
print(142);
case c of
81:
begin
print(143);
selector := selector - 1
end;
82:
print(144);
83:
print(145)
end;
print(146);
println;
flush(output);
goto 10
end; {:81}
88:
begin
interaction := 2;
jumpout
end
end
else
; {80:}
begin
print(136);
printnl(137);
printnl(138);
if fileptr > 0 then
print(139);
if deletionsallowed then
printnl(140);
printnl(141)
end {:80} {:79}
end {:78};
errorcount := errorcount + 1;
if errorcount = 100 then begin
printnl(134);
history := 3;
jumpout
end; {86:}
if interaction > 0 then
selector := selector - 1;
if useerrhelp then begin
printnl(155); {85:}
j := strstart[errhelp];
while j < strstart[errhelp + 1] do begin
if strpool[j] <> 37 then
print(strpool[j])
else if (j + 1) = strstart[errhelp + 1] then
println
else if strpool[j + 1] <> 37 then
println
else begin
j := j + 1;
printchar(37)
end;
j := j + 1
end {:85}
end else
while helpptr > 0 do begin
helpptr := helpptr - 1;
printnl(helpline[helpptr])
end;
println;
if interaction > 0 then
selector := selector + 1; {:86}
println;
10:
end; {:77}
{88:}
procedure fatalerror(s: strnumber);
begin
normalizeselector;
begin
if interaction = 3 then
;
printnl(133);
print(156)
end;
begin
helpptr := 1;
helpline[0] := s
end;
begin
if interaction = 3 then
interaction := 2;
error;
{if interaction>0 then debughelp;}
history := 3;
jumpout
end
end; {:88} {89:}
procedure overflow(s: strnumber; n: integer);
begin
normalizeselector;
begin
if interaction = 3 then
;
printnl(133);
print(157)
end;
print(s);
printchar(61);
printint(n);
printchar(93);
begin
helpptr := 2;
helpline[1] := 158;
helpline[0] := 159
end;
begin
if interaction = 3 then
interaction := 2;
error;
{if interaction>0 then debughelp;}
history := 3;
jumpout
end
end; {:89} {90:}
procedure confusion;
begin
normalizeselector;
if history < 2 then begin
begin
if interaction = 3 then
;
printnl(133);
print(160)
end;
print(s);
printchar(41);
begin
helpptr := 1;
helpline[0] := 161
end
end else begin
begin
if interaction = 3 then
;
printnl(133);
print(162)
end;
begin
helpptr := 2;
helpline[1] := 163;
helpline[0] := 164
end
end;
begin
if interaction = 3 then
interaction := 2;
error;
{if interaction>0 then debughelp;}
history := 3;
jumpout
end
end; {:90} {:4}
{26:}
function aopenin(var f: alphafile; pathspecifier: integer): boolean;
var
ok: boolean;
begin
if testaccess(nameoffile, realnameoffile, 4, pathspecifier) then begin
reset(f, realnameoffile);
ok := true
end else
ok := false;
aopenin := ok
end; { aopenin }
function aopenout(var f: alphafile): boolean;
var
ok: boolean;
begin
if testaccess(nameoffile, realnameoffile, 2, 0) then begin
rewrite(f, realnameoffile);
ok := true
end else
ok := false;
aopenout := ok
end; { aopenout }
function wopenin(var f: wordfile): boolean;
var
ok: boolean;
begin
if testaccess(nameoffile, realnameoffile, 4, 7) then begin
reset(f, realnameoffile);
ok := true
end else
ok := false;
wopenin := ok
end; { wopenin }
function wopenout(var f: wordfile): boolean;
var
ok: boolean;
begin
if testaccess(nameoffile, realnameoffile, 2, 0) then begin
rewrite(f, nameoffile);
ok := true
end else
ok := false;
wopenout := ok
end; {:26} {27:}
procedure aclose(var f: alphafile);
begin
closea(f)
end; { aclose }
procedure wclose(var f: wordfile);
begin
closew(f)
end; {:27} {30:}
function inputln(var f: alphafile; bypasseoln: boolean): boolean;
var
lastnonblank: 0..bufsize;
begin
if bypasseoln then
if not eof(f) then
if eoln(f) then
get(f);
last := first;
if eof(f) then
inputln := false
else begin
lastnonblank := first;
while not eoln(f) do begin
if last >= maxbufstack then begin
maxbufstack := last + 1;
if maxbufstack = bufsize then
overflow(128, bufsize)
end;
buffer[last] := xord[f^];
get(f);
last := last + 1;
if buffer[last - 1] <> 32 then
lastnonblank := last
end;
last := lastnonblank;
inputln := true
end
end; {:30} {36:}
function initterminal: boolean;
label
10;
var
dummy, i, j, k: integer;
arg: packed array [1..100] of char;
begin
if argc > 1 then begin
last := first;
for i := 1 to argc - 1 do begin
argv(i, arg);
j := 1;
k := 100;
while (k > 1) and (arg[k] = ' ') do
k := k - 1;
while j <= k do begin
buffer[last] := xord[arg[j]];
j := j + 1;
last := last + 1
end;
if k > 1 then begin
buffer[last] := xord[' '];
last := last + 1
end
end;
if last > first then begin
curinput.locfield := first;
initterminal := true;
goto 10
end
end;
while true do begin
write(output, '**');
flush(output);
if not inputln(input, true) then begin
writeln(output);
writeln(output, '! End of file on the terminal... why?');
initterminal := false;
goto 10
end;
curinput.locfield := first;
while (curinput.locfield < last) and (buffer[curinput.locfield] = 32) do
curinput.locfield := curinput.locfield + 1;
if curinput.locfield < last then begin
initterminal := true;
goto 10
end;
writeln(output, 'Please type the name of your input file.')
end;
10:
end; { initterminal }
{:36}
{44:}
function makestring: strnumber;
begin
if strptr = maxstrptr then begin
if strptr = maxstrings then
overflow(130, maxstrings - initstrptr);
maxstrptr := maxstrptr + 1
end;
strref[strptr] := 1;
strptr := strptr + 1;
strstart[strptr] := poolptr;
makestring := strptr - 1
end; { makestring }
{:44}
{45:}
function streqbuf(s: strnumber; k: integer): boolean;
label
45;
var
j: poolpointer;
result: boolean;
begin
j := strstart[s];
while j < strstart[s + 1] do begin
if strpool[j] <> buffer[k] then begin
result := false;
goto 45
end;
j := j + 1;
k := k + 1
end;
result := true;
45:
streqbuf := result
end; {:45} {46:}
function strvsstr(s, t: strnumber): integer;
label
10;
var
j, k: poolpointer;
ls, lt: integer;
l: integer;
begin
ls := strstart[s + 1] - strstart[s];
lt := strstart[t + 1] - strstart[t];
if ls <= lt then
l := ls
else
l := lt;
j := strstart[s];
k := strstart[t];
while l > 0 do begin
if strpool[j] <> strpool[k] then begin
strvsstr := strpool[j] - strpool[k];
goto 10
end;
j := j + 1;
k := k + 1;
l := l - 1
end;
strvsstr := ls - lt;
10:
end; {:46} {47:}
{function getstringsstarted:boolean;label 30,10;
var k,l:0..127;m,n:char;g:strnumber;a:integer;c:boolean;
begin poolptr:=0;strptr:=0;maxpoolptr:=0;maxstrptr:=0;strstart[0]:=0;
[48:]for k:=0 to 127 do begin if([49:](k<32)or(k>126)[:49])then begin
begin strpool[poolptr]:=94;poolptr:=poolptr+1;end;
begin strpool[poolptr]:=94;poolptr:=poolptr+1;end;
if k<64 then begin strpool[poolptr]:=k+64;poolptr:=poolptr+1;
end else begin strpool[poolptr]:=k-64;poolptr:=poolptr+1;end;
end else begin strpool[poolptr]:=k;poolptr:=poolptr+1;end;g:=makestring;
strref[g]:=127;end[:48];[51:]nameoffile:=poolname;
if aopenin(poolfile,8)then begin c:=false;
repeat[52:]begin if eof(poolfile)then begin;
writeln(output,'! mf.pool has no check sum.');aclose(poolfile);
getstringsstarted:=false;goto 10;end;read(poolfile,m,n);
if m='*'then[53:]begin a:=0;k:=1;
while true do begin if(xord[n]<48)or(xord[n]>57)then begin;
writeln(output,'! mf.pool check sum doesn''t have nine digits.');
aclose(poolfile);getstringsstarted:=false;goto 10;end;
a:=10*a+xord[n]-48;if k=9 then goto 30;k:=k+1;read(poolfile,n);end;
30:if a<>503742536 then begin;
writeln(output,'! mf.pool doesn''t match; tangle me again.');
aclose(poolfile);getstringsstarted:=false;goto 10;end;c:=true;
end[:53]else begin if(xord[m]<48)or(xord[m]>57)or(xord[n]<48)or(xord[n]>
57)then begin;
writeln(output,'! mf.pool line doesn''t begin with two digits.');
aclose(poolfile);getstringsstarted:=false;goto 10;end;
l:=xord[m]*10+xord[n]-48*11;
if poolptr+l+stringvacancies>poolsize then begin;
writeln(output,'! You have to increase POOLSIZE.');aclose(poolfile);
getstringsstarted:=false;goto 10;end;
for k:=1 to l do begin if eoln(poolfile)then m:=' 'else read(poolfile,m)
;begin strpool[poolptr]:=xord[m];poolptr:=poolptr+1;end;end;
readln(poolfile);g:=makestring;strref[g]:=127;end;end[:52];until c;
aclose(poolfile);getstringsstarted:=true;end else begin;
writeln(output,'! I can''t read mf.pool.');aclose(poolfile);
getstringsstarted:=false;goto 10;end[:51];10:end;}
{:47}
{65:}
procedure printdd(n: integer);
begin
n := abs(n) mod 100;
printchar(48 + (n div 10));
printchar(48 + (n mod 10))
end; {:65} {66:}
procedure terminput;
var
k: 0..bufsize;
begin
flush(output);
if not inputln(input, true) then
fatalerror(132);
termoffset := 0;
selector := selector - 1;
if last <> first then
for k := first to last - 1 do
print(buffer[k]);
println;
buffer[last] := 37;
selector := selector + 1
end; {:66} {87:}
procedure normalizeselector;
begin
if jobname > 0 then
selector := 3
else
selector := 1;
if jobname = 0 then
openlogfile;
if interaction = 0 then
selector := selector - 1
end; {:87} {93:}
procedure pauseforinstructions;
begin
if OKtointerrupt then begin
interaction := 3;
if (selector = 2) or (selector = 0) then
selector := selector + 1;
begin
if interaction = 3 then
;
printnl(133);
print(165)
end;
begin
helpptr := 3;
helpline[2] := 166;
helpline[1] := 167;
helpline[0] := 168
end;
deletionsallowed := false;
error;
deletionsallowed := true;
interrupt := 0
end
end; {:93} {94:}
procedure missingerr(s: strnumber);
begin
begin
if interaction = 3 then
;
printnl(133);
print(169)
end;
print(s);
print(170)
end; {:94} {99:}
procedure cleararith;
begin
begin
if interaction = 3 then
;
printnl(133);
print(171)
end;
begin
helpptr := 4;
helpline[3] := 172;
helpline[2] := 173;
helpline[1] := 174;
helpline[0] := 175
end;
error;
aritherror := false
end; {:99} {100:}
function slowadd(x, y: integer): integer;
begin
if x >= 0 then
if y <= (2147483647 - x) then
slowadd := x + y
else begin
aritherror := true;
slowadd := 2147483647
end
else if (-y) <= (2147483647 + x) then
slowadd := x + y
else begin
aritherror := true;
slowadd := -2147483647
end
end; {:100} {102:}
function rounddecimals(k: smallnumber): scaled;
var
a: integer;
begin
a := 0;
while k > 0 do begin
k := k - 1;
a := (a + (dig[k] * 131072)) div 10
end;
rounddecimals := (a + 1) div 2
end; {:102} {112:}
function takescaled(q: integer; f: scaled): integer;
var
p: integer;
negative: boolean;
n: integer;
becareful: integer; {110:}
begin
if f >= 0 then
negative := false
else begin
f := -f;
negative := true
end;
if q < 0 then begin
q := -q;
negative := not negative
end; {:110}
if f < 65536 then
n := 0
else begin
n := f div 65536;
f := f mod 65536;
if q <= (2147483647 div n) then
n := n * q
else begin
aritherror := true;
n := 2147483647
end
end;
f := f + 65536; {113:}
p := 32768;
if q < 1073741824 then
repeat
if odd(f) then
p := (p + q) div 2
else
p := p div 2;
f := f div 2
until f = 1
else
repeat
if odd(f) then
p := p + ((q - p) div 2)
else
p := p div 2;
f := f div 2
until f = 1 {:113};
becareful := n - 2147483647;
if (becareful + p) > 0 then begin
aritherror := true;
n := 2147483647 - p
end;
if negative then
takescaled := -(n + p)
else
takescaled := n + p
end; {:112} {114:}
function makescaled(p, q: integer): scaled;
var
f: integer;
n: integer;
negative: boolean;
becareful: integer;
begin
if p >= 0 then
negative := false
else begin
p := -p;
negative := true
end;
if q <= 0 then begin {if q=0 then confusion(47);}
q := -q;
negative := not negative
end;
n := p div q;
p := p mod q;
if n >= 32768 then begin
aritherror := true;
if negative then
makescaled := -2147483647
else
makescaled := 2147483647
end else begin
n := (n - 1) * 65536; {115:}
f := 1;
repeat
becareful := p - q;
p := becareful + p;
if p >= 0 then
f := (f + f) + 1
else begin
f := f + f;
p := p + q
end
until f >= 65536;
becareful := p - q;
if (becareful + p) >= 0 then
f := f + 1 {:115};
if negative then
makescaled := -(f + n)
else
makescaled := f + n
end
end; {:114}
{116:}
function velocity(st, ct, sf, cf: fraction; t: scaled): fraction;
var
acc, num, denom: integer;
begin
acc := takefraction(st - (sf div 16), sf - (st div 16));
acc := takefraction(acc, ct - cf);
num := 536870912 + takefraction(acc, 379625062);
denom := (805306368 + takefraction(ct, 497706707)) + takefraction(cf, 307599661);
if t <> 65536 then
num := makescaled(num, t);
if (num div 4) >= denom then
velocity := 1073741824
else
velocity := makefraction(num, denom)
end; {:116} {117:}
function abvscd ;
label
10;
var
q, r: integer; {118:}
begin
if a < 0 then begin
a := -a;
b := -b
end;
if c < 0 then begin
c := -c;
d := -d
end;
if d <= 0 then begin
if b >= 0 then
if ((a = 0) or (b = 0)) and ((c = 0) or (d = 0)) then begin
abvscd := 0;
goto 10
end else begin
abvscd := 1;
goto 10
end;
if d = 0 then
if a = 0 then begin
abvscd := 0;
goto 10
end else begin
abvscd := -1;
goto 10
end;
q := a;
a := c;
c := q;
q := -b;
b := -d;
d := q
end else if b <= 0 then begin
if b < 0 then
if a > 0 then begin
abvscd := -1;
goto 10
end;
if c = 0 then begin
abvscd := 0;
goto 10
end else begin
abvscd := -1;
goto 10
end
end {:118};
while true do begin
q := a div d;
r := c div b;
if q <> r then
if q > r then begin
abvscd := 1;
goto 10
end else begin
abvscd := -1;
goto 10
end;
q := a mod d;
r := c mod b;
if r = 0 then
if q = 0 then begin
abvscd := 0;
goto 10
end else begin
abvscd := 1;
goto 10
end;
if q = 0 then begin
abvscd := -1;
goto 10
end;
a := b;
b := q;
c := d;
d := r
end;
10:
end; {:117} {119:}
function floorscaled(x: scaled): scaled;
var
becareful: integer;
begin
if x >= 0 then
floorscaled := x - (x mod 65536)
else begin
becareful := x + 1;
floorscaled := (x + ((-becareful) mod 65536)) - 65535
end
end; { floorscaled }
function floorunscaled(x: scaled): integer;
var
becareful: integer;
begin
if x >= 0 then
floorunscaled := x div 65536
else begin
becareful := x + 1;
floorunscaled := -(1 + ((-becareful) div 65536))
end
end; { floorunscaled }
function roundunscaled(x: scaled): integer;
var
becareful: integer;
begin
if x >= 32768 then
roundunscaled := 1 + ((x - 32768) div 65536)
else if x >= (-32768) then
roundunscaled := 0
else begin
becareful := x + 1;
roundunscaled := -(1 + (((-becareful) - 32768) div 65536))
end
end; { roundunscaled }
function roundfraction(x: fraction): scaled;
var
becareful: integer;
begin
if x >= 2048 then
roundfraction := 1 + ((x - 2048) div 4096)
else if x >= (-2048) then
roundfraction := 0
else begin
becareful := x + 1;
roundfraction := -(1 + (((-becareful) - 2048) div 4096))
end
end; {:119} {121:}
function squarert(x: scaled): scaled;
var
k: smallnumber;
y, q: integer;
begin
if x <= 0 then begin {122:}
if x < 0 then begin
begin
if interaction = 3 then
;
printnl(133);
print(176)
end;
printscaled(x);
print(177);
begin
helpptr := 2;
helpline[1] := 178;
helpline[0] := 179
end;
error
end;
squarert := 0
end else begin {:122}
k := 23;
q := 2;
while x < 536870912 do begin
k := k - 1;
x := ((x + x) + x) + x
end;
if x < 1073741824 then
y := 0
else begin
x := x - 1073741824;
y := 1
end; {123:}
repeat
x := x + x;
y := y + y;
if x >= 1073741824 then begin
x := x - 1073741824;
y := y + 1
end;
x := x + x;
y := (y + y) - q;
q := q + q;
if x >= 1073741824 then begin
x := x - 1073741824;
y := y + 1
end;
if y > q then begin
y := y - q;
q := q + 2
end else if y <= 0 then begin
q := q - 2;
y := y + q
end;
k := k - 1 {:123}
until k = 0;
squarert := q div 2
end
end; {:121}
{124:}
function pythadd(a, b: integer): integer;
label
30;
var
r: fraction;
big: boolean;
begin
a := abs(a);
b := abs(b);
if a < b then begin
r := b;
b := a;
a := r
end;
if a > 0 then begin
if a < 536870912 then
big := false
else begin
a := a div 4;
b := b div 4;
big := true
end; {125:}
while true do begin
r := makefraction(b, a);
r := takefraction(r, r);
if r = 0 then
goto 30;
r := makefraction(r, 1073741824 + r);
a := a + takefraction(a + a, r);
b := takefraction(b, r)
end;
30: {:125}
;
if big then
if a < 536870912 then
a := ((a + a) + a) + a
else begin
aritherror := true;
a := 2147483647
end
end;
pythadd := a
end; {:124} {126:}
function pythsub(a, b: integer): integer;
label
30;
var
r: fraction;
big: boolean;
begin
a := abs(a);
b := abs(b);
if a <= b then begin {128:}
if a < b then begin
begin
if interaction = 3 then
;
printnl(133);
print(180)
end;
printscaled(a);
print(181);
printscaled(b);
print(177);
begin
helpptr := 2;
helpline[1] := 178;
helpline[0] := 179
end;
error
end;
a := 0
end else begin {:128}
if a < 1073741824 then
big := false
else begin
a := a div 2;
b := b div 2;
big := true
end; {127:}
while true do begin
r := makefraction(b, a);
r := takefraction(r, r);
if r = 0 then
goto 30;
r := makefraction(r, 1073741824 - r);
a := a - takefraction(a + a, r);
b := takefraction(b, r)
end;
30: {:127}
;
if big then
a := a + a
end;
pythsub := a
end; {:126} {132:}
function mlog(x: scaled): scaled;
var
y, z: integer;
k: integer;
begin
if x <= 0 then begin {134:}
begin
if interaction = 3 then
;
printnl(133);
print(182)
end;
printscaled(x);
print(177);
begin
helpptr := 2;
helpline[1] := 183;
helpline[0] := 179
end;
error;
mlog := 0
end else begin {:134}
y := 1302456860;
z := 6581195;
while x < 1073741824 do begin
x := x + x;
y := y - 93032639;
z := z - 48782
end;
y := y + (z div 65536);
k := 2;
while x > 1073741828 do begin {133:}
z := ((x - 1) div twotothe[k]) + 1;
while x < (1073741824 + z) do begin
z := (z + 1) div 2;
k := k + 1
end;
y := y + speclog[k];
x := x - z
end {:133};
mlog := y div 8
end
end; {:132} {135:}
function mexp(x: scaled): scaled;
var
k: smallnumber;
y, z: integer;
begin
if x > 174436200 then begin
aritherror := true;
mexp := 2147483647
end else if x < (-197694359) then
mexp := 0
else begin
if x <= 0 then begin
z := -(8 * x);
y := 1048576
end else begin
if x <= 127919879 then
z := 1023359037 - (8 * x)
else
z := 8 * (174436200 - x);
y := 2147483647
end; {136:}
k := 1;
while z > 0 do begin
while z >= speclog[k] do begin
z := z - speclog[k];
y := (y - 1) - ((y - twotothe[k - 1]) div twotothe[k])
end;
k := k + 1
end {:136};
if x <= 127919879 then
mexp := (y + 8) div 16
else
mexp := y
end
end; {:135} {139:}
function narg(x, y: integer): angle;
var
z: angle;
t: integer;
k: smallnumber;
octant: 1..8;
begin
if x >= 0 then
octant := 1
else begin
x := -x;
octant := 2
end;
if y < 0 then begin
y := -y;
octant := octant + 2
end;
if x < y then begin
t := y;
y := x;
x := t;
octant := octant + 4
end;
if x = 0 then begin {140:}
begin
if interaction = 3 then
;
printnl(133);
print(184)
end;
begin
helpptr := 2;
helpline[1] := 185;
helpline[0] := 179
end;
error;
narg := 0
end else begin {:140} {142:}
while x >= 536870912 do begin
x := x div 2;
y := y div 2
end;
z := 0;
if y > 0 then begin
while x < 268435456 do begin
x := x + x;
y := y + y
end; {143:}
k := 0;
repeat
y := y + y;
k := k + 1;
if y > x then begin
z := z + specatan[k];
t := x;
x := x + (y div twotothe[k + k]);
y := y - t
end
until k = 15;
repeat
y := y + y;
k := k + 1;
if y > x then begin
z := z + specatan[k];
y := y - x
end
until k = 26 {:143}
end {:142}; {141:}
case octant of
1:
narg := z;
5:
narg := 94371840 - z;
6:
narg := 94371840 + z;
2:
narg := 188743680 - z;
4:
narg := z - 188743680;
8:
narg := (-z) - 94371840;
7:
narg := z - 94371840;
3:
narg := -z
end {:141}
end
end; {:139} {145:}
procedure nsincos(z: angle);
var
k: smallnumber;
q: 0..7;
r: fraction;
x, y, t: integer;
begin
while z < 0 do
z := z + 377487360;
z := z mod 377487360;
q := z div 47185920;
z := z mod 47185920;
x := 268435456;
y := x;
if not odd(q) then
z := 47185920 - z; {147:}
k := 1;
while z > 0 do begin
if z >= specatan[k] then begin
z := z - specatan[k];
t := x;
x := t + (y div twotothe[k]);
y := y - (t div twotothe[k])
end;
k := k + 1
end;
if y < 0 then
y := 0 {:147}; {146:}
case q of
0:
;
1:
begin
t := x;
x := y;
y := t
end;
2:
begin
t := x;
x := -y;
y := t
end;
3:
x := -x;
4:
begin
x := -x;
y := -y
end;
5:
begin
t := x;
x := -y;
y := -t
end;
6:
begin
t := x;
x := y;
y := -t
end;
7:
y := -y
end {:146};
r := pythadd(x, y);
ncos := makefraction(x, r);
nsin := makefraction(y, r)
end; {:145} {149:}
procedure newrandoms;
var
k: 0..54;
x: fraction;
begin
for k := 0 to 23 do begin
x := randoms[k] - randoms[k + 31];
if x < 0 then
x := x + 268435456;
randoms[k] := x
end;
for k := 24 to 54 do begin
x := randoms[k] - randoms[k - 24];
if x < 0 then
x := x + 268435456;
randoms[k] := x
end;
jrandom := 54
end; {:149}
{150:}
procedure initrandoms(seed: scaled);
var
j, jj, k: fraction;
i: 0..54;
begin
j := abs(seed);
while j >= 268435456 do
j := j div 2;
k := 1;
for i := 0 to 54 do begin
jj := k;
k := j - k;
j := jj;
if k < 0 then
k := k + 268435456;
randoms[(i * 21) mod 55] := j
end;
newrandoms;
newrandoms;
newrandoms
end; {:150}
{151:}
function unifrand(x: scaled): scaled;
var
y: scaled;
begin
if jrandom = 0 then
newrandoms
else
jrandom := jrandom - 1;
y := takefraction(abs(x), randoms[jrandom]);
if y = abs(x) then
unifrand := 0
else if x > 0 then
unifrand := y
else
unifrand := -y
end; {:151} {152:}
function normrand: scaled;
var
x, u, l: integer;
begin
repeat
repeat
if jrandom = 0 then
newrandoms
else
jrandom := jrandom - 1;
x := takefraction(112429, randoms[jrandom] - 134217728);
if jrandom = 0 then
newrandoms
else
jrandom := jrandom - 1;
u := randoms[jrandom]
until abs(x) < u;
x := makefraction(x, u);
l := 139548960 - mlog(u)
until abvscd(1024, l, x, x) >= 0;
normrand := x
end; {:152}
{157:}
{procedure printword(w:memoryword);begin printint(w.int);
printchar(32);printscaled(w.int);printchar(32);
printscaled(w.int div 4096);println;printint(w.hh.lh);printchar(61);
printint(w.hh.b0);printchar(58);printint(w.hh.b1);printchar(59);
printint(w.hh.rh);printchar(32);printint(w.qqqq.b0);printchar(58);
printint(w.qqqq.b1);printchar(58);printint(w.qqqq.b2);printchar(58);
printint(w.qqqq.b3);end;}
{:157}
{162:}
{217:}
procedure printcapsule;
forward;
procedure showtokenlist(p, q: integer; l, nulltally: integer);
label
10;
var
class, c: smallnumber;
r, v: integer;
begin
class := 3;
tally := nulltally;
while (p <> (-30000)) and (tally < l) do begin
if p = q then begin {646:}
firstcount := tally;
trickcount := ((tally + 1) + errorline) - halferrorline;
if trickcount < errorline then
trickcount := errorline
end {:646}; {218:}
c := 9;
if (p < (-30000)) or (p > memend) then begin
print(360);
goto 10
end;
if p < himemmin then {219:}
if mem[p].hh.b1 = 12 then
if mem[p].hh.b0 = 16 then begin {220:}
if class = 0 then
printchar(32);
v := mem[p + 1].int;
if v < 0 then begin
if class = 17 then
printchar(32);
printchar(91);
printscaled(v);
printchar(93);
c := 18
end else begin
printscaled(v);
c := 0
end
end else if mem[p].hh.b0 <> 4 then {:220}
print(363)
else begin
printchar(34);
slowprint(mem[p + 1].int);
printchar(34);
c := 4
end
else if ((mem[p].hh.b1 <> 11) or (mem[p].hh.b0 < 1)) or (mem[p].hh.b0 > 19) then
print(363)
else begin
gpointer := p;
printcapsule;
c := 8
end {:219}
else begin
r := mem[p].hh.lh;
if r >= 2242 then begin {222:}
if r < 2392 then begin
print(365);
r := r - 2242
end else if r < 2542 then begin
print(366);
r := r - 2392
end else begin
print(367);
r := r - 2542
end;
printint(r);
printchar(41);
c := 8
end else if r < 1 then {:222}
if r = 0 then begin {221:}
if class = 17 then
printchar(32);
print(364);
c := 18
end else {:221}
print(361)
else begin
r := hash[r].rh;
if (r < 0) or (r >= strptr) then
print(362) {223:}
else begin
c := charclass[strpool[strstart[r]]];
if c = class then
if c in
[9, 5, 6, 7, 8] then
case c of
9:
printchar(46);
5, 6, 7, 8:
end
else
printchar(32);
print(r)
end {:223}
end
end {:218};
class := c;
p := mem[p].hh.rh
end;
if p <> (-30000) then
print(359);
10:
end; {:217} {665:}
procedure runaway;
begin
if scannerstatus > 2 then begin
printnl(503);
case scannerstatus of
3:
print(504);
4, 5:
print(505);
6:
print(506)
end;
println;
showtokenlist(mem[29998].hh.rh, -30000, errorline - 10, 0)
end
end; { runaway }
{:665}
{:162}
{163:}
function getavail: halfword;
var
p: halfword;
begin
p := avail;
if p <> (-30000) then
avail := mem[avail].hh.rh
else if memend < memmax then begin
memend := memend + 1;
p := memend
end else begin
himemmin := himemmin - 1;
p := himemmin;
if himemmin <= lomemmax then begin
runaway;
overflow(186, memmax + 30001)
end
end;
mem[p].hh.rh := -30000;
{dynused:=dynused+1;}
getavail := p
end; {:163} {167:}
function getnode(s: integer): halfword;
label
40, 10, 20;
var
p: halfword;
q: halfword;
r: integer;
t, tt: integer;
begin
20:
p := rover; {169:}
repeat
q := p + mem[p].hh.lh;
while mem[q].hh.rh = 32767 do begin
t := mem[q + 1].hh.rh;
tt := mem[q + 1].hh.lh;
if q = rover then
rover := t;
mem[t + 1].hh.lh := tt;
mem[tt + 1].hh.rh := t;
q := q + mem[q].hh.lh
end;
r := q - s;
if r > (p + 1) then begin {170:}
mem[p].hh.lh := r - p;
rover := p;
goto 40
end {:170};
{171
:}
if r = p then
if (mem[p + 1].hh.rh <> rover) or (mem[p + 1].hh.lh <> rover) then begin
rover := mem[p + 1].hh.rh;
t := mem[p + 1].hh.lh;
mem[rover + 1].hh.lh := t;
mem[t + 1].hh.rh := rover;
goto 40
end {:171};
mem[p].hh.lh := q - p {:169};
p := mem[p + 1].hh.rh
until p = rover;
if s = 1073741824 then begin
getnode := 32767;
goto 10
end;
if (lomemmax + 2) < himemmin then
if (lomemmax + 2) <= 2767 then begin {168:}
if (lomemmax + 1000) < himemmin then
t := lomemmax + 1000
else
t := ((lomemmax + himemmin) + 2) div 2;
if t > 2767 then
t := 2767;
p := mem[rover + 1].hh.lh;
q := lomemmax;
mem[p + 1].hh.rh := q;
mem[rover + 1].hh.lh := q;
mem[q + 1].hh.rh := rover;
mem[q + 1].hh.lh := p;
mem[q].hh.rh := 32767;
mem[q].hh.lh := t - lomemmax;
lomemmax := t;
mem[lomemmax].hh.rh := -30000;
mem[lomemmax].hh.lh := -30000;
rover := q;
goto 20
end {:168};
overflow(186, memmax + 30001);
40:
mem[r].hh.rh := -30000; {varused:=varused+s;}
getnode := r;
10:
end; {:167} {172:}
procedure freenode(p: halfword; s: halfword);
var
q: halfword;
begin
mem[p].hh.lh := s;
mem[p].hh.rh := 32767;
q := mem[rover + 1].hh.lh;
mem[p + 1].hh.lh := q;
mem[p + 1].hh.rh := rover;
mem[rover + 1].hh.lh := p;
mem[q + 1].hh.rh := p
end; {varused:=varused-s;} {:172}
{173:}
{procedure sortavail;var p,q,r:halfword;oldrover:halfword;
begin p:=getnode(1073741824);p:=mem[rover+1].hh.rh;
mem[rover+1].hh.rh:=32767;oldrover:=rover;
while p<>oldrover do[174:]if p<rover then begin q:=p;p:=mem[q+1].hh.rh;
mem[q+1].hh.rh:=rover;rover:=q;end else begin q:=rover;
while mem[q+1].hh.rh<p do q:=mem[q+1].hh.rh;r:=mem[p+1].hh.rh;
mem[p+1].hh.rh:=mem[q+1].hh.rh;mem[q+1].hh.rh:=p;p:=r;end[:174];
p:=rover;
while mem[p+1].hh.rh<>32767 do begin mem[mem[p+1].hh.rh+1].hh.lh:=p;
p:=mem[p+1].hh.rh;end;mem[p+1].hh.rh:=rover;mem[rover+1].hh.lh:=p;end;}
{:173}
{177:}
procedure flushlist(p: halfword);
label
30;
var
q, r: halfword;
begin
if p >= himemmin then
if p <> 30000 then begin
r := p;
repeat
q := r;
r := mem[r].hh.rh; {dynused:=dynused-1;}
if r < himemmin then
goto 30
until r = 30000;
30:
mem[q].hh.rh := avail;
avail := p
end
end; { flushlist }
procedure flushnodelist(p: halfword);
var
q: halfword;
begin
while p <> (-30000) do begin
q := p;
p := mem[p].hh.rh;
if q < himemmin then
freenode(q, 2)
else begin
mem[q].hh.rh := avail;
avail := q
end
{dynused:=dynused-1;}
end
end; {:177} {180:}
{procedure checkmem(printlocs:boolean);label 31,32;var p,q,r:halfword;
clobbered:boolean;begin for p:=-30000 to lomemmax do freearr[p]:=false;
for p:=himemmin to memend do freearr[p]:=false;[181:]p:=avail;q:=-30000;
clobbered:=false;
while p<>-30000 do begin if(p>memend)or(p<himemmin)then clobbered:=true
else if freearr[p]then clobbered:=true;
if clobbered then begin printnl(187);printint(q);goto 31;end;
freearr[p]:=true;q:=p;p:=mem[q].hh.rh;end;31:[:181];[182:]p:=rover;
q:=-30000;clobbered:=false;
repeat if(p>=lomemmax)or(p<-30000)then clobbered:=true else if(mem[p+1].
hh.rh>=lomemmax)or(mem[p+1].hh.rh<-30000)then clobbered:=true else if
not((mem[p].hh.rh=32767))or(mem[p].hh.lh<2)or(p+mem[p].hh.lh>lomemmax)or
(mem[mem[p+1].hh.rh+1].hh.lh<>p)then clobbered:=true;
if clobbered then begin printnl(188);printint(q);goto 32;end;
for q:=p to p+mem[p].hh.lh-1 do begin if freearr[q]then begin printnl(
189);printint(q);goto 32;end;freearr[q]:=true;end;q:=p;
p:=mem[p+1].hh.rh;until p=rover;32:[:182];[183:]p:=-30000;
while p<=lomemmax do begin if(mem[p].hh.rh=32767)then begin printnl(190)
;printint(p);end;while(p<=lomemmax)and not freearr[p]do p:=p+1;
while(p<=lomemmax)and freearr[p]do p:=p+1;end[:183];[617:]q:=-29987;
p:=mem[q].hh.rh;
while p<>-29987 do begin if mem[p+1].hh.lh<>q then begin printnl(463);
printint(p);end;p:=mem[p+1].hh.rh;r:=himemmin;
repeat if mem[p].hh.lh>=r then begin printnl(464);printint(p);end;
r:=mem[p].hh.lh;q:=p;p:=mem[q].hh.rh;until r=-30000;end[:617];
if printlocs then[184:]begin printnl(191);
for p:=-30000 to lomemmax do if not freearr[p]and((p>waslomax)or wasfree
[p])then begin printchar(32);printint(p);end;
for p:=himemmin to memend do if not freearr[p]and((p<washimin)or(p>
wasmemend)or wasfree[p])then begin printchar(32);printint(p);end;
end[:184];for p:=-30000 to lomemmax do wasfree[p]:=freearr[p];
for p:=himemmin to memend do wasfree[p]:=freearr[p];wasmemend:=memend;
waslomax:=lomemmax;washimin:=himemmin;end;}
{:180}
{185:}
{procedure searchmem(p:halfword);var q:integer;
begin for q:=-30000 to lomemmax do begin if mem[q].hh.rh=p then begin
printnl(192);printint(q);printchar(41);end;
if mem[q].hh.lh=p then begin printnl(193);printint(q);printchar(41);end;
end;
for q:=himemmin to memend do begin if mem[q].hh.rh=p then begin printnl(
192);printint(q);printchar(41);end;
if mem[q].hh.lh=p then begin printnl(193);printint(q);printchar(41);end;
end;
[209:]for q:=1 to 2241 do begin if eqtb[q].rh=p then begin printnl(328);
printint(q);printchar(41);end;end[:209];end;}
{:185}
{189:}
procedure printop(c: quarterword);
begin
if c <= 15 then
printtype(c)
else
if c in
[30, 31, 32, 33, 34, 35, 36, 37,
38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61,
62, 63, 64, 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, 91, 92, 94,
95, 96, 97, 98, 99, 100] then
case c of
30:
print(218);
31:
print(219);
32:
print(220);
33:
print(221);
34:
print(222);
35:
print(223);
36:
print(224);
37:
print(225);
38:
print(226);
39:
print(227);
40:
print(228);
41:
print(229);
42:
print(230);
43:
print(231);
44:
print(232);
45:
print(233);
46:
print(234);
47:
print(235);
48:
print(236);
49:
print(237);
50:
print(238);
51:
print(239);
52:
print(240);
53:
print(241);
54:
print(242);
55:
print(243);
56:
print(244);
57:
print(245);
58:
print(246);
59:
print(247);
60:
print(248);
61:
print(249);
62:
print(250);
63:
print(251);
64:
print(252);
65:
print(253);
66:
print(254);
67:
print(255);
68:
print(256);
69:
printchar(43);
70:
printchar(45);
71:
printchar(42);
72:
printchar(47);
73:
print(257);
74:
print(181);
75:
print(258);
76:
print(259);
77:
printchar(60);
78:
print(260);
79:
printchar(62);
80:
print(261);
81:
printchar(61);
82:
print(262);
83:
print(38);
84:
print(263);
85:
print(264);
86:
print(265);
87:
print(266);
88:
print(267);
89:
print(268);
90:
print(269);
91:
print(270);
92:
print(271);
94:
print(272);
95:
print(273);
96:
print(274);
97:
print(275);
98:
print(276);
99:
print(277);
100:
print(278)
end
else
print(279)
end; { printop }
{:189}
{194:}
procedure fixdateandtime;
begin
dateandtime(internal[17], internal[16], internal[15], internal[14]);
internal[17] := internal[17] * 65536;
internal[16] := internal[16] * 65536;
internal[15] := internal[15] * 65536;
internal[14] := internal[14] * 65536;
{----------------------------------}
lastyearval := internal[14];
lastmonthval:= internal[15];
{----------------------------------}
end; { fixdateandtime }
{:194}
{205:}
function idlookup(j, l: integer): halfword;
label
40;
var
h: integer;
p: halfword;
k: halfword;
begin
if l = 1 then begin {206:}
p := buffer[j] + 1;
hash[p].rh := p - 1;
goto 40
end {:206}; {208:}
h := buffer[j];
for k := j + 1 to (j + l) - 1 do begin
h := (h + h) + buffer[k];
while h >= 1777 do
h := h - 1777
end {:208};
p := h + 129;
while true do begin
if hash[p].rh > 0 then
if (strstart[hash[p].rh + 1] - strstart[hash[p].rh]) = l then
if streqbuf(hash[p].rh, j) then
goto 40;
if hash[p].lh = 0 then begin {207:}
if hash[p].rh > 0 then begin
repeat
if hashused = 1 then
overflow(327, 2100);
hashused := hashused - 1
until hash[hashused].rh = 0;
hash[p].lh := hashused;
p := hashused
end;
begin
if (poolptr + l) > maxpoolptr then begin
if (poolptr + l) > poolsize then
overflow(129, poolsize - initpoolptr);
maxpoolptr := poolptr + l
end
end;
for k := j to (j + l) - 1 do begin
strpool[poolptr] := buffer[k];
poolptr := poolptr + 1
end;
hash[p].rh := makestring;
strref[hash[p].rh] := 127;
{stcount:=stcount+1;}
goto 40
end {:207};
p := hash[p].lh
end;
40:
idlookup := p
end; {:205} {210:}
{procedure primitive(s:strnumber;c:halfword;o:halfword);
var k:poolpointer;j:smallnumber;l:smallnumber;begin k:=strstart[s];
l:=strstart[s+1]-k;for j:=0 to l-1 do buffer[j]:=strpool[k+j];
cursym:=idlookup(0,l);if s>=128 then begin flushstring(strptr-1);
hash[cursym].rh:=s;end;eqtb[cursym].lh:=c;eqtb[cursym].rh:=o;end;}
{:210}
{215:}
function newnumtok(v: scaled): halfword;
var
p: halfword;
begin
p := getnode(2);
mem[p + 1].int := v;
mem[p].hh.b0 := 16;
mem[p].hh.b1 := 12;
newnumtok := p
end; {:215} {216:}
procedure tokenrecycle;
forward;
procedure flushtokenlist(p: halfword);
var
q: halfword;
begin
while p <> (-30000) do begin
q := p;
p := mem[p].hh.rh;
if q >= himemmin then begin
mem[q].hh.rh := avail;
avail := q
end else begin
{dynused:=dynused-1;}
if mem[q].hh.b0 in
[1, 2, 16, 4, 3, 5, 7, 12,
10, 6, 9, 8, 11, 14, 13, 17,
18, 19] then
case mem[q].hh.b0 of
1, 2, 16:
;
4:
begin
if strref[mem[q + 1].int] < 127 then
if strref[mem[q + 1].int] > 1 then
strref[mem[q + 1].int] := strref[mem[q + 1].int] - 1
else
flushstring(mem[q + 1].int)
end;
3, 5, 7, 12, 10, 6, 9,
8, 11, 14, 13, 17, 18, 19:
begin
gpointer := q;
tokenrecycle
end
end
else
confusion(358);
freenode(q, 2)
end
end
end; { flushtokenlist }
{:216}
{226:}
procedure deletemacref(p: halfword);
begin
if mem[p].hh.lh = (-30000) then
flushtokenlist(p)
else
mem[p].hh.lh := mem[p].hh.lh - 1
end; {:226} {227:} {625:}
procedure printcmdmod(c, m: integer);
begin
if c in
[18, 77, 59, 72, 32, 78, 79, 57,
19, 60, 27, 11, 81, 26, 6, 9,
70, 73, 13, 46, 63, 14, 15, 69,
28, 47, 24, 7, 65, 64, 12, 8,
80, 17, 74, 35, 58, 71, 75, 16,
4, 61, 56, 3, 1, 2, 33, 34,
37, 55, 45, 50, 36, 43, 54, 48,
51, 52, 30, 82, 23, 21, 22, 31,
62, 41, 10, 53, 44, 49, 5, 40,
68, 66, 67, 25, 20, 76, 29] then
case c of {212:}
18:
print(330);
77:
print(329);
59:
print(332);
72:
print(331);
32:
print(333);
78:
print(58);
79:
print(44);
57:
print(334);
19:
print(335);
60:
print(336);
27:
print(337);
11:
print(338);
81:
print(323);
26:
print(339);
6:
print(340);
9:
print(341);
70:
print(342);
73:
print(343);
13:
print(344);
46:
print(123);
63:
print(91);
14:
print(345);
15:
print(346);
69:
print(347);
28:
print(348);
47:
print(279);
24:
print(349);
7:
printchar(92);
65:
print(125);
64:
print(93);
12:
print(350);
8:
print(351);
80:
print(59);
17:
print(352);
74:
print(353);
35:
print(354);
58:
print(355);
71:
print(356);
75:
print(357); {:212} {684:}
16:
if m <= 2 then
if m = 1 then
print(520)
else if m < 1 then
print(324)
else
print(521)
else if m = 53 then
print(522)
else if m = 44 then
print(523)
else
print(524);
4:
if m <= 1 then
if m = 1 then
print(527)
else
print(325)
else if m = 2242 then
print(525)
else
print(526); {:684} {689:}
61:
if m in
[1, 2, 3] then
case m of
1:
print(529);
2:
printchar(64);
3:
print(530)
end
else
print(528); {:689} {696:}
56:
if m >= 2242 then
if m = 2242 then
print(541)
else if m = 2392 then
print(542)
else
print(543)
else if m < 2 then
print(544)
else if m = 2 then
print(545)
else
print(546); {:696} {710:}
3:
if m = 0 then
print(556)
else
print(482);
{:710}
{741:}
1, 2:
if m in
[1, 2, 3] then
case m of
1:
print(583);
2:
print(322);
3:
print(584)
end
else
print(585); {:741} {894:}
33, 34, 37, 55, 45, 50, 36,
43, 54, 48, 51, 52:
printop(m); {:894} {1014:}
30:
printtype(m); {:1014} {1019:}
82:
if m = 0 then
print(776)
else
print(777);
{:1019}
{1025:}
23:
if m in
[0, 1, 2] then
case m of
0:
print(143);
1:
print(144);
2:
print(145)
end
else
print(783); {:1025} {1028:}
21:
if m = 0 then
print(784)
else
print(785); {:1028} {1038:}
22:
if m in
[0, 1, 2, 3] then
case m of
0:
print(799);
1:
print(800);
2:
print(801);
3:
print(802)
end
else
print(803); {:1038} {1043:}
31, 62:
begin
if c = 31 then
print(806)
else
print(807);
print(808);
print(hash[m].rh)
end;
41:
if m = (-30000) then
print(809)
else
print(810);
10:
print(811);
53, 44, 49:
begin
printcmdmod(16, c);
print(812);
println;
showtokenlist(mem[mem[m].hh.rh].hh.rh, -30000, 1000, 0)
end;
5:
print(813);
40:
print(intname[m]); {:1043} {1053:}
68:
if m = 1 then
print(820)
else if m = 0 then
print(821)
else
print(822);
66:
if m = 6 then
print(823)
else
print(824);
67:
if m = 0 then
print(825)
else
print(826); {:1053} {1080:}
25:
if m < 1 then
print(856)
else if m = 1 then
print(857)
else
print(858);
{:1080}
{1102:}
20:
if m in
[0, 1, 2, 3] then
case m of
0:
print(868);
1:
print(869);
2:
print(870);
3:
print(871)
end
else
print(872); {:1102} {1110:}
76:
if m = 0 then
print(889)
else
print(890); {:1110} {1180:}
29:
if m = 16 then
print(913)
else
print(912)
end
else {:1180}
print(468)
end; {:625}
procedure showmacro(p: halfword; q, l: integer);
label
10;
var
r: halfword;
begin
p := mem[p].hh.rh;
while mem[p].hh.lh > 7 do begin
r := mem[p].hh.rh;
mem[p].hh.rh := -30000;
showtokenlist(p, -30000, l, 0);
mem[p].hh.rh := r;
p := r;
if l > 0 then
l := l - tally
else
goto 10
end;
tally := 0;
case mem[p].hh.lh of
0:
print(368);
1, 2, 3:
begin
printchar(60);
printcmdmod(56, mem[p].hh.lh);
print(369)
end;
4:
print(370);
5:
print(371);
6:
print(372);
7:
print(373)
end;
showtokenlist(mem[p].hh.rh, q, l - tally, 0);
10:
end; {:227} {232:}
procedure initbignode(p: halfword);
var
q: halfword;
s: smallnumber;
begin
s := bignodesize[mem[p].hh.b0];
q := getnode(s);
repeat
s := s - 2; {586:}
begin
mem[q + s].hh.b0 := 19;
serialno := serialno + 64;
mem[(q + s) + 1].int := serialno
end {:586};
mem[q + s].hh.b1 := (s div 2) + 5;
mem[q + s].hh.rh := -30000
until s = 0;
mem[q].hh.rh := p;
mem[p + 1].int := q
end; { initbignode }
{:232}
{233:}
function idtransform: halfword;
var
p, q, r: halfword;
begin
p := getnode(2);
mem[p].hh.b0 := 13;
mem[p].hh.b1 := 11;
mem[p + 1].int := -30000;
initbignode(p);
q := mem[p + 1].int;
r := q + 12;
repeat
r := r - 2;
mem[r].hh.b0 := 16;
mem[r + 1].int := 0
until r = q;
mem[q + 5].int := 65536;
mem[q + 11].int := 65536;
idtransform := p
end; {:233} {234:}
procedure newroot(x: halfword);
var
p: halfword;
begin
p := getnode(2);
mem[p].hh.b0 := 0;
mem[p].hh.b1 := 0;
mem[p].hh.rh := x;
eqtb[x].rh := p
end; {:234}
{235:}
procedure printvariablename(p: halfword);
label
40, 10;
var
q: halfword;
r: halfword;
begin
while mem[p].hh.b1 >= 5 do begin {237:}
case mem[p].hh.b1 of
5:
printchar(120);
6:
printchar(121);
7:
print(376);
8:
print(377);
9:
print(378);
10:
print(379);
11:
begin
print(380);
printint(p + 30000);
goto 10
end
end;
print(381);
p := mem[p - (2 * (mem[p].hh.b1 - 5))].hh.rh
end {:237};
q := -30000;
while mem[p].hh.b1 > 1 do begin {236:}
if mem[p].hh.b1 = 3 then begin
r := newnumtok(mem[p + 2].int);
repeat
p := mem[p].hh.rh
until mem[p].hh.b1 = 4
end else if mem[p].hh.b1 = 2 then begin
p := mem[p].hh.rh;
goto 40
end else begin
if mem[p].hh.b1 <> 4 then
confusion(375);
r := getavail;
mem[r].hh.lh := mem[p + 2].hh.lh
end;
mem[r].hh.rh := q;
q := r;
40:
p := mem[p + 2].hh.rh
end {:236};
r := getavail;
mem[r].hh.lh := mem[p].hh.rh;
mem[r].hh.rh := q;
if mem[p].hh.b1 = 1 then
print(374);
showtokenlist(r, -30000, 2147483647, tally);
flushtokenlist(r);
10:
end; {:235}
{238:}
function interesting(p: halfword): boolean;
var
t: smallnumber;
begin
if internal[3] > 0 then
interesting := true
else begin
t := mem[p].hh.b1;
if t >= 5 then
if t <> 11 then
t := mem[mem[p - (2 * (t - 5))].hh.rh].hh.b1;
interesting := t <> 11
end
end; {:238} {239:}
function newstructure(p: halfword): halfword;
var
q, r: halfword;
begin
if mem[p].hh.b1 in
[0, 3, 4] then
case mem[p].hh.b1 of
0:
begin
q := mem[p].hh.rh;
r := getnode(2);
eqtb[q].rh := r
end;
3:
begin {240:}
q := p;
repeat
q := mem[q].hh.rh
until mem[q].hh.b1 = 4;
q := mem[q + 2].hh.rh;
r := q + 1;
repeat
q := r;
r := mem[r].hh.rh
until r = p;
r := getnode(3);
mem[q].hh.rh := r;
mem[r + 2].int := mem[p + 2].int
end; {:240}
4:
begin {241:}
q := mem[p + 2].hh.rh;
r := mem[q + 1].hh.lh;
repeat
q := r;
r := mem[r].hh.rh
until r = p;
r := getnode(3);
mem[q].hh.rh := r;
mem[r + 2] := mem[p + 2];
if mem[p + 2].hh.lh = 0 then begin
q := mem[p + 2].hh.rh + 1;
while mem[q].hh.rh <> p do
q := mem[q].hh.rh;
mem[q].hh.rh := r
end
end
end
else {:241}
confusion(382);
mem[r].hh.rh := mem[p].hh.rh;
mem[r].hh.b0 := 21;
mem[r].hh.b1 := mem[p].hh.b1;
mem[r + 1].hh.lh := p;
mem[p].hh.b1 := 2;
q := getnode(3);
mem[p].hh.rh := q;
mem[r + 1].hh.rh := q;
mem[q + 2].hh.rh := r;
mem[q].hh.b0 := 0;
mem[q].hh.b1 := 4;
mem[q].hh.rh := -29983;
mem[q + 2].hh.lh := 0;
newstructure := r
end; {:239} {242:}
function findvariable(t: halfword): halfword;
label
10;
var
p, q, r, s: halfword;
pp, qq, rr, ss: halfword;
n: integer;
saveword: memoryword;
begin
p := mem[t].hh.lh;
t := mem[t].hh.rh;
if (eqtb[p].lh mod 83) <> 41 then begin
findvariable := -30000;
goto 10
end;
if eqtb[p].rh = (-30000) then
newroot(p);
p := eqtb[p].rh;
pp := p;
while t <> (-30000) do begin {243:}
if mem[pp].hh.b0 <> 21 then begin
if mem[pp].hh.b0 > 21 then begin
findvariable := -30000;
goto 10
end;
ss := newstructure(pp);
if p = pp then
p := ss;
pp := ss
end;
if mem[p].hh.b0 <> 21 then
p := newstructure(p) {:243};
if t < himemmin then begin {244:}
n := mem[t + 1].int;
pp := mem[mem[pp + 1].hh.lh].hh.rh;
q := mem[mem[p + 1].hh.lh].hh.rh;
saveword := mem[q + 2];
mem[q + 2].int := 2147483647;
s := p + 1;
repeat
r := s;
s := mem[s].hh.rh
until n <= mem[s + 2].int;
if n = mem[s + 2].int then
p := s
else begin
p := getnode(3);
mem[r].hh.rh := p;
mem[p].hh.rh := s;
mem[p + 2].int := n;
mem[p].hh.b1 := 3;
mem[p].hh.b0 := 0
end;
mem[q + 2] := saveword
end else begin {:244} {245:}
n := mem[t].hh.lh;
ss := mem[pp + 1].hh.lh;
repeat
rr := ss;
ss := mem[ss].hh.rh
until n <= mem[ss + 2].hh.lh;
if n < mem[ss + 2].hh.lh then begin
qq := getnode(3);
mem[rr].hh.rh := qq;
mem[qq].hh.rh := ss;
mem[qq + 2].hh.lh := n;
mem[qq].hh.b1 := 4;
mem[qq].hh.b0 := 0;
mem[qq + 2].hh.rh := pp;
ss := qq
end;
if p = pp then begin
p := ss;
pp := ss
end else begin
pp := ss;
s := mem[p + 1].hh.lh;
repeat
r := s;
s := mem[s].hh.rh
until n <= mem[s + 2].hh.lh;
if n = mem[s + 2].hh.lh then
p := s
else begin
q := getnode(3);
mem[r].hh.rh := q;
mem[q].hh.rh := s;
mem[q + 2].hh.lh := n;
mem[q].hh.b1 := 4;
mem[q].hh.b0 := 0;
mem[q + 2].hh.rh := p;
p := q
end
end
end {:245};
t := mem[t].hh.rh
end;
if mem[pp].hh.b0 >= 21 then
if mem[pp].hh.b0 = 21 then
pp := mem[pp + 1].hh.lh
else begin
findvariable := -30000;
goto 10
end;
if mem[p].hh.b0 = 21 then
p := mem[p + 1].hh.lh;
if mem[p].hh.b0 = 0 then begin
if mem[pp].hh.b0 = 0 then begin
mem[pp].hh.b0 := 15;
mem[pp + 1].int := -30000
end;
mem[p].hh.b0 := mem[pp].hh.b0;
mem[p + 1].int := -30000
end;
findvariable := p;
10:
end; {:242} {246:} {257:}
procedure printpath(h: halfword; s: strnumber; nuline: boolean);
label
30, 31;
var
p, q: halfword;
begin
printdiagnostic(384, s, nuline);
println;
p := h;
repeat
q := mem[p].hh.rh;
if (p = (-30000)) or (q = (-30000)) then begin
printnl(131);
goto 30
end; {258:}
printtwo(mem[p + 1].int, mem[p + 2].int);
if mem[p].hh.b1 in
[0, 1, 4, 3, 2] then
case mem[p].hh.b1 of
0:
begin
if mem[p].hh.b0 = 4 then
print(385);
if (mem[q].hh.b0 <> 0) or (q <> h) then
q := -30000;
goto 31
end;
1:
begin {261:}
print(391);
printtwo(mem[p + 5].int, mem[p + 6].int);
print(390);
if mem[q].hh.b0 <> 1 then
print(392)
else
printtwo(mem[q + 3].int, mem[q + 4].int);
goto 31
end; {:261}
4: {262:}
if (mem[p].hh.b0 <> 1) and (mem[p].hh.b0 <> 4) then
print(385) {:262};
3, 2:
begin {263:}
if mem[p].hh.b0 = 4 then
print(392);
if mem[p].hh.b1 = 3 then begin
print(388);
printscaled(mem[p + 5].int)
end else begin
nsincos(mem[p + 5].int);
printchar(123);
printscaled(ncos);
printchar(44);
printscaled(nsin)
end;
printchar(125)
end
end
else {:263}
print(131);
if mem[q].hh.b0 <= 1 then
print(386)
else if (mem[p + 6].int <> 65536) or (mem[q + 4].int <> 65536) then begin {260:}
print(389);
if mem[p + 6].int < 0 then
print(332);
printscaled(abs(mem[p + 6].int));
if mem[p + 6].int <> mem[q + 4].int then begin
print(390);
if mem[q + 4].int < 0 then
print(332);
printscaled(abs(mem[q + 4].int))
end
end {:260};
31: {:258}
;
p := q;
if (p <> h) or (mem[h].hh.b0 <> 0) then begin {259:}
printnl(387);
if mem[p].hh.b0 = 2 then begin
nsincos(mem[p + 3].int);
printchar(123);
printscaled(ncos);
printchar(44);
printscaled(nsin);
printchar(125)
end else if mem[p].hh.b0 = 3 then begin
print(388);
printscaled(mem[p + 3].int);
printchar(125)
end
end {:259}
until p = h;
if mem[h].hh.b0 <> 0 then
print(256);
30:
enddiagnostic(true)
end; {:257}
{332:}
{333:}
procedure printweight(q: halfword; xoff: integer);
var
w, m: integer;
d: integer;
begin
d := mem[q].hh.lh + 32768;
w := d mod 8;
m := (d div 8) - mem[curedges + 3].hh.lh;
if fileoffset > (maxprintline - 9) then
printnl(32)
else
printchar(32);
printint(m + xoff);
while w > 4 do begin
printchar(43);
w := w - 1
end;
while w < 4 do begin
printchar(45);
w := w + 1
end
end; {:333}
procedure printedges(s: strnumber; nuline: boolean; xoff, yoff: integer);
var
p, q, r: halfword;
n: integer;
begin
printdiagnostic(399, s, nuline);
p := mem[curedges].hh.lh;
n := mem[curedges + 1].hh.rh - 4096;
while p <> curedges do begin
q := mem[p + 1].hh.lh;
r := mem[p + 1].hh.rh;
if (q > (-29999)) or (r <> 30000) then begin
printnl(400);
printint(n + yoff);
printchar(58);
while q > (-29999) do begin
printweight(q, xoff);
q := mem[q].hh.rh
end;
print(401);
while r <> 30000 do begin
printweight(r, xoff);
r := mem[r].hh.rh
end
end;
p := mem[p].hh.lh;
n := n - 1
end;
enddiagnostic(true)
end; {:332} {388:}
{---------------------------------------------------
procedure unskew(x, y: scaled; octant: smallnumber);
moved to mf2ps1.p
---------------------------------------------------}
procedure printpen(p: halfword; s: strnumber; nuline: boolean);
var
nothingprinted: boolean;
k: 1..8;
h: halfword;
m, n: integer;
w, ww: halfword;
begin
printdiagnostic(436, s, nuline);
nothingprinted := true;
println;
for k := 1 to 8 do begin
octant := octantcode[k];
h := p + octant;
n := mem[h].hh.lh;
w := mem[h].hh.rh;
if not odd(k) then
w := mem[w].hh.lh;
for m := 1 to n + 1 do begin
if odd(k) then
ww := mem[w].hh.rh
else
ww := mem[w].hh.lh;
if (mem[ww + 1].int <> mem[w + 1].int) or (mem[ww + 2].int <> mem[w + 2].int) then begin {474:}
if nothingprinted then
nothingprinted := false
else
printnl(438);
unskew(mem[ww + 1].int, mem[ww + 2].int, octant);
printtwo(curx, cury)
end {:474};
w := ww
end
end;
if nothingprinted then begin
w := mem[p + 1].hh.rh;
printtwo(mem[w + 1].int + mem[w + 2].int, mem[w + 2].int)
end;
printnl(437);
enddiagnostic(true)
end; {:473} {589:}
procedure printdependency(p: halfword; t: smallnumber);
label
10;
var
v: integer;
pp, q: halfword;
begin
pp := p;
while true do begin
v := abs(mem[p + 1].int);
q := mem[p].hh.lh;
if q = (-30000) then begin
if (v <> 0) or (p = pp) then begin
if mem[p + 1].int > 0 then
if p <> pp then
printchar(43);
printscaled(mem[p + 1].int)
end;
goto 10
end;
{590:}
if mem[p + 1].int < 0 then
printchar(45)
else if p <> pp then
printchar(43);
if t = 17 then
v := roundfraction(v);
if v <> 65536 then
printscaled(v) {:590};
if mem[q].hh.b0 <> 19 then
confusion(454);
printvariablename(q);
v := mem[q + 1].int mod 64;
while v > 0 do begin
print(455);
v := v - 2
end;
p := mem[p].hh.rh
end;
10:
end; {:589} {801:} {805:}
procedure printdp(t: smallnumber; p: halfword; verbosity: smallnumber);
var
q: halfword;
begin
q := mem[p].hh.rh;
if (mem[q].hh.lh = (-30000)) or (verbosity > 0) then
printdependency(p, t)
else
print(628)
end; {:805} {799:}
function stashcurexp: halfword;
var
p: halfword;
begin
if curtype in
[3, 5, 7, 12, 10, 13, 14, 17,
18, 19] then
case curtype of
3, 5, 7, 12, 10, 13, 14,
17, 18, 19:
p := curexp
end
else
begin
p := getnode(2);
mem[p].hh.b1 := 11;
mem[p].hh.b0 := curtype;
mem[p + 1].int := curexp
end;
curtype := 1;
mem[p].hh.rh := -29999;
stashcurexp := p
end; {:799} {800:}
procedure unstashcurexp(p: halfword);
begin
curtype := mem[p].hh.b0;
if curtype in
[3, 5, 7, 12, 10, 13, 14, 17,
18, 19] then
case curtype of
3, 5, 7, 12, 10, 13, 14,
17, 18, 19:
curexp := p
end
else
begin
curexp := mem[p + 1].int;
freenode(p, 2)
end
end; {:800}
procedure printexp(p: halfword; verbosity: smallnumber);
var
restorecurexp: boolean;
t: smallnumber;
v: integer;
q: halfword;
begin
if p <> (-30000) then
restorecurexp := false
else begin
p := stashcurexp;
restorecurexp := true
end;
t := mem[p].hh.b0;
if t < 17 then
v := mem[p + 1].int
else if t < 19 then
v := mem[p + 1].hh.rh; {802:}
if t in
[1, 2, 3, 5, 7, 12, 10, 15,
4, 6, 8, 9, 11, 13, 14, 16,
17, 18, 19] then
case t of
1:
print(194);
2:
if v = 30 then
print(218)
else
print(219);
3, 5, 7, 12, 10, 15:
begin {806:}
printtype(t);
if v <> (-30000) then begin
printchar(32);
while (mem[v].hh.b1 = 11) and (v <> p) do
v := mem[v + 1].int;
printvariablename(v)
end
end; {:806}
4:
begin
printchar(34);
slowprint(v);
printchar(34)
end;
6, 8, 9, 11: {804:}
if verbosity <= 1 then
printtype(t)
else begin
if selector = 3 then
if internal[13] <= 0 then begin
selector := 1;
printtype(t);
print(626);
selector := 3
end;
case t of
6:
printpen(v, 155, false);
8:
printpath(v, 627, false);
9:
printpath(v, 155, false);
11:
begin
curedges := v;
printedges(155, false, 0, 0)
end
end
end {:804};
13, 14:
if v = (-30000) then
printtype(t) {803:}
else begin
printchar(40);
q := v + bignodesize[t];
repeat
if mem[v].hh.b0 = 16 then
printscaled(mem[v + 1].int)
else if mem[v].hh.b0 = 19 then
printvariablename(v)
else
printdp(mem[v].hh.b0, mem[v + 1].hh.rh, verbosity);
v := v + 2;
if v <> q then
printchar(44)
until v = q;
printchar(41)
end {:803};
16:
printscaled(v);
17, 18:
printdp(t, v, verbosity);
19:
printvariablename(p)
end
else
confusion(625) {:802};
if restorecurexp then
unstashcurexp(p)
end; {:801} {807:}
procedure disperr(p: halfword; s: strnumber);
begin
if interaction = 3 then
;
printnl(629);
printexp(p, 1);
if s <> 155 then begin
printnl(133);
print(s)
end
end; {:807} {594:}
function pplusfq(p: halfword; f: integer; q: halfword; t, tt: smallnumber): halfword;
label
30;
var
pp, qq: halfword;
r, s: halfword;
threshold: integer;
v: integer;
begin
if t = 17 then
threshold := 2685
else
threshold := 8;
r := 29999;
pp := mem[p].hh.lh;
qq := mem[q].hh.lh;
while true do
if pp = qq then
if pp = (-30000) then
goto 30 {595:}
else begin
if tt = 17 then
v := mem[p + 1].int + takefraction(f, mem[q + 1].int)
else
v := mem[p + 1].int + takescaled(f, mem[q + 1].int);
mem[p + 1].int := v;
s := p;
p := mem[p].hh.rh;
if abs(v) < threshold then
freenode(s, 2)
else begin
if abs(v) >= 626349397 then
if watchcoefs then begin
mem[qq].hh.b0 := 0;
fixneeded := true
end;
mem[r].hh.rh := s;
r := s
end;
pp := mem[p].hh.lh;
q := mem[q].hh.rh;
qq := mem[q].hh.lh
end {:595}
else if mem[pp + 1].int < mem[qq + 1].int then begin {596:}
if tt = 17 then
v := takefraction(f, mem[q + 1].int)
else
v := takescaled(f, mem[q + 1].int);
if abs(v) > (threshold div 2) then begin
s := getnode(2);
mem[s].hh.lh := qq;
mem[s + 1].int := v;
if abs(v) >= 626349397 then
if watchcoefs then begin
mem[qq].hh.b0 := 0;
fixneeded := true
end;
mem[r].hh.rh := s;
r := s
end;
q := mem[q].hh.rh;
qq := mem[q].hh.lh
end else begin {:596}
mem[r].hh.rh := p;
r := p;
p := mem[p].hh.rh;
pp := mem[p].hh.lh
end;
30:
if t = 17 then
mem[p + 1].int := slowadd(mem[p + 1].int, takefraction(mem[q + 1].int, f))
else
mem[p + 1].int := slowadd(mem[p + 1].int, takescaled(mem[q + 1].int, f));
mem[r].hh.rh := p;
depfinal := p;
pplusfq := mem[29999].hh.rh
end; {:594}
{600:}
function poverv(p: halfword; v: scaled; t0, t1: smallnumber): halfword;
var
r, s: halfword;
w: integer;
threshold: integer;
scalingdown: boolean;
begin
if t0 <> t1 then
scalingdown := true
else
scalingdown := false;
if t1 = 17 then
threshold := 1342
else
threshold := 4;
r := 29999;
while mem[p].hh.lh <> (-30000) do begin
if scalingdown then
if abs(v) < 524288 then
w := makescaled(mem[p + 1].int, v * 4096)
else
w := makescaled(roundfraction(mem[p + 1].int), v)
else
w := makescaled(mem[p + 1].int, v);
if abs(w) <= threshold then begin
s := mem[p].hh.rh;
freenode(p, 2);
p := s
end else begin
if abs(w) >= 626349397 then begin
fixneeded := true;
mem[mem[p].hh.lh].hh.b0 := 0
end;
mem[r].hh.rh := p;
r := p;
mem[p + 1].int := w;
p := mem[p].hh.rh
end
end;
mem[r].hh.rh := p;
mem[p + 1].int := makescaled(mem[p + 1].int, v);
poverv := mem[29999].hh.rh
end; { poverv }
{:600}
{602:}
procedure valtoobig(x: scaled);
begin
if internal[40] > 0 then begin
begin
if interaction = 3 then
;
printnl(133);
print(456)
end;
printscaled(x);
printchar(41);
begin
helpptr := 4;
helpline[3] := 457;
helpline[2] := 458;
helpline[1] := 459;
helpline[0] := 460
end;
error
end
end; {:602} {603:}
procedure makeknown(p, q: halfword);
var
t: 17..18;
begin
mem[mem[q].hh.rh + 1].hh.lh := mem[p + 1].hh.lh;
mem[mem[p + 1].hh.lh].hh.rh := mem[q].hh.rh;
t := mem[p].hh.b0;
mem[p].hh.b0 := 16;
mem[p + 1].int := mem[q + 1].int;
freenode(q, 2);
if abs(mem[p + 1].int) >= 268435456 then
valtoobig(mem[p + 1].int);
if internal[2] > 0 then
if interesting(p) then begin
begindiagnostic;
printnl(461);
printvariablename(p);
printchar(61);
printscaled(mem[p + 1].int);
enddiagnostic(false)
end;
if curexp = p then
if curtype = t then begin
curtype := 16;
curexp := mem[p + 1].int;
freenode(p, 2)
end
end; {:603} {604:}
procedure fixdependencies;
label
30;
var
p, q, r, s, t: halfword;
x: halfword;
begin
r := mem[-29987].hh.rh;
s := -30000;
while r <> (-29987) do begin
t := r;
{605:}
r := t + 1;
while true do begin
q := mem[r].hh.rh;
x := mem[q].hh.lh;
if x = (-30000) then
goto 30;
if mem[x].hh.b0 <= 1 then begin
if mem[x].hh.b0 < 1 then begin
p := getavail;
mem[p].hh.rh := s;
s := p;
mem[s].hh.lh := x;
mem[x].hh.b0 := 1
end;
mem[q + 1].int := mem[q + 1].int div 4;
if mem[q + 1].int = 0 then begin
mem[r].hh.rh := mem[q].hh.rh;
freenode(q, 2);
q := r
end
end;
r := q
end;
30: {:605}
;
r := mem[q].hh.rh;
if q = mem[t + 1].hh.rh then
makeknown(t, q)
end;
while s <> (-30000) do begin
p := mem[s].hh.rh;
x := mem[s].hh.lh;
begin
mem[s].hh.rh := avail;
avail := s
end {dynused:=dynused-1;};
s := p;
mem[x].hh.b0 := 19;
mem[x + 1].int := mem[x + 1].int + 2
end;
fixneeded := false
end; { fixdependencies }
{:604}
{268:}
procedure tossknotlist(p: halfword);
var
q: halfword;
r: halfword;
begin
q := p;
repeat
r := mem[q].hh.rh;
freenode(q, 7);
q := r
until q = p
end; {:268} {385:}
procedure tossedges(h: halfword);
var
p, q: halfword;
begin
q := mem[h].hh.rh;
while q <> h do begin
flushlist(mem[q + 1].hh.rh);
if mem[q + 1].hh.lh > (-29999) then
flushlist(mem[q + 1].hh.lh);
p := q;
q := mem[q].hh.rh;
freenode(p, 2)
end;
freenode(h, 6)
end; {:385} {487:}
procedure tosspen(p: halfword);
var
k: 1..8;
w, ww: halfword;
begin
if p <> (-29997) then begin
for k := 1 to 8 do begin
w := mem[p + k].hh.rh;
repeat
ww := mem[w].hh.rh;
freenode(w, 3);
w := ww
until w = mem[p + k].hh.rh
end;
freenode(p, 10)
end
end; {:487} {620:}
procedure ringdelete(p: halfword);
var
q: halfword;
begin
q := mem[p + 1].int;
if q <> (-30000) then
if q <> p then begin
while mem[q + 1].int <> p do
q := mem[q + 1].int;
mem[q + 1].int := mem[p + 1].int
end
end; {:620} {809:}
procedure recyclevalue(p: halfword);
label
30;
var
t: smallnumber;
v: integer;
vv: integer;
q, r, s, pp: halfword;
begin
t := mem[p].hh.b0;
if t < 17 then
v := mem[p + 1].int;
case t of
0, 1, 2, 16, 15:
;
3, 5, 7, 12, 10:
ringdelete(p);
4:
begin
if strref[v] < 127 then
if strref[v] > 1 then
strref[v] := strref[v] - 1
else
flushstring(v)
end;
6:
if mem[v].hh.lh = (-30000) then
tosspen(v)
else
mem[v].hh.lh := mem[v].hh.lh - 1;
9, 8:
tossknotlist(v);
11:
tossedges(v);
14, 13: {810:}
if v <> (-30000) then begin
q := v + bignodesize[t];
repeat
q := q - 2;
recyclevalue(q)
until q = v;
freenode(v, bignodesize[t])
end {:810};
17, 18:
begin {811:}
q := mem[p + 1].hh.rh;
while mem[q].hh.lh <> (-30000) do
q := mem[q].hh.rh;
mem[mem[p + 1].hh.lh].hh.rh := mem[q].hh.rh;
mem[mem[q].hh.rh + 1].hh.lh := mem[p + 1].hh.lh;
mem[q].hh.rh := -30000;
flushnodelist(mem[p + 1].hh.rh)
end; {:811}
19:
begin {812:}
maxc[17] := 0;
maxc[18] := 0;
maxlink[17] := -30000;
maxlink[18] := -30000;
q := mem[-29987].hh.rh;
while q <> (-29987) do begin
s := q + 1;
while true do begin
r := mem[s].hh.rh;
if mem[r].hh.lh = (-30000) then
goto 30;
if mem[r].hh.lh <> p then
s := r
else begin
t := mem[q].hh.b0;
mem[s].hh.rh := mem[r].hh.rh;
mem[r].hh.lh := q;
if abs(mem[r + 1].int) > maxc[t] then begin {814:}
if maxc[t] > 0 then begin
mem[maxptr[t]].hh.rh := maxlink[t];
maxlink[t] := maxptr[t]
end;
maxc[t] := abs(mem[r + 1].int);
maxptr[t] := r
end else begin {:814}
mem[r].hh.rh := maxlink[t];
maxlink[t] := r
end
end
end;
30:
q := mem[r].hh.rh
end;
if (maxc[17] > 0) or (maxc[18] > 0) then begin {815:}
if (maxc[17] >= 268435456) or ((maxc[17] div 4096) >= maxc[18]) then
t := 17
else
t := 18; {816:}
s := maxptr[t];
pp := mem[s].hh.lh;
v := mem[s + 1].int;
if t = 17 then
mem[s + 1].int := -268435456
else
mem[s + 1].int := -65536;
r := mem[pp + 1].hh.rh;
mem[s].hh.rh := r;
while mem[r].hh.lh <> (-30000) do
r := mem[r].hh.rh;
q := mem[r].hh.rh;
mem[r].hh.rh := -30000;
mem[q + 1].hh.lh := mem[pp + 1].hh.lh;
mem[mem[pp + 1].hh.lh].hh.rh := q;
begin
mem[pp].hh.b0 := 19;
serialno := serialno + 64;
mem[pp + 1].int := serialno
end;
if curexp = pp then
if curtype = t then
curtype := 19;
if internal[2] > 0 then {817:}
if interesting(p) then begin
begindiagnostic;
printnl(631);
if v > 0 then
printchar(45);
if t = 17 then
vv := roundfraction(maxc[17])
else
vv := maxc[18];
if vv <> 65536 then
printscaled(vv);
printvariablename(p);
while (mem[p + 1].int mod 64) > 0 do begin
print(455);
mem[p + 1].int := mem[p + 1].int - 2
end;
if t = 17 then
printchar(61)
else
print(632);
printdependency(s, t);
enddiagnostic(false)
end {:817} {:816};
t := 35 - t;
if maxc[t] > 0 then begin
mem[maxptr[t]].hh.rh := maxlink[t];
maxlink[t] := maxptr[t]
end;
if t <> 17 then {818:}
for t := 17 to 18 do begin
r := maxlink[t];
while r <> (-30000) do begin
q := mem[r].hh.lh;
mem[q + 1].hh.rh := pplusfq(mem[q + 1].hh.rh, makefraction(mem[r + 1].int, -v), s, t, 17);
if mem[q + 1].hh.rh = depfinal then
makeknown(q, depfinal);
q := r;
r := mem[r].hh.rh;
freenode(q, 2)
end
end {:818} {819:}
else
for t := 17 to 18 do begin
r := maxlink[t];
while r <> (-30000) do begin
q := mem[r].hh.lh;
if t = 17 then begin
if curexp = q then
if curtype = 17 then
curtype := 18;
mem[q + 1].hh.rh := poverv(mem[q + 1].hh.rh, 65536, 17, 18);
mem[q].hh.b0 := 18;
mem[r + 1].int := roundfraction(mem[r + 1].int)
end;
mem[q + 1].hh.rh := pplusfq(mem[q + 1].hh.rh, makescaled(mem[r + 1].int, -v), s, 18, 18);
if mem[q + 1].hh.rh = depfinal then
makeknown(q, depfinal);
q := r;
r := mem[r].hh.rh;
freenode(q, 2)
end
end {:819};
flushnodelist(s);
if fixneeded then
fixdependencies;
begin
if aritherror then
cleararith
end
end {:815}
end; {:812}
20, 21:
confusion(630);
22, 23:
deletemacref(mem[p + 1].int)
end;
mem[p].hh.b0 := 0
end; {:809} {808:}
procedure flushcurexp(v: scaled);
begin
if curtype in
[3, 5, 7, 12, 10, 13, 14, 17,
18, 19, 6, 4, 8, 9, 11] then
case curtype of
3, 5, 7, 12, 10, 13, 14,
17, 18, 19:
begin
recyclevalue(curexp);
freenode(curexp, 2)
end;
6:
if mem[curexp].hh.lh = (-30000) then
tosspen(curexp)
else
mem[curexp].hh.lh := mem[curexp].hh.lh - 1;
4:
begin
if strref[curexp] < 127 then
if strref[curexp] > 1 then
strref[curexp] := strref[curexp] - 1
else
flushstring(curexp)
end;
8, 9:
tossknotlist(curexp);
11:
tossedges(curexp)
end
else
;
curtype := 16;
curexp := v
end; {:808} {820:}
procedure flusherror(v: scaled);
begin
error;
flushcurexp(v)
end;
procedure backerror;
forward;
procedure getxnext;
forward;
procedure putgeterror;
begin
backerror;
getxnext
end; { putgeterror }
procedure putgetflusherror(v: scaled);
begin
putgeterror;
flushcurexp(v)
end; {:820} {247:}
procedure flushbelowvariable(p: halfword);
var
q, r: halfword;
begin
if mem[p].hh.b0 <> 21 then
recyclevalue(p)
else begin
q := mem[p + 1].hh.rh;
while mem[q].hh.b1 = 3 do begin
flushbelowvariable(q);
r := q;
q := mem[q].hh.rh;
freenode(r, 3)
end;
r := mem[p + 1].hh.lh;
q := mem[r].hh.rh;
recyclevalue(r);
if mem[p].hh.b1 <= 1 then
freenode(r, 2)
else
freenode(r, 3);
repeat
flushbelowvariable(q);
r := q;
q := mem[q].hh.rh;
freenode(r, 3)
until q = (-29983);
mem[p].hh.b0 := 0
end
end; {:247}
procedure flushvariable(p, t: halfword; discardsuffixes: boolean);
label
10;
var
q, r: halfword;
n: halfword;
begin
while t <> (-30000) do begin
if mem[p].hh.b0 <> 21 then
goto 10;
n := mem[t].hh.lh;
t := mem[t].hh.rh;
if n = 0 then begin
r := p + 1;
q := mem[r].hh.rh;
while mem[q].hh.b1 = 3 do begin
flushvariable(q, t, discardsuffixes);
if t = (-30000) then
if mem[q].hh.b0 = 21 then
r := q
else begin
mem[r].hh.rh := mem[q].hh.rh;
freenode(q, 3)
end
else
r := q;
q := mem[r].hh.rh
end
end;
p := mem[p + 1].hh.lh;
repeat
r := p;
p := mem[p].hh.rh
until mem[p + 2].hh.lh >= n;
if mem[p + 2].hh.lh <> n then
goto 10
end;
if discardsuffixes then
flushbelowvariable(p)
else begin
if mem[p].hh.b0 = 21 then
p := mem[p + 1].hh.lh;
recyclevalue(p)
end;
10:
end; {:246} {248:}
function undtype(p: halfword): smallnumber;
begin
case mem[p].hh.b0 of
0, 1:
undtype := 0;
2, 3:
undtype := 3;
4, 5:
undtype := 5;
6, 7, 8:
undtype := 7;
9, 10:
undtype := 10;
11, 12:
undtype := 12;
13, 14, 15:
undtype := mem[p].hh.b0;
16, 17, 18, 19:
undtype := 15
end
end; {:248}
{249:}
procedure clearsymbol(p: halfword; saving: boolean);
var
q: halfword;
begin
q := eqtb[p].rh;
if eqtb[p].lh mod 83 in
[10, 53, 44, 49, 41] then
case eqtb[p].lh mod 83 of
10, 53, 44, 49:
if not saving then
deletemacref(q);
41:
if q <> (-30000) then
if saving then
mem[q].hh.b1 := 1
else begin
flushbelowvariable(q);
freenode(q, 2)
end
end
else
;
eqtb[p] := eqtb[2241]
end; {:249} {252:}
procedure savevariable(q: halfword);
var
p: halfword;
begin
if saveptr <> (-30000) then begin
p := getnode(2);
mem[p].hh.lh := q;
mem[p].hh.rh := saveptr;
mem[p + 1].hh := eqtb[q];
saveptr := p
end;
clearsymbol(q, saveptr <> (-30000))
end; {:252} {253:}
procedure saveinternal(q: halfword);
var
p: halfword;
begin
if saveptr <> (-30000) then begin
p := getnode(2);
mem[p].hh.lh := 2241 + q;
mem[p].hh.rh := saveptr;
mem[p + 1].int := internal[q];
saveptr := p
end
end; { saveinternal }
{:253}
{254:}
procedure unsave;
var
q: halfword;
p: halfword;
begin
while mem[saveptr].hh.lh <> 0 do begin
q := mem[saveptr].hh.lh;
if q > 2241 then begin
if internal[8] > 0 then begin
begindiagnostic;
printnl(383);
print(intname[q - 2241]);
printchar(61);
printscaled(mem[saveptr + 1].int);
printchar(125);
enddiagnostic(false)
end;
internal[q - 2241] := mem[saveptr + 1].int
end else begin
if internal[8] > 0 then begin
begindiagnostic;
printnl(383);
print(hash[q].rh);
printchar(125);
enddiagnostic(false)
end;
clearsymbol(q, false);
eqtb[q] := mem[saveptr + 1].hh;
if (eqtb[q].lh mod 83) = 41 then begin
p := eqtb[q].rh;
if p <> (-30000) then
mem[p].hh.b1 := 0
end
end;
p := mem[saveptr].hh.rh;
freenode(saveptr, 2);
saveptr := p
end;
p := mem[saveptr].hh.rh;
begin
mem[saveptr].hh.rh := avail;
avail := saveptr
end {dynused:=dynused-1;};
saveptr := p
end; {:254} {264:}
function copyknot(p: halfword): halfword;
var
q: halfword;
k: 0..6;
begin
q := getnode(7);
for k := 0 to 6 do
mem[q + k] := mem[p + k];
copyknot := q
end; {:264} {265:}
function copypath(p: halfword): halfword;
label
10;
var
q, pp, qq: halfword;
begin
q := getnode(7);
qq := q;
pp := p;
while true do begin
mem[qq].hh.b0 := mem[pp].hh.b0;
mem[qq].hh.b1 := mem[pp].hh.b1;
mem[qq + 1].int := mem[pp + 1].int;
mem[qq + 2].int := mem[pp + 2].int;
mem[qq + 3].int := mem[pp + 3].int;
mem[qq + 4].int := mem[pp + 4].int;
mem[qq + 5].int := mem[pp + 5].int;
mem[qq + 6].int := mem[pp + 6].int;
if mem[pp].hh.rh = p then begin
mem[qq].hh.rh := q;
copypath := q;
goto 10
end;
mem[qq].hh.rh := getnode(7);
qq := mem[qq].hh.rh;
pp := mem[pp].hh.rh
end;
10:
end; {:265} {266:}
function htapypoc(p: halfword): halfword;
label
10;
var
q, pp, qq, rr: halfword;
begin
q := getnode(7);
qq := q;
pp := p;
while true do begin
mem[qq].hh.b1 := mem[pp].hh.b0;
mem[qq].hh.b0 := mem[pp].hh.b1;
mem[qq + 1].int := mem[pp + 1].int;
mem[qq + 2].int := mem[pp + 2].int;
mem[qq + 5].int := mem[pp + 3].int;
mem[qq + 6].int := mem[pp + 4].int;
mem[qq + 3].int := mem[pp + 5].int;
mem[qq + 4].int := mem[pp + 6].int;
if mem[pp].hh.rh = p then begin
mem[q].hh.rh := qq;
pathtail := pp;
htapypoc := q;
goto 10
end;
rr := getnode(7);
mem[rr].hh.rh := qq;
qq := rr;
pp := mem[pp].hh.rh
end;
10:
end; {:266} {269:} {284:} {296:}
function curlratio(gamma, atension, btension: scaled): fraction;
var
alpha, beta, num, denom, ff: fraction;
begin
alpha := makefraction(65536, atension);
beta := makefraction(65536, btension);
if alpha <= beta then begin
ff := makefraction(alpha, beta);
ff := takefraction(ff, ff);
gamma := takefraction(gamma, ff);
beta := beta div 4096;
denom := (takefraction(gamma, alpha) + 196608) - beta;
num := takefraction(gamma, 805306368 - alpha) + beta
end else begin
ff := makefraction(beta, alpha);
ff := takefraction(ff, ff);
beta := takefraction(beta, ff) div 4096;
denom := (takefraction(gamma, alpha) + (ff div 1365)) - beta;
num := takefraction(gamma, 805306368 - alpha) + beta
end;
if num >= (((denom + denom) + denom) + denom) then
curlratio := 1073741824
else
curlratio := makefraction(num, denom)
end; {:296} {299:}
procedure setcontrols(p, q: halfword; k: integer);
var
rr, ss: fraction;
lt, rt: scaled;
sine: fraction;
begin
lt := abs(mem[q + 4].int);
rt := abs(mem[p + 6].int);
rr := velocity(st, ct, sf, cf, rt);
ss := velocity(sf, cf, st, ct, lt);
if (mem[p + 6].int < 0) or (mem[q + 4].int < 0) then {300:}
if ((st >= 0) and (sf >= 0)) or ((st <= 0) and (sf <= 0)) then begin
sine := takefraction(abs(st), cf) + takefraction(abs(sf), ct);
if sine > 0 then begin
sine := takefraction(sine, 268500992);
if mem[p + 6].int < 0 then
if abvscd(abs(sf), 268435456, rr, sine) < 0 then
rr := makefraction(abs(sf), sine);
if mem[q + 4].int < 0 then
if abvscd(abs(st), 268435456, ss, sine) < 0 then
ss := makefraction(abs(st), sine)
end
end {:300};
mem[p + 5].int := mem[p + 1].int + takefraction(takefraction(deltax[k], ct) - takefraction(deltay[k], st), rr);
mem[p + 6].int := mem[p + 2].int + takefraction(takefraction(deltay[k], ct) + takefraction(deltax[k], st), rr);
mem[q + 3].int := mem[q + 1].int - takefraction(takefraction(deltax[k], cf) + takefraction(deltay[k], sf), ss);
mem[q + 4].int := mem[q + 2].int - takefraction(takefraction(deltay[k], cf) - takefraction(deltax[k], sf), ss);
mem[p].hh.b1 := 1;
mem[q].hh.b0 := 1
end; { setcontrols }
{:299}
procedure solvechoices(p, q: halfword; n: halfword);
label
40, 10;
var
k: 0..pathsize;
r, s, t: halfword;
sine, cosine: fraction; {286:}
aa, bb, cc, ff, acc: fraction;
dd, ee: scaled;
lt, rt: scaled; {:286}
begin
k := 0;
s := p;
while true do begin
t := mem[s].hh.rh;
if k = 0 then {285:}
case mem[s].hh.b1 of
2:
if mem[t].hh.b0 = 2 then begin {301:}
aa := narg(deltax[0], deltay[0]);
nsincos(mem[p + 5].int - aa);
ct := ncos;
st := nsin;
nsincos(mem[q + 3].int - aa);
cf := ncos;
sf := -nsin;
setcontrols(p, q, 0);
goto 10
end else begin {:301} {293:}
vv[0] := mem[s + 5].int - narg(deltax[0], deltay[0]);
if abs(vv[0]) > 188743680 then
if vv[0] > 0 then
vv[0] := vv[0] - 377487360
else
vv[0] := vv[0] + 377487360;
uu[0] := 0;
ww[0] := 0
end {:293};
3:
if mem[t].hh.b0 = 3 then begin {302:}
mem[p].hh.b1 := 1;
mem[q].hh.b0 := 1;
lt := abs(mem[q + 4].int);
rt := abs(mem[p + 6].int);
if rt = 65536 then begin
if deltax[0] >= 0 then
mem[p + 5].int := mem[p + 1].int + ((deltax[0] + 1) div 3)
else
mem[p + 5].int := mem[p + 1].int + ((deltax[0] - 1) div 3);
if deltay[0] >= 0 then
mem[p + 6].int := mem[p + 2].int + ((deltay[0] + 1) div 3)
else
mem[p + 6].int := mem[p + 2].int + ((deltay[0] - 1) div 3)
end else begin
ff := makefraction(65536, 3 * rt);
mem[p + 5].int := mem[p + 1].int + takefraction(deltax[0], ff);
mem[p + 6].int := mem[p + 2].int + takefraction(deltay[0], ff)
end;
if lt = 65536 then begin
if deltax[0] >= 0 then
mem[q + 3].int := mem[q + 1].int - ((deltax[0] + 1) div 3)
else
mem[q + 3].int := mem[q + 1].int - ((deltax[0] - 1) div 3);
if deltay[0] >= 0 then
mem[q + 4].int := mem[q + 2].int - ((deltay[0] + 1) div 3)
else
mem[q + 4].int := mem[q + 2].int - ((deltay[0] - 1) div 3)
end else begin
ff := makefraction(65536, 3 * lt);
mem[q + 3].int := mem[q + 1].int - takefraction(deltax[0], ff);
mem[q + 4].int := mem[q + 2].int - takefraction(deltay[0], ff)
end;
goto 10
end else begin {:302} {294:}
cc := mem[s + 5].int;
lt := abs(mem[t + 4].int);
rt := abs(mem[s + 6].int);
if (rt = 65536) and (lt = 65536) then
uu[0] := makefraction((cc + cc) + 65536, cc + 131072)
else
uu[0] := curlratio(cc, rt, lt);
vv[0] := -takefraction(psi[1], uu[0]);
ww[0] := 0
end {:294};
4:
begin
uu[0] := 0;
vv[0] := 0;
ww[0] := 268435456
end
end {:285}
else
case mem[s].hh.b0 of
5, 4:
begin {287:} {288:}
if abs(mem[r + 6].int) = 65536 then begin
aa := 134217728;
dd := 2 * delta[k]
end else begin
aa := makefraction(65536, (3 * abs(mem[r + 6].int)) - 65536);
dd := takefraction(delta[k], 805306368 - makefraction(65536, abs(mem[r + 6].int)))
end;
if abs(mem[t + 4].int) = 65536 then begin
bb := 134217728;
ee := 2 * delta[k - 1]
end else begin
bb := makefraction(65536, (3 * abs(mem[t + 4].int)) - 65536);
ee := takefraction(delta[k - 1], 805306368 - makefraction(65536, abs(mem[t + 4].int)))
end;
cc := 268435456 - takefraction(uu[k - 1], aa) {:288}; {289:}
dd := takefraction(dd, cc);
lt := abs(mem[s + 4].int);
rt := abs(mem[s + 6].int);
if lt <> rt then
if lt < rt then begin
ff := makefraction(lt, rt);
ff := takefraction(ff, ff);
dd := takefraction(dd, ff)
end else begin
ff := makefraction(rt, lt);
ff := takefraction(ff, ff);
ee := takefraction(ee, ff)
end;
ff := makefraction(ee, ee + dd) {:289};
uu[k] := takefraction(ff, bb); {290:}
acc := -takefraction(psi[k + 1], uu[k]);
if mem[r].hh.b1 = 3 then begin
ww[k] := 0;
vv[k] := acc - takefraction(psi[1], 268435456 - ff)
end else begin
ff := makefraction(268435456 - ff, cc);
acc := acc - takefraction(psi[k], ff);
ff := takefraction(ff, aa);
vv[k] := acc - takefraction(vv[k - 1], ff);
if ww[k - 1] = 0 then
ww[k] := 0
else
ww[k] := -takefraction(ww[k - 1], ff)
end {:290};
if mem[s].hh.b0 = 5 then begin {291:}
aa := 0;
bb := 268435456;
repeat
k := k - 1;
if k = 0 then
k := n;
aa := vv[k] - takefraction(aa, uu[k]);
bb := ww[k] - takefraction(bb, uu[k])
until k = n;
aa := makefraction(aa, 268435456 - bb);
theta[n] := aa;
vv[0] := aa;
for k := 1 to n - 1 do
vv[k] := vv[k] + takefraction(aa, ww[k]);
goto 40
end {:291}
end; {:287}
3:
begin {295:}
cc := mem[s + 3].int;
lt := abs(mem[s + 4].int);
rt := abs(mem[r + 6].int);
if (rt = 65536) and (lt = 65536) then
ff := makefraction((cc + cc) + 65536, cc + 131072)
else
ff := curlratio(cc, lt, rt);
theta[n] := -makefraction(takefraction(vv[n - 1], ff), 268435456 - takefraction(ff, uu[n - 1]));
goto 40
end; {:295}
2:
begin {292:}
theta[n] := mem[s + 3].int - narg(deltax[n - 1], deltay[n - 1]);
if abs(theta[n]) > 188743680 then
if theta[n] > 0 then
theta[n] := theta[n] - 377487360
else
theta[n] := theta[n] + 377487360;
goto 40
end
end {:292};
r := s;
s := t;
k := k + 1
end;
40: {297:}
for k := n - 1 downto 0 do
theta[k] := vv[k] - takefraction(theta[k + 1], uu[k]);
s := p;
k := 0;
repeat
t := mem[s].hh.rh;
nsincos(theta[k]);
st := nsin;
ct := ncos;
nsincos((-psi[k + 1]) - theta[k + 1]);
sf := nsin;
cf := ncos;
setcontrols(s, t, k);
k := k + 1;
s := t
until k = n {:297};
10:
end; {:284}
procedure makechoices(knots: halfword);
label
30;
var
h: halfword;
p, q: halfword; {280:}
k, n: 0..pathsize;
r, s, t: halfword;
delx, dely: scaled;
sine, cosine: fraction; {:280}
begin
begin
if aritherror then
cleararith
end;
if internal[4] > 0 then
printpath(knots, 393, true); {271:}
p := knots;
repeat
q := mem[p].hh.rh;
if mem[p + 1].int = mem[q + 1].int then
if mem[p + 2].int = mem[q + 2].int then
if mem[p].hh.b1 > 1 then begin
mem[p].hh.b1 := 1;
if mem[p].hh.b0 = 4 then begin
mem[p].hh.b0 := 3;
mem[p + 3].int := 65536
end;
mem[q].hh.b0 := 1;
if mem[q].hh.b1 = 4 then begin
mem[q].hh.b1 := 3;
mem[q + 5].int := 65536
end;
mem[p + 5].int := mem[p + 1].int;
mem[q + 3].int := mem[p + 1].int;
mem[p + 6].int := mem[p + 2].int;
mem[q + 4].int := mem[p + 2].int
end;
p := q
until p = knots {:271}; {272:}
h := knots;
while true do begin
if mem[h].hh.b0 <> 4 then
goto 30;
if mem[h].hh.b1 <> 4 then
goto 30;
h := mem[h].hh.rh;
if h = knots then begin
mem[h].hh.b0 := 5;
goto 30
end
end;
30: {:272}
;
p := h; {273:}
repeat
q := mem[p].hh.rh;
if mem[p].hh.b1 >= 2 then begin
while (mem[q].hh.b0 = 4) and (mem[q].hh.b1 = 4) do
q := mem[q].hh.rh; {278:} {281:}
k := 0;
s := p;
n := pathsize;
repeat
t := mem[s].hh.rh;
deltax[k] := mem[t + 1].int - mem[s + 1].int;
deltay[k] := mem[t + 2].int - mem[s + 2].int;
delta[k] := pythadd(deltax[k], deltay[k]);
if k > 0 then begin
sine := makefraction(deltay[k - 1], delta[k - 1]);
cosine := makefraction(deltax[k - 1], delta[k - 1]);
psi[k] := narg(takefraction(deltax[k], cosine) + takefraction(deltay[k], sine), takefraction(deltay[k], cosine) - takefraction(deltax[k], sine))
end;
k := k + 1;
s := t;
if k = pathsize then
overflow(398, pathsize);
if s = q then
n := k
until (k >= n) and (mem[s].hh.b0 <> 5);
if k = n then
psi[n] := 0
else
psi[k] := psi[1] {:281}; {282:}
if mem[q].hh.b0 = 4 then begin
delx := mem[q + 5].int - mem[q + 1].int;
dely := mem[q + 6].int - mem[q + 2].int;
if (delx = 0) and (dely = 0) then begin
mem[q].hh.b0 := 3;
mem[q + 3].int := 65536
end else begin
mem[q].hh.b0 := 2;
mem[q + 3].int := narg(delx, dely)
end
end;
if (mem[p].hh.b1 = 4) and (mem[p].hh.b0 = 1) then begin
delx := mem[p + 1].int - mem[p + 3].int;
dely := mem[p + 2].int - mem[p + 4].int;
if (delx = 0) and (dely = 0) then begin
mem[p].hh.b1 := 3;
mem[p + 5].int := 65536
end else begin
mem[p].hh.b1 := 2;
mem[p + 5].int := narg(delx, dely)
end
end {:282};
solvechoices(p, q, n) {:278}
end;
p := q {:273}
until p = h;
if internal[4] > 0 then
printpath(knots, 394, true);
if aritherror then begin {270:}
begin
if interaction = 3 then
;
printnl(133);
print(395)
end;
begin
helpptr := 2;
helpline[1] := 396;
helpline[0] := 397
end;
putgeterror;
aritherror := false
end {:270}
end; {:269} {311:}
{-------------------------------------------------------------------
procedure makemoves(xx0, xx1, xx2, xx3, yy0, yy1, yy2, yy3: scaled; xicorr, etacorr: smallnumber);
moved to mf2ps3.p
-------------------------------------------------------------------}
procedure smoothmoves(b, t: integer);
var
k: 1..movesize;
a, aa, aaa: integer;
begin
if (t - b) >= 3 then begin
k := b + 2;
aa := move[k - 1];
aaa := move[k - 2];
repeat
a := move[k];
if abs(a - aa) > 1 then {322:}
if a > aa then begin
if aaa >= aa then
if a >= move[k + 1] then begin
move[k - 1] := move[k - 1] + 1;
move[k] := a - 1
end
end else begin
if aaa <= aa then
if a <= move[k + 1] then begin
move[k - 1] := move[k - 1] - 1;
move[k] := a + 1
end
end {:322};
k := k + 1;
aaa := aa;
aa := a
until k = t
end
end; {:321} {326:}
procedure initedges(h: halfword);
begin
mem[h].hh.lh := h;
mem[h].hh.rh := h;
mem[h + 1].hh.lh := 8191;
mem[h + 1].hh.rh := 1;
mem[h + 2].hh.lh := 8191;
mem[h + 2].hh.rh := 1;
mem[h + 3].hh.lh := 4096;
mem[h + 3].hh.rh := 0;
mem[h + 4].int := 0;
mem[h + 5].hh.rh := h;
mem[h + 5].hh.lh := 0
end; {:326} {328:}
procedure fixoffset;
var
p, q: halfword;
delta: integer;
begin
delta := 8 * (mem[curedges + 3].hh.lh - 4096);
mem[curedges + 3].hh.lh := 4096;
q := mem[curedges].hh.rh;
while q <> curedges do begin
p := mem[q + 1].hh.rh;
while p <> 30000 do begin
mem[p].hh.lh := mem[p].hh.lh - delta;
p := mem[p].hh.rh
end;
p := mem[q + 1].hh.lh;
while p > (-29999) do begin
mem[p].hh.lh := mem[p].hh.lh - delta;
p := mem[p].hh.rh
end;
q := mem[q].hh.rh
end
end; {:328} {329:}
procedure edgeprep(ml, mr, nl, nr: integer);
var
delta: halfword;
p, q: halfword;
begin
ml := ml + 4096;
mr := mr + 4096;
nl := nl + 4096;
nr := nr + 4095;
if ml < mem[curedges + 2].hh.lh then
mem[curedges + 2].hh.lh := ml;
if mr > mem[curedges + 2].hh.rh then
mem[curedges + 2].hh.rh := mr;
if (not (abs((mem[curedges + 2].hh.lh + mem[curedges + 3].hh.lh) - 8192) < 4096)) or (not (abs((mem[curedges + 2].hh.rh + mem[curedges + 3].hh.lh) - 8192) < 4096)) then
fixoffset;
if mem[curedges].hh.rh = curedges then begin
mem[curedges + 1].hh.lh := nr + 1;
mem[curedges + 1].hh.rh := nr
end;
if nl < mem[curedges + 1].hh.lh then begin {330:}
delta := mem[curedges + 1].hh.lh - nl;
mem[curedges + 1].hh.lh := nl;
p := mem[curedges].hh.rh;
repeat
q := getnode(2);
mem[q + 1].hh.rh := 30000;
mem[q + 1].hh.lh := -29999;
mem[p].hh.lh := q;
mem[q].hh.rh := p;
p := q;
delta := delta - 1
until delta = 0;
mem[p].hh.lh := curedges;
mem[curedges].hh.rh := p;
if mem[curedges + 5].hh.rh = curedges then
mem[curedges + 5].hh.lh := nl - 1
end {:330};
if nr > mem[curedges + 1].hh.rh then begin {331:}
delta := nr - mem[curedges + 1].hh.rh;
mem[curedges + 1].hh.rh := nr;
p := mem[curedges].hh.lh;
repeat
q := getnode(2);
mem[q + 1].hh.rh := 30000;
mem[q + 1].hh.lh := -29999;
mem[p].hh.rh := q;
mem[q].hh.lh := p;
p := q;
delta := delta - 1
until delta = 0;
mem[p].hh.rh := curedges;
mem[curedges].hh.lh := p;
if mem[curedges + 5].hh.rh = curedges then
mem[curedges + 5].hh.lh := nr + 1
end {:331}
end; {:329} {334:}
function copyedges(h: halfword): halfword;
var
p, r: halfword;
hh, pp, qq, rr, ss: halfword;
begin
hh := getnode(6);
mem[hh + 1] := mem[h + 1];
mem[hh + 2] := mem[h + 2];
mem[hh + 3] := mem[h + 3];
mem[hh + 4] := mem[h + 4];
mem[hh + 5].hh.lh := mem[hh + 1].hh.rh + 1;
mem[hh + 5].hh.rh := hh;
p := mem[h].hh.rh;
qq := hh;
while p <> h do begin
pp := getnode(2);
mem[qq].hh.rh := pp;
mem[pp].hh.lh := qq;
{335:}
r := mem[p + 1].hh.rh;
rr := pp + 1;
while r <> 30000 do begin
ss := getavail;
mem[rr].hh.rh := ss;
rr := ss;
mem[rr].hh.lh := mem[r].hh.lh;
r := mem[r].hh.rh
end;
mem[rr].hh.rh := 30000;
r := mem[p + 1].hh.lh;
rr := 29999;
while r > (-29999) do begin
ss := getavail;
mem[rr].hh.rh := ss;
rr := ss;
mem[rr].hh.lh := mem[r].hh.lh;
r := mem[r].hh.rh
end;
mem[rr].hh.rh := r;
mem[pp + 1].hh.lh := mem[29999].hh.rh {:335};
p := mem[p].hh.rh;
qq := pp
end;
mem[qq].hh.rh := hh;
mem[hh].hh.lh := qq;
copyedges := hh
end; {:334} {336:}
procedure yreflectedges;
var
p, q, r: halfword;
begin
p := mem[curedges + 1].hh.lh;
mem[curedges + 1].hh.lh := 8191 - mem[curedges + 1].hh.rh;
mem[curedges + 1].hh.rh := 8191 - p;
mem[curedges + 5].hh.lh := 8191 - mem[curedges + 5].hh.lh;
p := mem[curedges].hh.rh;
q := curedges;
repeat
r := mem[p].hh.rh;
mem[p].hh.rh := q;
mem[q].hh.lh := p;
q := p;
p := r
until q = curedges;
mem[curedges + 4].int := 0
end; {:336} {337:}
procedure xreflectedges;
var
p, q, r, s: halfword;
m: integer;
begin
p := mem[curedges + 2].hh.lh;
mem[curedges + 2].hh.lh := 8192 - mem[curedges + 2].hh.rh;
mem[curedges + 2].hh.rh := 8192 - p;
m := ((4096 + mem[curedges + 3].hh.lh) * 8) - 65528;
mem[curedges + 3].hh.lh := 4096;
p := mem[curedges].hh.rh; {339:}
repeat
q := mem[p + 1].hh.rh;
r := 30000;
while q <> 30000 do begin
s := mem[q].hh.rh;
mem[q].hh.rh := r;
r := q;
mem[r].hh.lh := m - mem[q].hh.lh;
q := s
end;
mem[p + 1].hh.rh := r {:339}; {338:}
q := mem[p + 1].hh.lh;
while q > (-29999) do begin
mem[q].hh.lh := m - mem[q].hh.lh;
q := mem[q].hh.rh
end {:338};
p := mem[p].hh.rh
until p = curedges;
mem[curedges + 4].int := 0
end; { xreflectedges }
{:337}
{340:}
procedure yscaleedges(s: integer);
var
p, q, pp, r, rr, ss: halfword;
t: integer;
begin
if ((s * (mem[curedges + 1].hh.rh - 4095)) >= 4096) or ((s * (mem[curedges + 1].hh.lh - 4096)) <= (-4096)) then begin
begin
if interaction = 3 then
;
printnl(133);
print(402)
end;
begin
helpptr := 3;
helpline[2] := 403;
helpline[1] := 404;
helpline[0] := 405
end;
putgeterror
end else begin
mem[curedges + 1].hh.rh := (s * (mem[curedges + 1].hh.rh - 4095)) + 4095;
mem[curedges + 1].hh.lh := (s * (mem[curedges + 1].hh.lh - 4096)) + 4096; {341:}
p := curedges;
repeat
q := p;
p := mem[p].hh.rh;
for t := 2 to s do begin
pp := getnode(2);
mem[q].hh.rh := pp;
mem[p].hh.lh := pp;
mem[pp].hh.rh := p;
mem[pp].hh.lh := q;
q := pp; {335:}
r := mem[p + 1].hh.rh;
rr := pp + 1;
while r <> 30000 do begin
ss := getavail;
mem[rr].hh.rh := ss;
rr := ss;
mem[rr].hh.lh := mem[r].hh.lh;
r := mem[r].hh.rh
end;
mem[rr].hh.rh := 30000;
r := mem[p + 1].hh.lh;
rr := 29999;
while r > (-29999) do begin
ss := getavail;
mem[rr].hh.rh := ss;
rr := ss;
mem[rr].hh.lh := mem[r].hh.lh;
r := mem[r].hh.rh
end;
mem[rr].hh.rh := r;
mem[pp + 1].hh.lh := mem[29999].hh.rh {:335}
end
until mem[p].hh.rh = curedges {:341};
mem[curedges + 4].int := 0
end
end; {:340}
{342:}
procedure xscaleedges(s: integer);
var
p, q: halfword;
t: 0..65535;
w: 0..7;
delta: integer;
begin
if ((s * (mem[curedges + 2].hh.rh - 4096)) >= 4096) or ((s * (mem[curedges + 2].hh.lh - 4096)) <= (-4096)) then begin
begin
if interaction = 3 then
;
printnl(133);
print(402)
end;
begin
helpptr := 3;
helpline[2] := 406;
helpline[1] := 404;
helpline[0] := 405
end;
putgeterror
end else if (mem[curedges + 2].hh.rh <> 4096) or (mem[curedges + 2].hh.lh <> 4096) then begin
mem[curedges + 2].hh.rh := (s * (mem[curedges + 2].hh.rh - 4096)) + 4096;
mem[curedges + 2].hh.lh := (s * (mem[curedges + 2].hh.lh - 4096)) + 4096;
delta := (8 * (4096 - (s * mem[curedges + 3].hh.lh))) - 32768;
mem[curedges + 3].hh.lh := 4096; {343:}
q := mem[curedges].hh.rh;
repeat
p := mem[q + 1].hh.rh;
while p <> 30000 do begin
t := mem[p].hh.lh + 32768;
w := t mod 8;
mem[p].hh.lh := (((t - w) * s) + w) + delta;
p := mem[p].hh.rh
end;
p := mem[q + 1].hh.lh;
while p > (-29999) do begin
t := mem[p].hh.lh + 32768;
w := t mod 8;
mem[p].hh.lh := (((t - w) * s) + w) + delta;
p := mem[p].hh.rh
end;
q := mem[q].hh.rh
until q = curedges {:343};
mem[curedges + 4].int := 0
end
end; { xscaleedges }
{:342}
{344:}
procedure negateedges(h: halfword);
label
30;
var
p, q, r, s, t, u: halfword;
begin
p := mem[h].hh.rh;
while p <> h do begin
q := mem[p + 1].hh.lh;
while q > (-29999) do begin
mem[q].hh.lh := (8 - (2 * ((mem[q].hh.lh + 32768) mod 8))) + mem[q].hh.lh;
q := mem[q].hh.rh
end;
q := mem[p + 1].hh.rh;
if q <> 30000 then begin
repeat
mem[q].hh.lh := (8 - (2 * ((mem[q].hh.lh + 32768) mod 8))) + mem[q].hh.lh;
q := mem[q].hh.rh
until q = 30000; {345:}
u := p + 1;
q := mem[u].hh.rh;
r := q;
s := mem[r].hh.rh;
while true do
if mem[s].hh.lh > mem[r].hh.lh then begin
mem[u].hh.rh := q;
if s = 30000 then
goto 30;
u := r;
q := s;
r := q;
s := mem[r].hh.rh
end else begin
t := s;
s := mem[t].hh.rh;
mem[t].hh.rh := q;
q := t
end;
30:
mem[r].hh.rh := 30000 {:345}
end;
p := mem[p].hh.rh
end;
mem[h + 4].int := 0
end; {:344} {346:}
procedure sortedges(h: halfword);
label
30;
var
k: halfword;
p, q, r, s: halfword;
begin
r := mem[h + 1].hh.lh;
mem[h + 1].hh.lh := -30000;
p := mem[r].hh.rh;
mem[r].hh.rh := 30000;
mem[29999].hh.rh := r;
while p > (-29999) do begin
k := mem[p].hh.lh;
q := 29999;
repeat
r := q;
q := mem[r].hh.rh
until k <= mem[q].hh.lh;
mem[r].hh.rh := p;
r := mem[p].hh.rh;
mem[p].hh.rh := q;
p := r
end; {347:}
begin
r := h + 1;
q := mem[r].hh.rh;
p := mem[29999].hh.rh;
while true do begin
k := mem[p].hh.lh;
while k > mem[q].hh.lh do begin
r := q;
q := mem[r].hh.rh
end;
mem[r].hh.rh := p;
s := mem[p].hh.rh;
mem[p].hh.rh := q;
if s = 30000 then
goto 30;
r := p;
p := s
end;
30: {:347}
end
end; {:346} {348:}
procedure culledges(wlo, whi, wout, win: integer);
label
30;
var
p, q, r, s: halfword;
w: integer;
d: integer;
m: integer;
mm: integer;
ww: integer;
prevw: integer;
n, minn, maxn: halfword;
mind, maxd: halfword;
begin
mind := 32767;
maxd := -32768;
minn := 32767;
maxn := -32768;
p := mem[curedges].hh.rh;
n := mem[curedges + 1].hh.lh;
while p <> curedges do begin
if mem[p + 1].hh.lh > (-29999) then
sortedges(p);
if mem[p + 1].hh.rh <> 30000 then begin {349:}
r := 29999;
q := mem[p + 1].hh.rh;
ww := 0;
m := 1000000;
prevw := 0;
while true do begin
if q = 30000 then
mm := 1000000
else begin
d := mem[q].hh.lh + 32768;
mm := d div 8;
ww := (ww + (d mod 8)) - 4
end;
if mm > m then begin {350:}
if w <> prevw then begin
s := getavail;
mem[r].hh.rh := s;
mem[s].hh.lh := (((8 * m) - 32764) + w) - prevw;
r := s;
prevw := w
end {:350};
if q = 30000 then
goto 30
end;
m := mm;
if ww >= wlo then
if ww <= whi then
w := win
else
w := wout
else
w := wout;
s := mem[q].hh.rh;
begin
mem[q].hh.rh := avail;
avail := q
end {dynused:=dynused-1;};
q := s
end;
30:
mem[r].hh.rh := 30000;
mem[p + 1].hh.rh := mem[29999].hh.rh;
if r <> 29999 then begin {351:}
if minn = 32767 then
minn := n;
maxn := n;
if mind > mem[mem[29999].hh.rh].hh.lh then
mind := mem[mem[29999].hh.rh].hh.lh;
if maxd < mem[r].hh.lh then
maxd := mem[r].hh.lh
end {:351}
end {:349};
p := mem[p].hh.rh;
n := n + 1
end; {352:}
if minn > maxn then begin {353:}
p := mem[curedges].hh.rh;
while p <> curedges do begin
q := mem[p].hh.rh;
freenode(p, 2);
p := q
end;
initedges(curedges)
end else begin {:353}
n := mem[curedges + 1].hh.lh;
mem[curedges + 1].hh.lh := minn;
while minn > n do begin
p := mem[curedges].hh.rh;
mem[curedges].hh.rh := mem[p].hh.rh;
mem[mem[p].hh.rh].hh.lh := curedges;
freenode(p, 2);
n := n + 1
end;
n := mem[curedges + 1].hh.rh;
mem[curedges + 1].hh.rh := maxn;
mem[curedges + 5].hh.lh := maxn + 1;
mem[curedges + 5].hh.rh := curedges;
while maxn < n do begin
p := mem[curedges].hh.lh;
mem[curedges].hh.lh := mem[p].hh.lh;
mem[mem[p].hh.lh].hh.rh := curedges;
freenode(p, 2);
n := n - 1
end;
mem[curedges + 2].hh.lh := (((mind + 32768) div 8) - mem[curedges + 3].hh.lh) + 4096;
mem[curedges + 2].hh.rh := (((maxd + 32768) div 8) - mem[curedges + 3].hh.lh) + 4096
end {:352};
mem[curedges + 4].int := 0
end; {:348} {354:}
procedure xyswapedges;
label
30;
var
mmagic, nmagic: integer;
p, q, r, s: halfword; {357:}
mspread: integer;
j, jj: 0..movesize;
m, mm: integer;
pd, rd: integer;
pm, rm: integer;
w: integer;
ww: integer;
dw: integer; {:357} {363:}
extras: integer;
xw: -3..3;
k: integer; {:363} {356:}
begin
mspread := mem[curedges + 2].hh.rh - mem[curedges + 2].hh.lh;
if mspread > movesize then
overflow(407, movesize);
for j := 0 to mspread do
move[j] := 30000 {:356}; {355:}
p := getnode(2);
mem[p + 1].hh.rh := 30000;
mem[p + 1].hh.lh := -30000;
mem[p].hh.lh := curedges;
mem[mem[curedges].hh.rh].hh.lh := p;
p := getnode(2);
mem[p + 1].hh.rh := 30000;
mem[p].hh.lh := mem[curedges].hh.lh; {:355} {365:}
mmagic := (mem[curedges + 2].hh.lh + mem[curedges + 3].hh.lh) - 4096;
nmagic := (8 * mem[curedges + 1].hh.rh) - 32756 {:365};
repeat
q := mem[p].hh.lh;
if mem[q + 1].hh.lh > (-29999) then
sortedges(q); {358:}
r := mem[p + 1].hh.rh;
freenode(p, 2);
p := r;
pd := mem[p].hh.lh + 32768;
pm := pd div 8;
r := mem[q + 1].hh.rh;
rd := mem[r].hh.lh + 32768;
rm := rd div 8;
w := 0;
while true do begin
if pm < rm then
mm := pm
else
mm := rm;
if w <> 0 then {362:}
if m <> mm then begin
if (mm - mmagic) >= movesize then
confusion(377);
extras := (abs(w) - 1) div 3;
if extras > 0 then begin
if w > 0 then
xw := +3
else
xw := -3;
ww := w - (extras * xw)
end else
ww := w;
repeat
j := m - mmagic;
for k := 1 to extras do begin
s := getavail;
mem[s].hh.lh := nmagic + xw;
mem[s].hh.rh := move[j];
move[j] := s
end;
s := getavail;
mem[s].hh.lh := nmagic + ww;
mem[s].hh.rh := move[j];
move[j] := s;
m := m + 1
until m = mm
end {:362};
if pd < rd then begin
dw := (pd mod 8) - 4; {360:}
s := mem[p].hh.rh;
begin
mem[p].hh.rh := avail;
avail := p
end {dynused:=dynused-1;};
p := s;
pd := mem[p].hh.lh + 32768;
pm := pd div 8 {:360}
end else begin
if r = 30000 then
goto 30;
dw := -((rd mod 8) - 4); {359:}
r := mem[r].hh.rh;
rd := mem[r].hh.lh + 32768;
rm := rd div 8 {:359}
end;
m := mm;
w := w + dw
end;
30: {:358}
;
p := q;
nmagic := nmagic - 8
until mem[p].hh.lh = curedges;
freenode(p, 2); {364:}
move[mspread] := 0;
j := 0;
while move[j] = 30000 do
j := j + 1;
if j = mspread then
initedges(curedges)
else begin
mm := mem[curedges + 2].hh.lh;
mem[curedges + 2].hh.lh := mem[curedges + 1].hh.lh;
mem[curedges + 2].hh.rh := mem[curedges + 1].hh.rh + 1;
mem[curedges + 3].hh.lh := 4096;
jj := mspread - 1;
while move[jj] = 30000 do
jj := jj - 1;
mem[curedges + 1].hh.lh := j + mm;
mem[curedges + 1].hh.rh := jj + mm;
q := curedges;
repeat
p := getnode(2);
mem[q].hh.rh := p;
mem[p].hh.lh := q;
mem[p + 1].hh.rh := move[j];
mem[p + 1].hh.lh := -30000;
j := j + 1;
q := p
until j > jj;
mem[q].hh.rh := curedges;
mem[curedges].hh.lh := q;
mem[curedges + 5].hh.lh := mem[curedges + 1].hh.rh + 1;
mem[curedges + 5].hh.rh := curedges;
mem[curedges + 4].int := 0
end
end; {:364}
{:354}
{366:}
procedure mergeedges(h: halfword);
label
30;
var
p, q, r, pp, qq, rr: halfword;
n: integer;
k: halfword;
delta: integer;
begin
if mem[h].hh.rh <> h then begin
if (((mem[h + 2].hh.lh < mem[curedges + 2].hh.lh) or (mem[h + 2].hh.rh > mem[curedges + 2].hh.rh)) or (mem[h + 1].hh.lh < mem[curedges + 1].hh.lh)) or (mem[h + 1].hh.rh > mem[curedges + 1].hh.rh) then
edgeprep(mem[h + 2].hh.lh - 4096, mem[h + 2].hh.rh - 4096, mem[h + 1].hh.lh - 4096, mem[h + 1].hh.rh - 4095);
if mem[h + 3].hh.lh <> mem[curedges + 3].hh.lh then begin {367:}
pp := mem[h].hh.rh;
delta := 8 * (mem[curedges + 3].hh.lh - mem[h + 3].hh.lh);
repeat
qq := mem[pp + 1].hh.rh;
while qq <> 30000 do begin
mem[qq].hh.lh := mem[qq].hh.lh + delta;
qq := mem[qq].hh.rh
end;
qq := mem[pp + 1].hh.lh;
while qq > (-29999) do begin
mem[qq].hh.lh := mem[qq].hh.lh + delta;
qq := mem[qq].hh.rh
end;
pp := mem[pp].hh.rh
until pp = h
end {:367};
n := mem[curedges + 1].hh.lh;
p := mem[curedges].hh.rh;
pp := mem[h].hh.rh;
while n < mem[h + 1].hh.lh do begin
n := n + 1;
p := mem[p].hh.rh
end; {368:}
repeat
qq := mem[pp + 1].hh.lh;
if qq > (-29999) then
if mem[p + 1].hh.lh <= (-29999) then
mem[p + 1].hh.lh := qq
else begin
while mem[qq].hh.rh > (-29999) do
qq := mem[qq].hh.rh;
mem[qq].hh.rh := mem[p + 1].hh.lh;
mem[p + 1].hh.lh := mem[pp + 1].hh.lh
end;
mem[pp + 1].hh.lh := -30000;
qq := mem[pp + 1].hh.rh;
if qq <> 30000 then begin
if mem[p + 1].hh.lh = (-29999) then
mem[p + 1].hh.lh := -30000;
mem[pp + 1].hh.rh := 30000;
r := p + 1;
q := mem[r].hh.rh;
if q = 30000 then
mem[p + 1].hh.rh := qq
else
while true do begin
k := mem[qq].hh.lh;
while k > mem[q].hh.lh do begin
r := q;
q := mem[r].hh.rh
end;
mem[r].hh.rh := qq;
rr := mem[qq].hh.rh;
mem[qq].hh.rh := q;
if rr = 30000 then
goto 30;
r := qq;
qq := rr
end
end;
30: {:368}
;
pp := mem[pp].hh.rh;
p := mem[p].hh.rh
until pp = h
end
end; {:366} {369:}
function totalweight(h: halfword): integer;
var
p, q: halfword;
n: integer;
m: 0..65535;
begin
n := 0;
p := mem[h].hh.rh;
while p <> h do begin
q := mem[p + 1].hh.rh;
while q <> 30000 do begin {370:}
m := mem[q].hh.lh + 32768;
n := n - (((m mod 8) - 4) * (m div 8));
q := mem[q].hh.rh
end {:370};
q := mem[p + 1].hh.lh;
while q > (-29999) do begin {370:}
m := mem[q].hh.lh + 32768;
n := n - (((m mod 8) - 4) * (m div 8));
q := mem[q].hh.rh
end {:370};
p := mem[p].hh.rh
end;
totalweight := n
end; {:369}
{372:}
procedure beginedgetracing;
begin
printdiagnostic(408, 155, true);
print(409);
printint(curwt);
printchar(41);
tracex := -4096
end; { beginedgetracing }
procedure traceacorner;
begin
if fileoffset > (maxprintline - 13) then
printnl(155);
printchar(40);
printint(tracex);
printchar(44);
printint(traceyy);
printchar(41);
tracey := traceyy
end;
procedure endedgetracing;
begin
if tracex = (-4096) then
printnl(410)
else begin
traceacorner;
printchar(46)
end;
enddiagnostic(true)
end; {:372} {373:}
procedure tracenewedge(r: halfword; n: integer);
var
d: integer;
w: -3..3;
m, n0, n1: integer;
begin
d := mem[r].hh.lh + 32768;
w := (d mod 8) - 4;
m := (d div 8) - mem[curedges + 3].hh.lh;
if w = curwt then begin
n0 := n + 1;
n1 := n
end else begin
n0 := n;
n1 := n + 1
end;
if m <> tracex then begin
if tracex = (-4096) then begin
printnl(155);
traceyy := n0
end else if traceyy <> n0 then
printchar(63)
else
traceacorner;
tracex := m;
traceacorner
end else begin
if n0 <> traceyy then
printchar(33);
if ((n0 < n1) and (tracey > traceyy)) or ((n0 > n1) and (tracey < traceyy)) then
traceacorner
end;
traceyy := n1
end; {:373} {374:}
procedure lineedges(x0, y0, x1, y1: scaled);
label
30, 31;
var
m0, n0, m1, n1: integer;
delx, dely: scaled;
yt: scaled;
tx: scaled;
p, r: halfword;
base: integer;
n: integer;
begin
n0 := roundunscaled(y0);
n1 := roundunscaled(y1);
if n0 <> n1 then begin
m0 := roundunscaled(x0);
m1 := roundunscaled(x1);
delx := x1 - x0;
dely := y1 - y0;
yt := (n0 * 65536) - 32768;
y0 := y0 - yt;
y1 := y1 - yt;
if n0 < n1 then begin {375:}
base := ((8 * mem[curedges + 3].hh.lh) - 32764) - curwt;
if m0 <= m1 then
edgeprep(m0, m1, n0, n1)
else
edgeprep(m1, m0, n0, n1); {377:}
n := mem[curedges + 5].hh.lh - 4096;
p := mem[curedges + 5].hh.rh;
if n <> n0 then
if n < n0 then
repeat
n := n + 1;
p := mem[p].hh.rh
until n = n0
else
repeat
n := n - 1;
p := mem[p].hh.lh
until n = n0 {:377};
y0 := 65536 - y0;
while true do begin
r := getavail;
mem[r].hh.rh := mem[p + 1].hh.lh;
mem[p + 1].hh.lh := r;
tx := takefraction(delx, makefraction(y0, dely));
if abvscd(delx, y0, dely, tx) < 0 then
tx := tx - 1;
mem[r].hh.lh := (8 * roundunscaled(x0 + tx)) + base;
y1 := y1 - 65536;
if internal[10] > 0 then
tracenewedge(r, n);
if y1 < 65536 then
goto 30;
p := mem[p].hh.rh;
y0 := y0 + 65536;
n := n + 1
end;
30: {:375}
end else begin {376:}
base := ((8 * mem[curedges + 3].hh.lh) - 32764) + curwt;
if m0 <= m1 then
edgeprep(m0, m1, n1, n0)
else
edgeprep(m1, m0, n1, n0);
n0 := n0 - 1;
{377:}
n := mem[curedges + 5].hh.lh - 4096;
p := mem[curedges + 5].hh.rh;
if n <> n0 then
if n < n0 then
repeat
n := n + 1;
p := mem[p].hh.rh
until n = n0
else
repeat
n := n - 1;
p := mem[p].hh.lh
until n = n0 {:377};
while true do begin
r := getavail;
mem[r].hh.rh := mem[p + 1].hh.lh;
mem[p + 1].hh.lh := r;
tx := takefraction(delx, makefraction(y0, dely));
if abvscd(delx, y0, dely, tx) < 0 then
tx := tx + 1;
mem[r].hh.lh := (8 * roundunscaled(x0 - tx)) + base;
y1 := y1 + 65536;
if internal[10] > 0 then
tracenewedge(r, n);
if y1 >= 0 then
goto 31;
p := mem[p].hh.lh;
y0 := y0 + 65536;
n := n - 1
end;
31: {:376}
end;
mem[curedges + 5].hh.rh := p;
mem[curedges + 5].hh.lh := n + 4096
end
end; {:374}
{378:}
procedure movetoedges(m0, n0, m1, n1: integer);
label
60, 61, 62, 63, 30;
var
delta: 0..movesize;
k: 0..movesize;
p, r: halfword;
dx: integer;
edgeandweight: integer;
j: integer;
n: integer; {sum:integer;}
{sum:=move[0];
for k:=1 to delta do sum:=sum+abs(move[k]);
if sum<>m1-m0 then confusion(48);}
begin
delta := n1 - n0;
{380:}
case octant of
1:
begin
dx := 8;
edgeprep(m0, m1, n0, n1);
goto 60
end;
5:
begin
dx := 8;
edgeprep(n0, n1, m0, m1);
goto 62
end;
6:
begin
dx := -8;
edgeprep(-n1, -n0, m0, m1);
n0 := -n0;
goto 62
end;
2:
begin
dx := -8;
edgeprep(-m1, -m0, n0, n1);
m0 := -m0;
goto 60
end;
4:
begin
dx := -8;
edgeprep(-m1, -m0, -n1, -n0);
m0 := -m0;
goto 61
end;
8:
begin
dx := -8;
edgeprep(-n1, -n0, -m1, -m0);
n0 := -n0;
goto 63
end;
7:
begin
dx := 8;
edgeprep(n0, n1, -m1, -m0);
goto 63
end;
3:
begin
dx := 8;
edgeprep(m0, m1, -n1, -n0);
goto 61
end
end; {:380}
60: {381:} {377:}
n := mem[curedges + 5].hh.lh - 4096;
p := mem[curedges + 5].hh.rh;
if n <> n0 then
if n < n0 then
repeat
n := n + 1;
p := mem[p].hh.rh
until n = n0
else
repeat
n := n - 1;
p := mem[p].hh.lh
until n = n0 {:377};
if delta > 0 then begin
k := 0;
edgeandweight := ((8 * (m0 + mem[curedges + 3].hh.lh)) - 32764) - curwt;
repeat
edgeandweight := edgeandweight + (dx * move[k]);
begin
r := avail;
if r = (-30000) then
r := getavail
else begin
avail := mem[r].hh.rh;
mem[r].hh.rh := -30000
end {dynused:=dynused+1;}
end;
mem[r].hh.rh := mem[p + 1].hh.lh;
mem[r].hh.lh := edgeandweight;
if internal[10] > 0 then
tracenewedge(r, n);
mem[p + 1].hh.lh := r;
p := mem[p].hh.rh;
k := k + 1;
n := n + 1
until k = delta
end;
goto 30 {:381};
61: {382:}
n0 := (-n0) - 1; {377:}
n := mem[curedges + 5].hh.lh - 4096;
p := mem[curedges + 5].hh.rh;
if n <> n0 then
if n < n0 then
repeat
n := n + 1;
p := mem[p].hh.rh
until n = n0
else
repeat
n := n - 1;
p := mem[p].hh.lh
until n = n0 {:377};
if delta > 0 then begin
k := 0;
edgeandweight := ((8 * (m0 + mem[curedges + 3].hh.lh)) - 32764) + curwt;
repeat
edgeandweight := edgeandweight + (dx * move[k]);
begin
r := avail;
if r = (-30000) then
r := getavail
else begin
avail := mem[r].hh.rh;
mem[r].hh.rh := -30000
end {dynused:=dynused+1;}
end;
mem[r].hh.rh := mem[p + 1].hh.lh;
mem[r].hh.lh := edgeandweight;
if internal[10] > 0 then
tracenewedge(r, n);
mem[p + 1].hh.lh := r;
p := mem[p].hh.lh;
k := k + 1;
n := n - 1
until k = delta
end;
goto 30 {:382};
62: {383:}
edgeandweight := ((8 * (n0 + mem[curedges + 3].hh.lh)) - 32764) - curwt;
n0 := m0;
k := 0;
{377:}
n := mem[curedges + 5].hh.lh - 4096;
p := mem[curedges + 5].hh.rh;
if n <> n0 then
if n < n0 then
repeat
n := n + 1;
p := mem[p].hh.rh
until n = n0
else
repeat
n := n - 1;
p := mem[p].hh.lh
until n = n0 {:377};
repeat
j := move[k];
while j > 0 do begin
begin
r := avail;
if r = (-30000) then
r := getavail
else begin
avail := mem[r].hh.rh;
mem[r].hh.rh := -30000
end {dynused:=dynused+1;}
end;
mem[r].hh.rh := mem[p + 1].hh.lh;
mem[r].hh.lh := edgeandweight;
if internal[10] > 0 then
tracenewedge(r, n);
mem[p + 1].hh.lh := r;
p := mem[p].hh.rh;
j := j - 1;
n := n + 1
end;
edgeandweight := edgeandweight + dx;
k := k + 1
until k > delta;
goto 30 {:383};
63: {384:}
edgeandweight := ((8 * (n0 + mem[curedges + 3].hh.lh)) - 32764) + curwt;
n0 := (-m0) - 1;
k := 0;
{377:}
n := mem[curedges + 5].hh.lh - 4096;
p := mem[curedges + 5].hh.rh;
if n <> n0 then
if n < n0 then
repeat
n := n + 1;
p := mem[p].hh.rh
until n = n0
else
repeat
n := n - 1;
p := mem[p].hh.lh
until n = n0 {:377};
repeat
j := move[k];
while j > 0 do begin
begin
r := avail;
if r = (-30000) then
r := getavail
else begin
avail := mem[r].hh.rh;
mem[r].hh.rh := -30000
end {dynused:=dynused+1;}
end;
mem[r].hh.rh := mem[p + 1].hh.lh;
mem[r].hh.lh := edgeandweight;
if internal[10] > 0 then
tracenewedge(r, n);
mem[p + 1].hh.lh := r;
p := mem[p].hh.lh;
j := j - 1;
n := n - 1
end;
edgeandweight := edgeandweight + dx;
k := k + 1
until k > delta;
goto 30 {:384};
30:
mem[curedges + 5].hh.lh := n + 4096;
mem[curedges + 5].hh.rh := p
end; {:378} {387:}
procedure skew(x, y: scaled; octant: smallnumber);
begin
case octant of
1:
begin
curx := x - y;
cury := y
end;
5:
begin
curx := y - x;
cury := x
end;
6:
begin
curx := y + x;
cury := -x
end;
2:
begin
curx := (-x) - y;
cury := y
end;
4:
begin
curx := (-x) + y;
cury := -y
end;
8:
begin
curx := (-y) + x;
cury := -x
end;
7:
begin
curx := (-y) - x;
cury := x
end;
3:
begin
curx := x + y;
cury := -y
end
end
end; {:387} {390:}
procedure abnegate(x, y: scaled; octantbefore, octantafter: smallnumber);
begin
if odd(octantbefore) = odd(octantafter) then
curx := x
else
curx := -x;
if (octantbefore > 2) = (octantafter > 2) then
cury := y
else
cury := -y
end; {:390}
{391:}
function crossingpoint(a, b, c: integer): fraction;
label
10;
var
d: integer;
x, xx, x0, x1, x2: integer;
begin
if a < 0 then begin
crossingpoint := 0;
goto 10
end;
if c >= 0 then begin
if b >= 0 then
if c > 0 then begin
crossingpoint := 268435457;
goto 10
end else if (a = 0) and (b = 0) then begin
crossingpoint := 268435457;
goto 10
end else begin
crossingpoint := 268435456;
goto 10
end;
if a = 0 then begin
crossingpoint := 0;
goto 10
end
end else if a = 0 then
if b <= 0 then begin
crossingpoint := 0;
goto 10
end;
{392:}
d := 1;
x0 := a;
x1 := a - b;
x2 := b - c;
repeat
x := (x1 + x2) div 2;
if (x1 - x0) > x0 then begin
x2 := x;
x0 := x0 + x0;
d := d + d
end else begin
xx := (x1 + x) - x0;
if xx > x0 then begin
x2 := x;
x0 := x0 + x0;
d := d + d
end else begin
x0 := x0 - xx;
if x <= x0 then
if (x + x2) <= x0 then begin
crossingpoint := 268435457;
goto 10
end;
x1 := x;
d := (d + d) + 1
end
end
until d >= 268435456;
crossingpoint := d - 268435456 {:392};
10:
end; {:391} {394:}
procedure printspec(s: strnumber);
label
45, 30;
var
p, q: halfword;
octant: smallnumber;
begin
printdiagnostic(411, s, true);
p := curspec;
octant := mem[p + 3].int;
println;
unskew(mem[curspec + 1].int, mem[curspec + 2].int, octant);
printtwo(curx, cury);
print(412);
while true do begin
print(octantdir[octant]);
printchar(39);
while true do begin
q := mem[p].hh.rh;
if mem[p].hh.b1 = 0 then
goto 45;
{397:}
begin
printnl(423);
unskew(mem[p + 5].int, mem[p + 6].int, octant);
printtwo(curx, cury);
print(390);
unskew(mem[q + 3].int, mem[q + 4].int, octant);
printtwo(curx, cury);
printnl(387);
unskew(mem[q + 1].int, mem[q + 2].int, octant);
printtwo(curx, cury);
print(424);
printint(mem[q].hh.b0 - 1)
end {:397};
p := q
end;
45:
if q = curspec then
goto 30;
p := q;
octant := mem[p + 3].int;
printnl(413)
end;
30:
printnl(414);
enddiagnostic(true)
end; {:394} {398:}
procedure printstrange(s: strnumber);
var
p: halfword;
f: halfword;
q: halfword;
t: integer;
begin
if interaction = 3 then
;
printnl(62); {399:}
p := curspec;
t := 128;
repeat
p := mem[p].hh.rh;
if mem[p].hh.b0 <> 0 then begin
if mem[p].hh.b0 < t then
f := p;
t := mem[p].hh.b0
end
until p = curspec {:399}; {400:}
p := curspec;
q := p;
repeat
p := mem[p].hh.rh;
if mem[p].hh.b0 = 0 then
q := p
until p = f {:400};
t := 0;
repeat
if mem[p].hh.b0 <> 0 then begin
if mem[p].hh.b0 <> t then begin
t := mem[p].hh.b0;
printchar(32);
printint(t - 1)
end;
if q <> (-30000) then begin {401:}
if mem[mem[q].hh.rh].hh.b0 = 0 then begin
print(425);
print(octantdir[mem[q + 3].int]);
q := mem[q].hh.rh;
while mem[mem[q].hh.rh].hh.b0 = 0 do begin
printchar(32);
print(octantdir[mem[q + 3].int]);
q := mem[q].hh.rh
end;
printchar(41)
end {:401};
printchar(32);
print(octantdir[mem[q + 3].int]);
q := -30000
end
end else if q = (-30000) then
q := p;
p := mem[p].hh.rh
until p = f;
printchar(32);
printint(mem[p].hh.b0 - 1);
if q <> (-30000) then {401:}
if mem[mem[q].hh.rh].hh.b0 = 0 then begin
print(425);
print(octantdir[mem[q + 3].int]);
q := mem[q].hh.rh;
while mem[mem[q].hh.rh].hh.b0 = 0 do begin
printchar(32);
print(octantdir[mem[q + 3].int]);
q := mem[q].hh.rh
end;
printchar(41)
end {:401};
begin
if interaction = 3 then
;
printnl(133);
print(s)
end
end; { printstrange }
{:398}
{402:}
{405:}
procedure removecubic(p: halfword);
var
q: halfword;
begin
q := mem[p].hh.rh;
mem[p].hh.b1 := mem[q].hh.b1;
mem[p].hh.rh := mem[q].hh.rh;
mem[p + 1].int := mem[q + 1].int;
mem[p + 2].int := mem[q + 2].int;
mem[p + 5].int := mem[q + 5].int;
mem[p + 6].int := mem[q + 6].int;
freenode(q, 7)
end; {:405} {406:} {410:}
procedure splitcubic(p: halfword; t: fraction; xq, yq: scaled);
var
v: scaled;
q, r: halfword;
begin
q := mem[p].hh.rh;
r := getnode(7);
mem[p].hh.rh := r;
mem[r].hh.rh := q;
mem[r].hh.b0 := mem[q].hh.b0;
mem[r].hh.b1 := mem[p].hh.b1;
v := mem[p + 5].int - takefraction(mem[p + 5].int - mem[q + 3].int, t);
mem[p + 5].int := mem[p + 1].int - takefraction(mem[p + 1].int - mem[p + 5].int, t);
mem[q + 3].int := mem[q + 3].int - takefraction(mem[q + 3].int - xq, t);
mem[r + 3].int := mem[p + 5].int - takefraction(mem[p + 5].int - v, t);
mem[r + 5].int := v - takefraction(v - mem[q + 3].int, t);
mem[r + 1].int := mem[r + 3].int - takefraction(mem[r + 3].int - mem[r + 5].int, t);
v := mem[p + 6].int - takefraction(mem[p + 6].int - mem[q + 4].int, t);
mem[p + 6].int := mem[p + 2].int - takefraction(mem[p + 2].int - mem[p + 6].int, t);
mem[q + 4].int := mem[q + 4].int - takefraction(mem[q + 4].int - yq, t);
mem[r + 4].int := mem[p + 6].int - takefraction(mem[p + 6].int - v, t);
mem[r + 6].int := v - takefraction(v - mem[q + 4].int, t);
mem[r + 2].int := mem[r + 4].int - takefraction(mem[r + 4].int - mem[r + 6].int, t)
end; {:410}
procedure quadrantsubdivide;
label
22, 10;
var
p, q, r, s, pp, qq: halfword;
firstx, firsty: scaled;
del1, del2, del3, del, dmax: scaled;
t: fraction;
destx, desty: scaled;
constantx: boolean;
begin
p := curspec;
firstx := mem[curspec + 1].int;
firsty := mem[curspec + 2].int;
repeat
22:
q := mem[p].hh.rh; {407:}
if q = curspec then begin
destx := firstx;
desty := firsty
end else begin
destx := mem[q + 1].int;
desty := mem[q + 2].int
end;
del1 := mem[p + 5].int - mem[p + 1].int;
del2 := mem[q + 3].int - mem[p + 5].int;
del3 := destx - mem[q + 3].int; {408:}
if del1 <> 0 then
del := del1
else if del2 <> 0 then
del := del2
else
del := del3;
if del <> 0 then begin
dmax := abs(del1);
if abs(del2) > dmax then
dmax := abs(del2);
if abs(del3) > dmax then
dmax := abs(del3);
while dmax < 134217728 do begin
dmax := dmax + dmax;
del1 := del1 + del1;
del2 := del2 + del2;
del3 := del3 + del3
end
end {:408};
if del = 0 then
constantx := true
else begin
constantx := false;
if del < 0 then begin {409:}
mem[p + 1].int := -mem[p + 1].int;
mem[p + 5].int := -mem[p + 5].int;
mem[q + 3].int := -mem[q + 3].int;
del1 := -del1;
del2 := -del2;
del3 := -del3;
destx := -destx;
mem[p].hh.b1 := 2
end {:409};
t := crossingpoint(del1, del2, del3);
if t < 268435456 then begin {411:}
splitcubic(p, t, destx, desty);
r := mem[p].hh.rh;
if mem[r].hh.b1 > 1 then
mem[r].hh.b1 := 1
else
mem[r].hh.b1 := 2;
if mem[r + 1].int < mem[p + 1].int then
mem[r + 1].int := mem[p + 1].int;
mem[r + 3].int := mem[r + 1].int;
mem[r + 1].int := -mem[r + 1].int;
mem[r + 5].int := mem[r + 1].int;
mem[q + 3].int := -mem[q + 3].int;
destx := -destx;
del2 := del2 - takefraction(del2 - del3, t);
if del2 > 0 then
del2 := 0;
t := crossingpoint(0, -del2, -del3);
if t < 268435456 then begin {412:}
splitcubic(r, t, destx, desty);
s := mem[r].hh.rh;
if mem[s + 1].int < destx then
mem[s + 1].int := destx;
if mem[s + 1].int < mem[r + 1].int then
mem[s + 1].int := mem[r + 1].int;
mem[s].hh.b1 := mem[p].hh.b1;
mem[s + 3].int := mem[s + 1].int;
mem[s + 1].int := -mem[s + 1].int;
mem[s + 5].int := mem[s + 1].int;
mem[q + 3].int := -mem[q + 3].int
end else if mem[r + 1].int > destx then {:412}
mem[r + 1].int := destx
end {:411}
end {:407};
{413:}
pp := p;
repeat
qq := mem[pp].hh.rh;
abnegate(mem[qq + 1].int, mem[qq + 2].int, mem[qq].hh.b1, mem[pp].hh.b1);
destx := curx;
desty := cury;
del1 := mem[pp + 6].int - mem[pp + 2].int;
del2 := mem[qq + 4].int - mem[pp + 6].int;
del3 := desty - mem[qq + 4].int; {408:}
if del1 <> 0 then
del := del1
else if del2 <> 0 then
del := del2
else
del := del3;
if del <> 0 then begin
dmax := abs(del1);
if abs(del2) > dmax then
dmax := abs(del2);
if abs(del3) > dmax then
dmax := abs(del3);
while dmax < 134217728 do begin
dmax := dmax + dmax;
del1 := del1 + del1;
del2 := del2 + del2;
del3 := del3 + del3
end
end {:408};
if del <> 0 then begin
if del < 0 then begin {414:}
mem[pp + 2].int := -mem[pp + 2].int;
mem[pp + 6].int := -mem[pp + 6].int;
mem[qq + 4].int := -mem[qq + 4].int;
del1 := -del1;
del2 := -del2;
del3 := -del3;
desty := -desty;
mem[pp].hh.b1 := mem[pp].hh.b1 + 2
end {:414};
t := crossingpoint(del1, del2, del3);
if t < 268435456 then begin {415:}
splitcubic(pp, t, destx, desty);
r := mem[pp].hh.rh;
if mem[r].hh.b1 > 2 then
mem[r].hh.b1 := mem[r].hh.b1 - 2
else
mem[r].hh.b1 := mem[r].hh.b1 + 2;
if mem[r + 1].int > destx then
mem[r + 1].int := destx
else if mem[r + 1].int < mem[pp + 1].int then
mem[r + 1].int := mem[pp + 1].int;
if mem[r + 2].int < mem[pp + 2].int then
mem[r + 2].int := mem[pp + 2].int;
mem[r + 4].int := mem[r + 2].int;
mem[r + 2].int := -mem[r + 2].int;
mem[r + 6].int := mem[r + 2].int;
mem[qq + 4].int := -mem[qq + 4].int;
desty := -desty;
del2 := del2 - takefraction(del2 - del3, t);
if del2 > 0 then
del2 := 0;
t := crossingpoint(0, -del2, -del3);
if t < 268435456 then begin {416:}
splitcubic(r, t, destx, desty);
s := mem[r].hh.rh;
if mem[s + 1].int > destx then
mem[s + 1].int := destx
else if mem[s + 1].int < mem[r + 1].int then
mem[s + 1].int := mem[r + 1].int;
if mem[s + 2].int < desty then
mem[s + 2].int := desty;
if mem[s + 2].int < mem[r + 2].int then
mem[s + 2].int := mem[r + 2].int;
mem[s].hh.b1 := mem[pp].hh.b1;
mem[s + 4].int := mem[s + 2].int;
mem[s + 2].int := -mem[s + 2].int;
mem[s + 6].int := mem[s + 2].int;
mem[qq + 4].int := -mem[qq + 4].int
end else if mem[r + 2].int > desty then {:416}
mem[r + 2].int := desty
end {:415}
end else if constantx then begin {417:}
if q <> p then begin
removecubic(p);
if curspec <> q then
goto 22
else begin
curspec := p;
goto 10
end
end
end else if not odd(mem[pp].hh.b1) then begin {414:}
mem[pp + 2].int := -mem[pp + 2].int;
mem[pp + 6].int := -mem[pp + 6].int;
mem[qq + 4].int := -mem[qq + 4].int;
del1 := -del1;
del2 := -del2;
del3 := -del3;
desty := -desty;
mem[pp].hh.b1 := mem[pp].hh.b1 + 2
end {:414} {:417};
pp := qq
until pp = q;
if constantx then begin {418:}
pp := p;
repeat
qq := mem[pp].hh.rh;
if mem[pp].hh.b1 > 2 then begin
mem[pp].hh.b1 := mem[pp].hh.b1 + 1;
mem[pp + 1].int := -mem[pp + 1].int;
mem[pp + 5].int := -mem[pp + 5].int;
mem[qq + 3].int := -mem[qq + 3].int
end;
pp := qq
until pp = q
end {:418} {:413};
p := q
until p = curspec;
10:
end; {:406} {419:}
procedure octantsubdivide;
var
p, q, r, s: halfword;
del1, del2, del3, del, dmax: scaled;
t: fraction;
destx, desty: scaled;
begin
p := curspec;
repeat
q := mem[p].hh.rh;
mem[p + 1].int := mem[p + 1].int - mem[p + 2].int;
mem[p + 5].int := mem[p + 5].int - mem[p + 6].int;
mem[q + 3].int := mem[q + 3].int - mem[q + 4].int; {420:} {421:}
if q = curspec then begin
unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
skew(curx, cury, mem[p].hh.b1);
destx := curx;
desty := cury
end else begin
abnegate(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1, mem[p].hh.b1);
destx := curx - cury;
desty := cury
end;
del1 := mem[p + 5].int - mem[p + 1].int;
del2 := mem[q + 3].int - mem[p + 5].int;
del3 := destx - mem[q + 3].int {:421}; {408:}
if del1 <> 0 then
del := del1
else if del2 <> 0 then
del := del2
else
del := del3;
if del <> 0 then begin
dmax := abs(del1);
if abs(del2) > dmax then
dmax := abs(del2);
if abs(del3) > dmax then
dmax := abs(del3);
while dmax < 134217728 do begin
dmax := dmax + dmax;
del1 := del1 + del1;
del2 := del2 + del2;
del3 := del3 + del3
end
end {:408};
if del <> 0 then begin
if del < 0 then begin {423:}
mem[p + 2].int := mem[p + 1].int + mem[p + 2].int;
mem[p + 1].int := -mem[p + 1].int;
mem[p + 6].int := mem[p + 5].int + mem[p + 6].int;
mem[p + 5].int := -mem[p + 5].int;
mem[q + 4].int := mem[q + 3].int + mem[q + 4].int;
mem[q + 3].int := -mem[q + 3].int;
del1 := -del1;
del2 := -del2;
del3 := -del3;
desty := destx + desty;
destx := -destx;
mem[p].hh.b1 := mem[p].hh.b1 + 4
end {:423};
t := crossingpoint(del1, del2, del3);
if t < 268435456 then begin {424:}
splitcubic(p, t, destx, desty);
r := mem[p].hh.rh;
if mem[r].hh.b1 > 4 then
mem[r].hh.b1 := mem[r].hh.b1 - 4
else
mem[r].hh.b1 := mem[r].hh.b1 + 4;
if mem[r + 2].int > desty then
mem[r + 2].int := desty
else if mem[r + 2].int < mem[p + 2].int then
mem[r + 2].int := mem[p + 2].int;
if mem[r + 1].int < mem[p + 1].int then
mem[r + 1].int := mem[p + 1].int;
mem[r + 3].int := mem[r + 1].int;
mem[r + 2].int := mem[r + 2].int + mem[r + 1].int;
mem[r + 1].int := -mem[r + 1].int;
mem[r + 5].int := mem[r + 1].int;
mem[r + 6].int := mem[r + 6].int - mem[r + 5].int;
mem[q + 4].int := mem[q + 4].int + mem[q + 3].int;
mem[q + 3].int := -mem[q + 3].int;
desty := desty + destx;
destx := -destx;
del2 := del2 - takefraction(del2 - del3, t);
if del2 > 0 then
del2 := 0;
t := crossingpoint(0, -del2, -del3);
if t < 268435456 then begin {425:}
splitcubic(r, t, destx, desty);
s := mem[r].hh.rh;
if mem[s + 2].int > desty then
mem[s + 2].int := desty
else if mem[s + 2].int < mem[r + 2].int then
mem[s + 2].int := mem[r + 2].int;
if mem[s + 1].int < destx then
mem[s + 1].int := destx;
if mem[s + 1].int < mem[r + 1].int then
mem[s + 1].int := mem[r + 1].int;
mem[s].hh.b1 := mem[p].hh.b1;
mem[s + 3].int := mem[s + 1].int;
mem[s + 2].int := mem[s + 2].int + mem[s + 1].int;
mem[s + 1].int := -mem[s + 1].int;
mem[s + 6].int := mem[s + 6].int - mem[s + 1].int;
mem[s + 5].int := mem[s + 1].int;
mem[q + 4].int := mem[q + 4].int + mem[q + 3].int;
mem[q + 3].int := -mem[q + 3].int
end else if mem[r + 1].int > destx then {:425}
mem[r + 1].int := destx {:424}
end
end {:420};
p := q
until p = curspec
end; {:419} {426:}
procedure makesafe;
var
k: 0..maxwiggle;
allsafe: boolean;
nexta: scaled;
deltaa, deltab: scaled;
begin
before[curroundingptr] := before[0];
nodetoround[curroundingptr] := nodetoround[0];
repeat
after[curroundingptr] := after[0];
allsafe := true;
nexta := after[0];
for k := 0 to curroundingptr - 1 do begin
deltab := before[k + 1] - before[k];
if deltab >= 0 then
deltaa := after[k + 1] - nexta
else
deltaa := nexta - after[k + 1];
nexta := after[k + 1];
if (deltaa < 0) or (deltaa > abs(deltab + deltab)) then begin
allsafe := false;
after[k] := before[k];
if k = (curroundingptr - 1) then
after[0] := before[0]
else
after[k + 1] := before[k + 1]
end
end
until allsafe
end; {:426} {429:}
procedure beforeandafter(b, a: scaled; p: halfword);
begin
if curroundingptr = maxroundingptr then
if maxroundingptr < maxwiggle then
maxroundingptr := maxroundingptr + 1
else
overflow(435, maxwiggle);
after[curroundingptr] := a;
before[curroundingptr] := b;
nodetoround[curroundingptr] := p;
curroundingptr := curroundingptr + 1
end; { beforeandafter }
{:429}
{431:}
function goodval(b, o: scaled): scaled;
var
a: scaled;
begin
a := b + o;
if a >= 0 then
a := (a - (a mod curgran)) - o
else
a := (((a + ((-(a + 1)) mod curgran)) - curgran) + 1) - o;
if (b - a) < ((a + curgran) - b) then
goodval := a
else
goodval := a + curgran
end; {:431} {432:}
function compromise(u, v: scaled): scaled;
begin
compromise := goodval(u + u, (-u) - v) div 2
end; {:432} {433:}
procedure xyround;
var
p, q: halfword;
b, a: scaled;
penedge: scaled;
alpha: fraction;
begin
curgran := abs(internal[37]);
if curgran = 0 then
curgran := 65536;
p := curspec;
curroundingptr := 0;
repeat
q := mem[p].hh.rh; {434:}
if odd(mem[p].hh.b1) <> odd(mem[q].hh.b1) then begin
if odd(mem[q].hh.b1) then
b := mem[q + 1].int
else
b := -mem[q + 1].int;
if (abs(mem[q + 1].int - mem[q + 5].int) < 655) or (abs(mem[q + 1].int + mem[q + 3].int) < 655) then begin {435:}
if curpen = (-29997) then
penedge := 0
else if curpathtype = 0 then
penedge := compromise(mem[mem[curpen + 5].hh.rh + 2].int, mem[mem[curpen + 7].hh.rh + 2].int)
else if odd(mem[q].hh.b1) then
penedge := mem[mem[curpen + 7].hh.rh + 2].int
else
penedge := mem[mem[curpen + 5].hh.rh + 2].int;
a := goodval(b, penedge)
end else {:435}
a := b;
if abs(a) > maxallowed then
if a > 0 then
a := maxallowed
else
a := -maxallowed;
beforeandafter(b, a, q)
end {:434};
p := q
until p = curspec;
if curroundingptr > 0 then begin {436:}
makesafe;
repeat
curroundingptr := curroundingptr - 1;
if (after[curroundingptr] <> before[curroundingptr]) or (after[curroundingptr + 1] <> before[curroundingptr + 1]) then begin
p := nodetoround[curroundingptr];
if odd(mem[p].hh.b1) then begin
b := before[curroundingptr];
a := after[curroundingptr]
end else begin
b := -before[curroundingptr];
a := -after[curroundingptr]
end;
if before[curroundingptr] = before[curroundingptr + 1] then
alpha := 268435456
else
alpha := makefraction(after[curroundingptr + 1] - after[curroundingptr], before[curroundingptr + 1] - before[curroundingptr]);
repeat
mem[p + 1].int := takefraction(alpha, mem[p + 1].int - b) + a;
mem[p + 5].int := takefraction(alpha, mem[p + 5].int - b) + a;
p := mem[p].hh.rh;
mem[p + 3].int := takefraction(alpha, mem[p + 3].int - b) + a
until p = nodetoround[curroundingptr + 1]
end
until curroundingptr = 0
end {:436};
p := curspec;
curroundingptr := 0;
repeat
q := mem[p].hh.rh; {437:}
if (mem[p].hh.b1 > 2) <> (mem[q].hh.b1 > 2) then begin
if mem[q].hh.b1 <= 2 then
b := mem[q + 2].int
else
b := -mem[q + 2].int;
if (abs(mem[q + 2].int - mem[q + 6].int) < 655) or (abs(mem[q + 2].int + mem[q + 4].int) < 655) then begin {438:}
if curpen = (-29997) then
penedge := 0
else if curpathtype = 0 then
penedge := compromise(mem[mem[curpen + 2].hh.rh + 2].int, mem[mem[curpen + 1].hh.rh + 2].int)
else if mem[q].hh.b1 <= 2 then
penedge := mem[mem[curpen + 1].hh.rh + 2].int
else
penedge := mem[mem[curpen + 2].hh.rh + 2].int;
a := goodval(b, penedge)
end else {:438}
a := b;
if abs(a) > maxallowed then
if a > 0 then
a := maxallowed
else
a := -maxallowed;
beforeandafter(b, a, q)
end {:437};
p := q
until p = curspec;
if curroundingptr > 0 then begin {439:}
makesafe;
repeat
curroundingptr := curroundingptr - 1;
if (after[curroundingptr] <> before[curroundingptr]) or (after[curroundingptr + 1] <> before[curroundingptr + 1]) then begin
p := nodetoround[curroundingptr];
if mem[p].hh.b1 <= 2 then begin
b := before[curroundingptr];
a := after[curroundingptr]
end else begin
b := -before[curroundingptr];
a := -after[curroundingptr]
end;
if before[curroundingptr] = before[curroundingptr + 1] then
alpha := 268435456
else
alpha := makefraction(after[curroundingptr + 1] - after[curroundingptr], before[curroundingptr + 1] - before[curroundingptr]);
repeat
mem[p + 2].int := takefraction(alpha, mem[p + 2].int - b) + a;
mem[p + 6].int := takefraction(alpha, mem[p + 6].int - b) + a;
p := mem[p].hh.rh;
mem[p + 4].int := takefraction(alpha, mem[p + 4].int - b) + a
until p = nodetoround[curroundingptr + 1]
end
until curroundingptr = 0
end {:439}
end; {:433} {440:}
procedure diaground;
var
p, q, pp: halfword;
b, a, bb, aa, d, c, dd, cc: scaled;
penedge: scaled;
alpha, beta: fraction;
nexta: scaled;
allsafe: boolean;
k: 0..maxwiggle;
firstx, firsty: scaled;
begin
p := curspec;
curroundingptr := 0;
repeat
q := mem[p].hh.rh; {441:}
if mem[p].hh.b1 <> mem[q].hh.b1 then begin
if mem[q].hh.b1 > 4 then
b := -mem[q + 1].int
else
b := mem[q + 1].int;
if abs(mem[q].hh.b1 - mem[p].hh.b1) = 4 then
if (abs(mem[q + 1].int - mem[q + 5].int) < 655) or (abs(mem[q + 1].int + mem[q + 3].int) < 655) then begin {442:}
if curpen = (-29997) then
penedge := 0
else if curpathtype = 0 then {443:}
case mem[q].hh.b1 of
1, 5:
penedge := compromise(mem[mem[mem[curpen + 1].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 4].hh.rh].hh.lh + 1].int);
4, 8:
penedge := -compromise(mem[mem[mem[curpen + 1].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 4].hh.rh].hh.lh + 1].int);
6, 2:
penedge := compromise(mem[mem[mem[curpen + 2].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 3].hh.rh].hh.lh + 1].int);
7, 3:
penedge := -compromise(mem[mem[mem[curpen + 2].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 3].hh.rh].hh.lh + 1].int)
end {:443}
else if mem[q].hh.b1 <= 4 then
penedge := mem[mem[mem[curpen + mem[q].hh.b1].hh.rh].hh.lh + 1].int
else
penedge := -mem[mem[mem[curpen + mem[q].hh.b1].hh.rh].hh.lh + 1].int;
if odd(mem[q].hh.b1) then
a := goodval(b, penedge + (curgran div 2))
else
a := goodval(b - 1, penedge + (curgran div 2))
end else {:442}
a := b
else
a := b;
beforeandafter(b, a, q)
end {:441};
p := q
until p = curspec;
if curroundingptr > 0 then begin {444:}
p := nodetoround[0];
firstx := mem[p + 1].int;
firsty := mem[p + 2].int; {446:}
before[curroundingptr] := before[0];
nodetoround[curroundingptr] := nodetoround[0];
repeat
after[curroundingptr] := after[0];
allsafe := true;
nexta := after[0];
for k := 0 to curroundingptr - 1 do begin
a := nexta;
b := before[k];
nexta := after[k + 1];
aa := nexta;
bb := before[k + 1];
if (a <> b) or (aa <> bb) then begin
p := nodetoround[k];
pp := nodetoround[k + 1];
{445:}
if aa = bb then begin
if pp = nodetoround[0] then
unskew(firstx, firsty, mem[pp].hh.b1)
else
unskew(mem[pp + 1].int, mem[pp + 2].int, mem[pp].hh.b1);
skew(curx, cury, mem[p].hh.b1);
bb := curx;
aa := bb;
dd := cury;
cc := dd;
if mem[p].hh.b1 > 4 then begin
b := -b;
a := -a
end
end else begin
if mem[p].hh.b1 > 4 then begin
bb := -bb;
aa := -aa;
b := -b;
a := -a
end;
if pp = nodetoround[0] then
dd := firsty - bb
else
dd := mem[pp + 2].int - bb;
if odd(aa - bb) then
if mem[p].hh.b1 > 4 then
cc := dd - (((aa - bb) + 1) div 2)
else
cc := dd - (((aa - bb) - 1) div 2)
else
cc := dd - ((aa - bb) div 2)
end;
d := mem[p + 2].int;
if odd(a - b) then
if mem[p].hh.b1 > 4 then
c := d - (((a - b) - 1) div 2)
else
c := d - (((a - b) + 1) div 2)
else
c := d - ((a - b) div 2) {:445};
if (((aa < a) or (cc < c)) or ((aa - a) > (2 * (bb - b)))) or ((cc - c) > (2 * (dd - d))) then begin
allsafe := false;
after[k] := before[k];
if k = (curroundingptr - 1) then
after[0] := before[0]
else
after[k + 1] := before[k + 1]
end
end
end
until allsafe {:446};
for k := 0 to curroundingptr - 1 do begin
a := after[k];
b := before[k];
aa := after[k + 1];
bb := before[k + 1];
if (a <> b) or (aa <> bb) then begin
p := nodetoround[k];
pp := nodetoround[k + 1];
{445:}
if aa = bb then begin
if pp = nodetoround[0] then
unskew(firstx, firsty, mem[pp].hh.b1)
else
unskew(mem[pp + 1].int, mem[pp + 2].int, mem[pp].hh.b1);
skew(curx, cury, mem[p].hh.b1);
bb := curx;
aa := bb;
dd := cury;
cc := dd;
if mem[p].hh.b1 > 4 then begin
b := -b;
a := -a
end
end else begin
if mem[p].hh.b1 > 4 then begin
bb := -bb;
aa := -aa;
b := -b;
a := -a
end;
if pp = nodetoround[0] then
dd := firsty - bb
else
dd := mem[pp + 2].int - bb;
if odd(aa - bb) then
if mem[p].hh.b1 > 4 then
cc := dd - (((aa - bb) + 1) div 2)
else
cc := dd - (((aa - bb) - 1) div 2)
else
cc := dd - ((aa - bb) div 2)
end;
d := mem[p + 2].int;
if odd(a - b) then
if mem[p].hh.b1 > 4 then
c := d - (((a - b) - 1) div 2)
else
c := d - (((a - b) + 1) div 2)
else
c := d - ((a - b) div 2) {:445};
if b = bb then
alpha := 268435456
else
alpha := makefraction(aa - a, bb - b);
if d = dd then
beta := 268435456
else
beta := makefraction(cc - c, dd - d);
repeat
mem[p + 1].int := takefraction(alpha, mem[p + 1].int - b) + a;
mem[p + 2].int := takefraction(beta, mem[p + 2].int - d) + c;
mem[p + 5].int := takefraction(alpha, mem[p + 5].int - b) + a;
mem[p + 6].int := takefraction(beta, mem[p + 6].int - d) + c;
p := mem[p].hh.rh;
mem[p + 3].int := takefraction(alpha, mem[p + 3].int - b) + a;
mem[p + 4].int := takefraction(beta, mem[p + 4].int - d) + c
until p = pp
end
end
end {:444}
end; {:440} {451:}
procedure newboundary(p: halfword; octant: smallnumber);
var
q, r: halfword;
begin
q := mem[p].hh.rh;
r := getnode(7);
mem[r].hh.rh := q;
mem[p].hh.rh := r;
mem[r].hh.b0 := mem[q].hh.b0;
mem[r + 3].int := mem[q + 3].int;
mem[r + 4].int := mem[q + 4].int;
mem[r].hh.b1 := 0;
mem[q].hh.b0 := 0;
mem[r + 5].int := octant;
mem[q + 3].int := mem[q].hh.b1;
unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
skew(curx, cury, octant);
mem[r + 1].int := curx;
mem[r + 2].int := cury
end; {:451}
function makespec(h: halfword; safetymargin: scaled; tracing: integer): halfword;
label
22, 30;
var
p, q, r, s: halfword;
k: integer;
chopped: boolean; {453:}
o1, o2: smallnumber;
clockwise: boolean;
dx1, dy1, dx2, dy2: integer;
dmax, del: integer; {:453}
begin
curspec := h;
if tracing > 0 then
printpath(curspec, 426, true);
maxallowed := 268402687 - safetymargin; {404:}
p := curspec;
k := 1;
chopped := false;
repeat
if abs(mem[p + 3].int) > maxallowed then begin
chopped := true;
if mem[p + 3].int > 0 then
mem[p + 3].int := maxallowed
else
mem[p + 3].int := -maxallowed
end;
if abs(mem[p + 4].int) > maxallowed then begin
chopped := true;
if mem[p + 4].int > 0 then
mem[p + 4].int := maxallowed
else
mem[p + 4].int := -maxallowed
end;
if abs(mem[p + 1].int) > maxallowed then begin
chopped := true;
if mem[p + 1].int > 0 then
mem[p + 1].int := maxallowed
else
mem[p + 1].int := -maxallowed
end;
if abs(mem[p + 2].int) > maxallowed then begin
chopped := true;
if mem[p + 2].int > 0 then
mem[p + 2].int := maxallowed
else
mem[p + 2].int := -maxallowed
end;
if abs(mem[p + 5].int) > maxallowed then begin
chopped := true;
if mem[p + 5].int > 0 then
mem[p + 5].int := maxallowed
else
mem[p + 5].int := -maxallowed
end;
if abs(mem[p + 6].int) > maxallowed then begin
chopped := true;
if mem[p + 6].int > 0 then
mem[p + 6].int := maxallowed
else
mem[p + 6].int := -maxallowed
end;
p := mem[p].hh.rh;
mem[p].hh.b0 := k;
if k < 127 then
k := k + 1
else
k := 1
until p = curspec;
if chopped then begin
begin
if interaction = 3 then
;
printnl(133);
print(430)
end;
begin
helpptr := 4;
helpline[3] := 431;
helpline[2] := 432;
helpline[1] := 433;
helpline[0] := 434
end;
putgeterror
end {:404};
quadrantsubdivide;
if internal[36] > 0 then
xyround;
octantsubdivide;
if internal[36] > 65536 then
diaground; {447:}
p := curspec;
repeat
22:
q := mem[p].hh.rh;
if p <> q then begin
if mem[p + 1].int = mem[p + 5].int then
if mem[p + 2].int = mem[p + 6].int then
if mem[p + 1].int = mem[q + 3].int then
if mem[p + 2].int = mem[q + 4].int then begin
unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
skew(curx, cury, mem[p].hh.b1);
if mem[p + 1].int = curx then
if mem[p + 2].int = cury then begin
removecubic(p);
if q <> curspec then
goto 22;
curspec := p;
q := p
end
end
end;
p := q
until p = curspec; {:447} {450:}
turningnumber := 0;
p := curspec;
q := mem[p].hh.rh;
repeat
r := mem[q].hh.rh;
if (mem[p].hh.b1 <> mem[q].hh.b1) or (q = r) then begin {452:}
newboundary(p, mem[p].hh.b1);
s := mem[p].hh.rh;
o1 := octantnumber[mem[p].hh.b1];
o2 := octantnumber[mem[q].hh.b1];
case o2 - o1 of
1, -7, 7, -1:
goto 30;
2, -6:
clockwise := false;
3, -5, 4, -4, 5, -3:
begin {454:} {457:}
dx1 := mem[s + 1].int - mem[s + 3].int;
dy1 := mem[s + 2].int - mem[s + 4].int;
if dx1 = 0 then
if dy1 = 0 then begin
dx1 := mem[s + 1].int - mem[p + 5].int;
dy1 := mem[s + 2].int - mem[p + 6].int;
if dx1 = 0 then
if dy1 = 0 then begin
dx1 := mem[s + 1].int - mem[p + 1].int;
dy1 := mem[s + 2].int - mem[p + 2].int
end
end;
dmax := abs(dx1);
if abs(dy1) > dmax then
dmax := abs(dy1);
while dmax < 268435456 do begin
dmax := dmax + dmax;
dx1 := dx1 + dx1;
dy1 := dy1 + dy1
end;
dx2 := mem[q + 5].int - mem[q + 1].int;
dy2 := mem[q + 6].int - mem[q + 2].int;
if dx2 = 0 then
if dy2 = 0 then begin
dx2 := mem[r + 3].int - mem[q + 1].int;
dy2 := mem[r + 4].int - mem[q + 2].int;
if dx2 = 0 then
if dy2 = 0 then begin
if mem[r].hh.b1 = 0 then begin
curx := mem[r + 1].int;
cury := mem[r + 2].int
end else begin
unskew(mem[r + 1].int, mem[r + 2].int, mem[r].hh.b1);
skew(curx, cury, mem[q].hh.b1)
end;
dx2 := curx - mem[q + 1].int;
dy2 := cury - mem[q + 2].int
end
end;
dmax := abs(dx2);
if abs(dy2) > dmax then
dmax := abs(dy2);
while dmax < 268435456 do begin
dmax := dmax + dmax;
dx2 := dx2 + dx2;
dy2 := dy2 + dy2
end {:457};
unskew(dx1, dy1, mem[p].hh.b1);
del := pythadd(curx, cury);
dx1 := makefraction(curx, del);
dy1 := makefraction(cury, del);
unskew(dx2, dy2, mem[q].hh.b1);
del := pythadd(curx, cury);
dx2 := makefraction(curx, del);
dy2 := makefraction(cury, del);
del := takefraction(dx1, dy2) - takefraction(dx2, dy1);
if del > 4684844 then
clockwise := false
else if del < (-4684844) then
clockwise := true
else
clockwise := revturns
end; {:454}
6, -2:
clockwise := true;
0:
clockwise := revturns
end; {458:}
while true do begin
if clockwise then
if o1 = 1 then
o1 := 8
else
o1 := o1 - 1
else if o1 = 8 then
o1 := 1
else
o1 := o1 + 1;
if o1 = o2 then
goto 30;
newboundary(s, octantcode[o1]);
s := mem[s].hh.rh;
mem[s + 3].int := mem[s + 5].int
end {:458};
30:
if q = r then begin
q := mem[q].hh.rh;
r := q;
p := s;
mem[s].hh.rh := q;
mem[q + 3].int := mem[q + 5].int;
mem[q].hh.b0 := 0;
freenode(curspec, 7);
curspec := q
end; {459:}
p := mem[p].hh.rh;
repeat
s := mem[p].hh.rh;
o1 := octantnumber[mem[p + 5].int];
o2 := octantnumber[mem[s + 3].int];
if abs(o1 - o2) = 1 then begin
if o2 < o1 then
o2 := o1;
if odd(o2) then
mem[p + 6].int := 0
else
mem[p + 6].int := 1
end else begin
if o1 = 8 then
turningnumber := turningnumber + 1
else
turningnumber := turningnumber - 1;
mem[p + 6].int := 0
end;
mem[s + 4].int := mem[p + 6].int;
p := s
until p = q {:459}
end {:452};
p := q;
q := r
until p = curspec; {:450}
while mem[curspec].hh.b0 <> 0 do
curspec := mem[curspec].hh.rh;
if tracing > 0 then
if internal[36] <= 0 then
printspec(427)
else if internal[36] > 65536 then
printspec(428)
else
printspec(429);
makespec := curspec
end; { makespec }
{:402}
{463:}
procedure endround(x, y: scaled);
begin
y := (y + 32768) - ycorr[octant];
x := (x + y) - xcorr[octant];
m1 := floorunscaled(x);
n1 := floorunscaled(y);
if (x - (65536 * m1)) >= ((y - (65536 * n1)) + zcorr[octant]) then
d1 := 1
else
d1 := 0
end; {:463}
{465:}
procedure fillspec(h: halfword);
var
p, q, r, s: halfword;
begin
if internal[10] > 0 then
beginedgetracing;
p := h;
{------------------------------------}
print_start(psfile); { Start cycle }
{------------------------------------}
repeat
octant := mem[p + 3].int; {466:}
q := p;
while mem[q].hh.b1 <> 0 do
q := mem[q].hh.rh {:466};
if q <> p then begin {467:}
endround(mem[p + 1].int, mem[p + 2].int);
m0 := m1;
n0 := n1;
d0 := d1;
endround(mem[q + 1].int, mem[q + 2].int) {:467}; {468:}
if (n1 - n0) >= movesize then
overflow(407, movesize);
move[0] := d0;
moveptr := 0;
r := p;
repeat
s := mem[r].hh.rh;
makemoves(mem[r + 1].int, mem[r + 5].int, mem[s + 3].int, mem[s + 1].int, mem[r + 2].int + 32768, mem[r + 6].int + 32768, mem[s + 4].int + 32768, mem[s + 2].int + 32768, xycorr[octant], ycorr[octant],465,octant);
r := s
until r = q;
move[moveptr] := move[moveptr] - d1;
if internal[35] > 0 then
smoothmoves(0, moveptr) {:468};
movetoedges(m0, n0, m1, n1)
end;
p := mem[q].hh.rh
until p = h;
{------------------------------------}
print_end(psfile); { End cycle }
{------------------------------------}
tossknotlist(h);
if internal[10] > 0 then
endedgetracing
end; {:465} {476:}
procedure dupoffset(w: halfword);
var
r: halfword;
begin
r := getnode(3);
mem[r + 1].int := mem[w + 1].int;
mem[r + 2].int := mem[w + 2].int;
mem[r].hh.rh := mem[w].hh.rh;
mem[mem[w].hh.rh].hh.lh := r;
mem[r].hh.lh := w;
mem[w].hh.rh := r
end; {:476} {477:}
function makepen(h: halfword): halfword;
label
30, 31, 45, 40;
var
o, oo, k: smallnumber;
p: halfword;
q, r, s, w, hh: halfword;
n: integer;
dx, dy: scaled;
mc: scaled; {479:}
begin
q := h;
r := mem[q].hh.rh;
mc := abs(mem[h + 1].int);
if q = r then begin
hh := h;
mem[h].hh.b1 := 0;
if mc < abs(mem[h + 2].int) then
mc := abs(mem[h + 2].int)
end else begin
o := 0;
hh := -30000;
while true do begin
s := mem[r].hh.rh;
if mc < abs(mem[r + 1].int) then
mc := abs(mem[r + 1].int);
if mc < abs(mem[r + 2].int) then
mc := abs(mem[r + 2].int);
dx := mem[r + 1].int - mem[q + 1].int;
dy := mem[r + 2].int - mem[q + 2].int;
if dx = 0 then
if dy = 0 then
goto 45;
if abvscd(dx, mem[s + 2].int - mem[r + 2].int, dy, mem[s + 1].int - mem[r + 1].int) < 0 then
goto 45; {480:}
if dx > 0 then
octant := 1
else if dx = 0 then
if dy > 0 then
octant := 1
else
octant := 2
else begin
dx := -dx;
octant := 2
end;
if dy < 0 then begin
dy := -dy;
octant := octant + 2
end else if dy = 0 then
if octant > 1 then
octant := 4;
if dx < dy then
octant := octant + 4 {:480};
mem[q].hh.b1 := octant;
oo := octantnumber[octant];
if o > oo then begin
if hh <> (-30000) then
goto 45;
hh := q
end;
o := oo;
if (q = h) and (hh <> (-30000)) then
goto 30;
q := r;
r := s
end;
30: {:479}
end;
if mc >= 268402688 then
goto 45;
p := getnode(10);
q := hh;
mem[p + 9].int := mc;
mem[p].hh.lh := -30000;
if mem[q].hh.rh <> q then
mem[p].hh.rh := -29999;
for k := 1 to 8 do begin {481:}
octant := octantcode[k];
n := 0;
h := p + octant;
while true do begin
r := getnode(3);
skew(mem[q + 1].int, mem[q + 2].int, octant);
mem[r + 1].int := curx;
mem[r + 2].int := cury;
if n = 0 then
mem[h].hh.rh := r {482:}
else if odd(k) then begin
mem[w].hh.rh := r;
mem[r].hh.lh := w
end else begin
mem[w].hh.lh := r;
mem[r].hh.rh := w
end {:482};
w := r;
if mem[q].hh.b1 <> octant then
goto 31;
q := mem[q].hh.rh;
n := n + 1
end;
31: {483:}
r := mem[h].hh.rh;
if odd(k) then begin
mem[w].hh.rh := r;
mem[r].hh.lh := w
end else begin
mem[w].hh.lh := r;
mem[r].hh.rh := w;
mem[h].hh.rh := w;
r := w
end;
if (mem[r + 2].int <> mem[mem[r].hh.rh + 2].int) or (n = 0) then begin
dupoffset(r);
n := n + 1
end;
r := mem[r].hh.lh;
{:
483}
if mem[r + 1].int <> mem[mem[r].hh.lh + 1].int then
dupoffset(r)
else
n := n - 1;
if n >= 127 then
overflow(446, 127);
mem[h].hh.lh := n
end {:481};
goto 40;
45:
p := -29997; {478:}
if mc >= 268402688 then begin
begin
if interaction = 3 then
;
printnl(133);
print(440)
end;
begin
helpptr := 2;
helpline[1] := 441;
helpline[0] := 442
end
end else begin
begin
if interaction = 3 then
;
printnl(133);
print(443)
end;
begin
helpptr := 3;
helpline[2] := 444;
helpline[1] := 445;
helpline[0] := 442
end
end; {:478}
putgeterror;
40:
if internal[6] > 0 then
printpen(p, 439, true);
makepen := p
end; {:477} {484:} {486:}
function trivialknot(x, y: scaled): halfword;
var
p: halfword;
begin
p := getnode(7);
mem[p].hh.b0 := 1;
mem[p].hh.b1 := 1;
mem[p + 1].int := x;
mem[p + 3].int := x;
mem[p + 5].int := x;
mem[p + 2].int := y;
mem[p + 4].int := y;
mem[p + 6].int := y;
trivialknot := p
end; {:486}
function makepath(penhead: halfword): halfword;
var
p: halfword;
k: 1..8;
h: halfword;
m, n: integer;
w, ww: halfword;
begin
p := 29999;
for k := 1 to 8 do begin
octant := octantcode[k];
h := penhead + octant;
n := mem[h].hh.lh;
w := mem[h].hh.rh;
if not odd(k) then
w := mem[w].hh.lh;
for m := 1 to n + 1 do begin
if odd(k) then
ww := mem[w].hh.rh
else
ww := mem[w].hh.lh;
if (mem[ww + 1].int <> mem[w + 1].int) or (mem[ww + 2].int <> mem[w + 2].int) then begin {485:}
unskew(mem[ww + 1].int, mem[ww + 2].int, octant);
mem[p].hh.rh := trivialknot(curx, cury);
p := mem[p].hh.rh
end {:485};
w := ww
end
end;
if p = 29999 then begin
w := mem[penhead + 1].hh.rh;
p := trivialknot(mem[w + 1].int + mem[w + 2].int, mem[w + 2].int);
mem[29999].hh.rh := p
end;
mem[p].hh.rh := mem[29999].hh.rh;
makepath := mem[29999].hh.rh
end; {:484} {488:}
procedure findoffset(x, y: scaled; p: halfword);
label
30, 10;
var
octant: 1..8;
s: -1..+1;
n: integer;
h, w, ww: halfword; {489:}
begin
if x > 0 then
octant := 1
else if x = 0 then
if y <= 0 then
if y = 0 then begin
curx := 0;
cury := 0;
goto 10
end else
octant := 2
else
octant := 1
else begin
x := -x;
if y = 0 then
octant := 4
else
octant := 2
end;
if y < 0 then begin
octant := octant + 2;
y := -y
end;
if x >= y then
x := x - y
else begin
octant := octant + 4;
x := y - x;
y := y - x
end {:489};
if odd(octantnumber[octant]) then
s := -1
else
s := +1;
h := p + octant;
w := mem[mem[h].hh.rh].hh.rh;
ww := mem[w].hh.rh;
n := mem[h].hh.lh;
while n > 1 do begin
if abvscd(x, mem[ww + 2].int - mem[w + 2].int, y, mem[ww + 1].int - mem[w + 1].int) <> s then
goto 30;
w := ww;
ww := mem[w].hh.rh;
n := n - 1
end;
30:
unskew(mem[w + 1].int, mem[w + 2].int, octant);
10:
end; {:488} {491:} {493:}
procedure splitforoffset(p: halfword; t: fraction);
var
q: halfword;
r: halfword;
begin
q := mem[p].hh.rh;
splitcubic(p, t, mem[q + 1].int, mem[q + 2].int);
r := mem[p].hh.rh;
if mem[r + 2].int < mem[p + 2].int then
mem[r + 2].int := mem[p + 2].int
else if mem[r + 2].int > mem[q + 2].int then
mem[r + 2].int := mem[q + 2].int;
if mem[r + 1].int < mem[p + 1].int then
mem[r + 1].int := mem[p + 1].int
else if mem[r + 1].int > mem[q + 1].int then
mem[r + 1].int := mem[q + 1].int
end; {:493} {497:}
procedure finoffsetprep(p: halfword; k: halfword; w: halfword; x0, x1, x2, y0, y1, y2: integer; rising: boolean; n: integer);
label
10;
var
q, ww: halfword;
du, dv: scaled;
t0, t1, t2: integer;
t: fraction;
s: fraction;
v: integer;
begin
while true do begin
q := mem[p].hh.rh;
mem[p].hh.b1 := k;
if rising then
if k = n then
goto 10
else
ww := mem[w].hh.rh
else if k = 1 then
goto 10
else
ww := mem[w].hh.lh; {498:}
du := mem[ww + 1].int - mem[w + 1].int;
dv := mem[ww + 2].int - mem[w + 2].int;
if abs(du) >= abs(dv) then begin
s := makefraction(dv, du);
t0 := takefraction(x0, s) - y0;
t1 := takefraction(x1, s) - y1;
t2 := takefraction(x2, s) - y2
end else begin
s := makefraction(du, dv);
t0 := x0 - takefraction(y0, s);
t1 := x1 - takefraction(y1, s);
t2 := x2 - takefraction(y2, s)
end {:498};
t := crossingpoint(t0, t1, t2);
if t >= 268435456 then
goto 10; {499:}
begin
splitforoffset(p, t);
mem[p].hh.b1 := k;
p := mem[p].hh.rh;
v := x0 - takefraction(x0 - x1, t);
x1 := x1 - takefraction(x1 - x2, t);
x0 := v - takefraction(v - x1, t);
v := y0 - takefraction(y0 - y1, t);
y1 := y1 - takefraction(y1 - y2, t);
y0 := v - takefraction(v - y1, t);
t1 := t1 - takefraction(t1 - t2, t);
if t1 > 0 then
t1 := 0;
t := crossingpoint(0, -t1, -t2);
if t < 268435456 then begin
splitforoffset(p, t);
mem[mem[p].hh.rh].hh.b1 := k;
v := x1 - takefraction(x1 - x2, t);
x1 := x0 - takefraction(x0 - x1, t);
x2 := x1 - takefraction(x1 - v, t);
v := y1 - takefraction(y1 - y2, t);
y1 := y0 - takefraction(y0 - y1, t);
y2 := y1 - takefraction(y1 - v, t)
end
end {:499};
if rising then
k := k + 1
else
k := k - 1;
w := ww
end;
10:
end; {:497}
procedure offsetprep(c, h: halfword);
label
30, 45;
var
n: halfword;
p, q, r, lh, ww: halfword;
k: halfword;
w: halfword; {495:}
x0, x1, x2, y0, y1, y2: integer;
t0, t1, t2: integer;
du, dv, dx, dy: integer;
maxcoef: integer;
x0a, x1a, x2a, y0a, y1a, y2a: integer;
t: fraction;
s: fraction;
{:495}
begin
p := c;
n := mem[h].hh.lh;
lh := mem[h].hh.rh;
while mem[p].hh.b1 <> 0 do begin
q := mem[p].hh.rh; {494:}
if n <= 1 then
mem[p].hh.b1 := 1
else begin {496:}
x0 := mem[p + 5].int - mem[p + 1].int;
x2 := mem[q + 1].int - mem[q + 3].int;
x1 := mem[q + 3].int - mem[p + 5].int;
y0 := mem[p + 6].int - mem[p + 2].int;
y2 := mem[q + 2].int - mem[q + 4].int;
y1 := mem[q + 4].int - mem[p + 6].int;
maxcoef := abs(x0);
if abs(x1) > maxcoef then
maxcoef := abs(x1);
if abs(x2) > maxcoef then
maxcoef := abs(x2);
if abs(y0) > maxcoef then
maxcoef := abs(y0);
if abs(y1) > maxcoef then
maxcoef := abs(y1);
if abs(y2) > maxcoef then
maxcoef := abs(y2);
if maxcoef = 0 then
goto 45;
while maxcoef < 268435456 do begin
maxcoef := maxcoef + maxcoef;
x0 := x0 + x0;
x1 := x1 + x1;
x2 := x2 + x2;
y0 := y0 + y0;
y1 := y1 + y1;
y2 := y2 + y2
end {:496}; {501:}
dx := x0;
dy := y0;
if dx = 0 then
if dy = 0 then begin
dx := x1;
dy := y1;
if dx = 0 then
if dy = 0 then begin
dx := x2;
dy := y2
end
end {:501};
if dx = 0 then {505:}
finoffsetprep(p, n, mem[mem[lh].hh.lh].hh.lh, -x0, -x1, -x2, -y0, -y1, -y2, false, n) {:505}
else begin {502:}
k := 1;
w := mem[lh].hh.rh;
while true do begin
if k = n then
goto 30;
ww := mem[w].hh.rh;
if abvscd(dy, abs(mem[ww + 1].int - mem[w + 1].int), dx, abs(mem[ww + 2].int - mem[w + 2].int)) >= 0 then begin
k := k + 1;
w := ww
end else
goto 30
end;
30: {:502}
;
{503:}
if k = 1 then
t := 268435457
else begin
ww := mem[w].hh.lh; {498:}
du := mem[ww + 1].int - mem[w + 1].int;
dv := mem[ww + 2].int - mem[w + 2].int;
if abs(du) >= abs(dv) then begin
s := makefraction(dv, du);
t0 := takefraction(x0, s) - y0;
t1 := takefraction(x1, s) - y1;
t2 := takefraction(x2, s) - y2
end else begin
s := makefraction(du, dv);
t0 := x0 - takefraction(y0, s);
t1 := x1 - takefraction(y1, s);
t2 := x2 - takefraction(y2, s)
end {:498};
t := crossingpoint(-t0, -t1, -t2)
end;
if t >= 268435456 then
finoffsetprep(p, k, w, x0, x1, x2, y0, y1, y2, true, n)
else begin
splitforoffset(p, t);
r := mem[p].hh.rh;
x1a := x0 - takefraction(x0 - x1, t);
x1 := x1 - takefraction(x1 - x2, t);
x2a := x1a - takefraction(x1a - x1, t);
y1a := y0 - takefraction(y0 - y1, t);
y1 := y1 - takefraction(y1 - y2, t);
y2a := y1a - takefraction(y1a - y1, t);
finoffsetprep(p, k, w, x0, x1a, x2a, y0, y1a, y2a, true, n);
x0 := x2a;
y0 := y2a;
t1 := t1 - takefraction(t1 - t2, t);
if t1 < 0 then
t1 := 0;
t := crossingpoint(0, t1, t2);
if t < 268435456 then begin {504:}
splitforoffset(r, t);
x1a := x1 - takefraction(x1 - x2, t);
x1 := x0 - takefraction(x0 - x1, t);
x0a := x1 - takefraction(x1 - x1a, t);
y1a := y1 - takefraction(y1 - y2, t);
y1 := y0 - takefraction(y0 - y1, t);
y0a := y1 - takefraction(y1 - y1a, t);
finoffsetprep(mem[r].hh.rh, k, w, x0a, x1a, x2, y0a, y1a, y2, true, n);
x2 := x0a;
y2 := y0a
end {:504};
finoffsetprep(r, k - 1, ww, -x0, -x1, -x2, -y0, -y1, -y2, false, n)
end {:503}
end;
45: {:494}
end; {492:}
repeat
r := mem[p].hh.rh;
if mem[p + 1].int = mem[p + 5].int then
if mem[p + 2].int = mem[p + 6].int then
if mem[p + 1].int = mem[r + 3].int then
if mem[p + 2].int = mem[r + 4].int then
if mem[p + 1].int = mem[r + 1].int then
if mem[p + 2].int = mem[r + 2].int then begin
removecubic(p);
if r = q then
q := p;
r := p
end;
p := r
until p = q {:492}
end
end; { offsetprep }
{:491}
{506:}
{510:}
procedure skewlineedges(p, w, ww: halfword);
var
x0, y0, x1, y1: scaled;
begin
if (mem[w + 1].int <> mem[ww + 1].int) or (mem[w + 2].int <> mem[ww + 2].int) then begin
x0 := mem[p + 1].int + mem[w + 1].int;
y0 := mem[p + 2].int + mem[w + 2].int;
x1 := mem[p + 1].int + mem[ww + 1].int;
y1 := mem[p + 2].int + mem[ww + 2].int;
{-------------------------------------}
sendline(x0,y0,x1,y1,octant,510);
{-------------------------------------}
unskew(x0, y0, octant);
x0 := curx;
y0 := cury;
unskew(x1, y1, octant);
{if internal[10]>65536 then begin printnl(451);printtwo(x0,y0);
print(450);printtwo(curx,cury);printnl(155);end;}
lineedges(x0, y0, curx, cury)
end
end; {:510} {518:}
procedure dualmoves(h, p, q: halfword);
label
30, 31;
var
r, s: halfword; {511:}
m, n: integer;
mm0, mm1: integer;
k: integer;
w, ww: halfword;
smoothbot, smoothtop: 0..movesize;
xx, yy, xp, yp, delx, dely, tx, ty: scaled;
{:511} {519:}
begin
k := mem[h].hh.lh + 1;
ww := mem[h].hh.rh;
w := mem[ww].hh.lh;
mm0 := floorunscaled((mem[p + 1].int + mem[w + 1].int) - xycorr[octant]);
mm1 := floorunscaled((mem[q + 1].int + mem[ww + 1].int) - xycorr[octant]);
for n := 1 to (n1 - n0) + 1 do
envmove[n] := mm1;
envmove[0] := mm0;
moveptr := 0;
m := mm0 {:519};
r := p;
while true do begin
if r = q then
smoothtop := moveptr;
while mem[r].hh.b1 <> k do begin {521:}
xx := mem[r + 1].int + mem[w + 1].int;
yy := (mem[r + 2].int + mem[w + 2].int) + 32768;
{if internal[10]>65536 then begin printnl(452);printint(k);print(453);
unskew(xx,yy-32768,octant);printtwo(curx,cury);end;}
{------------}
my_xx := xx;
my_yy := yy;
{------------}
if mem[r].hh.b1 < k then begin
k := k - 1;
w := mem[w].hh.lh;
xp := mem[r + 1].int + mem[w + 1].int;
yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
if yp <> yy then begin {522:}
ty := floorscaled(yy - ycorr[octant]);
dely := yp - yy;
yy := yy - ty;
ty := (yp - ycorr[octant]) - ty;
if ty >= 65536 then begin
delx := xp - xx;
yy := 65536 - yy;
while true do begin
if m < envmove[moveptr] then
envmove[moveptr] := m;
tx := takefraction(delx, makefraction(yy, dely));
if (abvscd(tx, dely, delx, yy) + xycorr[octant]) > 0 then
tx := tx - 1;
m := floorunscaled(xx + tx);
ty := ty - 65536;
moveptr := moveptr + 1;
if ty < 65536 then
goto 31;
yy := yy + 65536
end;
31:
if m < envmove[moveptr] then
envmove[moveptr] := m
end
end {:522}
end else begin
k := k + 1;
w := mem[w].hh.rh;
xp := mem[r + 1].int + mem[w + 1].int;
yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
end;
{if internal[10]>65536 then begin print(450);unskew(xp,yp-32768,octant);
printtwo(curx,cury);printnl(155);end;}
{---------------------------------------------------}
sendline(my_xx,my_yy-32768,xp,yp-32768,octant,521);
{---------------------------------------------------}
m := floorunscaled(xp - xycorr[octant]);
moveptr := floorunscaled(yp - ycorr[octant]) - n0;
if m < envmove[moveptr] then
envmove[moveptr] := m
end {:521};
if r = p then
smoothbot := moveptr;
if r = q then
goto 30;
move[moveptr] := 1;
n := moveptr;
s := mem[r].hh.rh;
makemoves(mem[r + 1].int + mem[w + 1].int, mem[r + 5].int + mem[w + 1].int, mem[s + 3].int + mem[w + 1].int, mem[s + 1].int + mem[w + 1].int, (mem[r + 2].int + mem[w + 2].int) + 32768, (mem[r + 6].int + mem[w + 2].int) + 32768, (mem[s + 4].int + mem[w + 2].int) + 32768, (mem[s + 2].int + mem[w + 2].int) + 32768, xycorr[octant], ycorr[octant],518,octant); {520:}
repeat
if m < envmove[n] then
envmove[n] := m;
m := (m + move[n]) - 1;
n := n + 1
until n > moveptr {:520};
r := s
end;
30: {523:}
{if(m<>mm1)or(moveptr<>n1-n0)then confusion(50);}
move[0] := (d0 + envmove[1]) - mm0;
for n := 1 to moveptr do
move[n] := (envmove[n + 1] - envmove[n]) + 1;
move[moveptr] := move[moveptr] - d1;
if internal[35] > 0 then
smoothmoves(smoothbot, smoothtop);
movetoedges(m0, n0, m1, n1);
if mem[q + 6].int = 1 then begin
w := mem[h].hh.rh;
skewlineedges(q, w, mem[w].hh.lh)
end {:523}
end; {:518}
procedure fillenvelope(spechead: halfword);
label
30, 31;
var
p, q, r, s: halfword;
h: halfword;
www: halfword; {511:}
m, n: integer;
mm0, mm1: integer;
k: integer;
w, ww: halfword;
smoothbot, smoothtop: 0..movesize;
xx, yy, xp, yp, delx, dely, tx, ty: scaled; {:511}
begin
if internal[10] > 0 then
beginedgetracing;
{------------------------------------}
print_start(psfile); { Start cycle }
{------------------------------------}
p := spechead;
repeat
octant := mem[p + 3].int;
h := curpen + octant; {466:}
q := p;
while mem[q].hh.b1 <> 0 do
q := mem[q].hh.rh {:466}; {508:}
w := mem[h].hh.rh;
if mem[p + 4].int = 1 then
w := mem[w].hh.lh;
{if internal[10]>65536 then[509:]begin printnl(447);
print(octantdir[octant]);print(425);printint(mem[h].hh.lh);print(448);
if mem[h].hh.lh<>1 then printchar(115);print(449);
unskew(mem[p+1].int+mem[w+1].int,mem[p+2].int+mem[w+2].int,octant);
printtwo(curx,cury);ww:=mem[h].hh.rh;
if mem[q+6].int=1 then ww:=mem[ww].hh.lh;print(450);
unskew(mem[q+1].int+mem[ww+1].int,mem[q+2].int+mem[ww+2].int,octant);
printtwo(curx,cury);end[:509];}
ww := mem[h].hh.rh;
www := ww;
if odd(octantnumber[octant]) then
www := mem[www].hh.lh
else
ww := mem[ww].hh.lh;
if w <> ww then
skewlineedges(p, w, ww);
endround(mem[p + 1].int + mem[ww + 1].int, mem[p + 2].int + mem[ww + 2].int);
m0 := m1;
n0 := n1;
d0 := d1;
endround(mem[q + 1].int + mem[www + 1].int, mem[q + 2].int + mem[www + 2].int);
if (n1 - n0) >= movesize then
overflow(407, movesize) {:508};
offsetprep(p, h);
{466:}
q := p;
while mem[q].hh.b1 <> 0 do
q := mem[q].hh.rh {:466}; {512:}
if odd(octantnumber[octant]) then begin {513:}
k := 0;
w := mem[h].hh.rh;
ww := mem[w].hh.lh;
mm0 := floorunscaled((mem[p + 1].int + mem[w + 1].int) - xycorr[octant]);
mm1 := floorunscaled((mem[q + 1].int + mem[ww + 1].int) - xycorr[octant]);
for n := 0 to n1 - n0 do
envmove[n] := mm0;
envmove[n1 - n0] := mm1;
moveptr := 0;
m := mm0 {:513};
r := p;
mem[q].hh.b1 := mem[h].hh.lh + 1;
while true do begin
if r = q then
smoothtop := moveptr;
while mem[r].hh.b1 <> k do begin {515:}
xx := mem[r + 1].int + mem[w + 1].int;
yy := (mem[r + 2].int + mem[w + 2].int) + 32768;
{if internal[10]>65536 then begin printnl(452);printint(k);print(453);
unskew(xx,yy-32768,octant);printtwo(curx,cury);end;}
{------------}
my_xx := xx;
my_yy := yy;
{------------}
if mem[r].hh.b1 > k then begin
k := k + 1;
w := mem[w].hh.rh;
xp := mem[r + 1].int + mem[w + 1].int;
yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
if yp <> yy then begin {516:}
ty := floorscaled(yy - ycorr[octant]);
dely := yp - yy;
yy := yy - ty;
ty := (yp - ycorr[octant]) - ty;
if ty >= 65536 then begin
delx := xp - xx;
yy := 65536 - yy;
while true do begin
tx := takefraction(delx, makefraction(yy, dely));
if (abvscd(tx, dely, delx, yy) + xycorr[octant]) > 0 then
tx := tx - 1;
m := floorunscaled(xx + tx);
if m > envmove[moveptr] then
envmove[moveptr] := m;
ty := ty - 65536;
if ty < 65536 then
goto 31;
yy := yy + 65536;
moveptr := moveptr + 1
end;
31:
end
end {:516}
end else begin
k := k - 1;
w := mem[w].hh.lh;
xp := mem[r + 1].int + mem[w + 1].int;
yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
end;
{if internal[10]>65536 then begin print(450);unskew(xp,yp-32768,octant);
printtwo(curx,cury);printnl(155);end;}
{---------------------------------------------------}
sendline(my_xx,my_yy-32768,xp,yp-32768,octant,515);
{---------------------------------------------------}
m := floorunscaled(xp - xycorr[octant]);
moveptr := floorunscaled(yp - ycorr[octant]) - n0;
if m > envmove[moveptr] then
envmove[moveptr] := m
end {:515};
if r = p then
smoothbot := moveptr;
if r = q then
goto 30;
move[moveptr] := 1;
n := moveptr;
s := mem[r].hh.rh;
makemoves(mem[r + 1].int + mem[w + 1].int, mem[r + 5].int + mem[w + 1].int, mem[s + 3].int + mem[w + 1].int, mem[s + 1].int + mem[w + 1].int, (mem[r + 2].int + mem[w + 2].int) + 32768, (mem[r + 6].int + mem[w + 2].int) + 32768, (mem[s + 4].int + mem[w + 2].int) + 32768, (mem[s + 2].int + mem[w + 2].int) + 32768, xycorr[octant], ycorr[octant],512,octant); {514:}
repeat
m := (m + move[n]) - 1;
if m > envmove[n] then
envmove[n] := m;
n := n + 1
until n > moveptr {:514};
r := s
end;
30: {517:}
{if(m<>mm1)or(moveptr<>n1-n0)then confusion(49);}
move[0] := (d0 + envmove[0]) - mm0;
for n := 1 to moveptr do
move[n] := (envmove[n] - envmove[n - 1]) + 1;
move[moveptr] := move[moveptr] - d1;
if internal[35] > 0 then
smoothmoves(smoothbot, smoothtop);
movetoedges(m0, n0, m1, n1);
if mem[q + 6].int = 0 then begin
w := mem[h].hh.rh;
skewlineedges(q, mem[w].hh.lh, w)
end {:517}
end else
dualmoves(h, p, q);
mem[q].hh.b1 := 0 {:512};
p := mem[q].hh.rh
until p = spechead;
{------------------------------------}
print_end(psfile); { End cycle }
{------------------------------------}
if internal[10] > 0 then
endedgetracing;
tossknotlist(spechead)
end; {:506}
{527:}
function makeellipse(majoraxis, minoraxis: scaled; theta: angle): halfword;
label
30, 31, 40;
var
p, q, r, s: halfword;
h: halfword;
alpha, beta, gamma, delta: integer;
c, d: integer;
u, v: integer;
symmetric: boolean; {528:}
begin {530:}
if (majoraxis = minoraxis) or ((theta mod 94371840) = 0) then begin
symmetric := true;
alpha := 0;
if odd(theta div 94371840) then begin
beta := majoraxis;
gamma := minoraxis;
nsin := 268435456;
ncos := 0
end else begin
beta := minoraxis;
gamma := majoraxis
end
end else begin
symmetric := false;
nsincos(theta);
gamma := takefraction(majoraxis, nsin);
delta := takefraction(minoraxis, ncos);
beta := pythadd(gamma, delta);
alpha := takefraction(takefraction(majoraxis, makefraction(gamma, beta)), ncos) - takefraction(takefraction(minoraxis, makefraction(delta, beta)), nsin);
alpha := (alpha + 32768) div 65536;
gamma := pythadd(takefraction(majoraxis, ncos), takefraction(minoraxis, nsin))
end;
beta := (beta + 32768) div 65536;
gamma := (gamma + 32768) div 65536 {:530};
p := getnode(7);
q := getnode(7);
r := getnode(7);
if symmetric then
s := -30000
else
s := getnode(7);
h := p;
mem[p].hh.rh := q;
mem[q].hh.rh := r;
mem[r].hh.rh := s; {529:}
if beta = 0 then
beta := 1;
if gamma = 0 then
gamma := 1;
if gamma <= abs(alpha) then
if alpha > 0 then
alpha := gamma - 1
else
alpha := 1 - gamma {:529};
mem[p + 1].int := -(alpha * 32768);
mem[p + 2].int := -(beta * 32768);
mem[q + 1].int := gamma * 32768;
mem[q + 2].int := mem[p + 2].int;
mem[r + 1].int := mem[q + 1].int;
mem[p + 5].int := 0;
mem[q + 3].int := -32768;
mem[q + 5].int := 32768;
mem[r + 3].int := 0;
mem[r + 5].int := 0;
mem[p + 6].int := beta;
mem[q + 6].int := gamma;
mem[r + 6].int := beta;
mem[q + 4].int := gamma + alpha;
if symmetric then begin
mem[r + 2].int := 0;
mem[r + 4].int := beta
end else begin
mem[r + 2].int := -mem[p + 2].int;
mem[r + 4].int := beta + beta;
mem[s + 1].int := -mem[p + 1].int;
mem[s + 2].int := mem[r + 2].int;
mem[s + 3].int := 32768;
mem[s + 4].int := gamma - alpha
end {:528}; {531:}
while true do begin
u := mem[p + 5].int + mem[q + 5].int;
v := mem[q + 3].int + mem[r + 3].int;
c := mem[p + 6].int + mem[q + 6].int; {533:}
delta := pythadd(u, v);
if majoraxis = minoraxis then
d := majoraxis
else begin
if theta = 0 then begin
alpha := u;
beta := v
end else begin
alpha := takefraction(u, ncos) + takefraction(v, nsin);
beta := takefraction(v, ncos) - takefraction(u, nsin)
end;
alpha := makefraction(alpha, delta);
beta := makefraction(beta, delta);
d := pythadd(takefraction(majoraxis, alpha), takefraction(minoraxis, beta))
end;
d := takefraction(d, delta);
alpha := abs(u);
beta := abs(v);
if alpha < beta then begin
delta := alpha;
alpha := beta;
beta := delta
end;
if internal[38] <> 0 then
d := d - takefraction(internal[38], beta + beta);
d := (d + 4) div 8;
alpha := alpha div 32768;
if d < alpha then
d := alpha {:533};
delta := c - d;
if delta > 0 then begin
if delta > mem[r + 4].int then
delta := mem[r + 4].int;
if delta >= mem[q + 4].int then begin {534:}
delta := mem[q + 4].int;
mem[p + 6].int := c - delta;
mem[p + 5].int := u;
mem[q + 3].int := v;
mem[q + 1].int := mem[q + 1].int - (delta * mem[r + 3].int);
mem[q + 2].int := mem[q + 2].int + (delta * mem[q + 5].int);
mem[r + 4].int := mem[r + 4].int - delta
end else begin {:534} {535:}
s := getnode(7);
mem[p].hh.rh := s;
mem[s].hh.rh := q;
mem[s + 1].int := mem[q + 1].int + (delta * mem[q + 3].int);
mem[s + 2].int := mem[q + 2].int - (delta * mem[p + 5].int);
mem[q + 1].int := mem[q + 1].int - (delta * mem[r + 3].int);
mem[q + 2].int := mem[q + 2].int + (delta * mem[q + 5].int);
mem[s + 3].int := mem[q + 3].int;
mem[s + 5].int := u;
mem[q + 3].int := v;
mem[s + 6].int := c - delta;
mem[s + 4].int := mem[q + 4].int - delta;
mem[q + 4].int := delta;
mem[r + 4].int := mem[r + 4].int - delta
end {:535}
end else
p := q; {532:}
while true do begin
q := mem[p].hh.rh;
if q = (-30000) then
goto 30;
if mem[q + 4].int = 0 then begin
mem[p].hh.rh := mem[q].hh.rh;
mem[p + 6].int := mem[q + 6].int;
mem[p + 5].int := mem[q + 5].int;
freenode(q, 7)
end else begin
r := mem[q].hh.rh;
if r = (-30000) then
goto 30;
if mem[r + 4].int = 0 then begin
mem[p].hh.rh := r;
freenode(q, 7);
p := r
end else
goto 40
end
end;
40: {:532}
end;
30: {:531}
;
if symmetric then begin {536:}
s := -30000;
q := h;
while true do begin
r := getnode(7);
mem[r].hh.rh := s;
s := r;
mem[s + 1].int := mem[q + 1].int;
mem[s + 2].int := -mem[q + 2].int;
if q = p then
goto 31;
q := mem[q].hh.rh;
if mem[q + 2].int = 0 then
goto 31
end;
31:
mem[p].hh.rh := s;
beta := -mem[h + 2].int;
while mem[p + 2].int <> beta do
p := mem[p].hh.rh;
q := mem[p].hh.rh
end {:536};
{537:}
if q <> (-30000) then begin
if mem[h + 5].int = 0 then begin
p := h;
h := mem[h].hh.rh;
freenode(p, 7);
mem[q + 1].int := -mem[h + 1].int
end;
p := q
end else
q := p;
r := mem[h].hh.rh;
repeat
s := getnode(7);
mem[p].hh.rh := s;
p := s;
mem[p + 1].int := -mem[r + 1].int;
mem[p + 2].int := -mem[r + 2].int;
r := mem[r].hh.rh
until r = q;
mem[p].hh.rh := h {:537};
makeellipse := h
end; {:527} {539:}
function finddirectiontime(x, y: scaled; h: halfword): scaled;
label
10, 40, 45, 30;
var
max: scaled;
p, q: halfword;
n: scaled;
tt: scaled; {542:}
x1, x2, x3, y1, y2, y3: scaled;
theta, phi: angle;
t: fraction; {:542} {540:}
begin
if abs(x) < abs(y) then begin
x := makefraction(x, abs(y));
if y > 0 then
y := 268435456
else
y := -268435456
end else if x = 0 then begin
finddirectiontime := 0;
goto 10
end else begin
y := makefraction(y, abs(x));
if x > 0 then
x := 268435456
else
x := -268435456
end {:540};
n := 0;
p := h;
while true do begin
if mem[p].hh.b1 = 0 then
goto 45;
q := mem[p].hh.rh;
{541:}
tt := 0; {543:}
x1 := mem[p + 5].int - mem[p + 1].int;
x2 := mem[q + 3].int - mem[p + 5].int;
x3 := mem[q + 1].int - mem[q + 3].int;
y1 := mem[p + 6].int - mem[p + 2].int;
y2 := mem[q + 4].int - mem[p + 6].int;
y3 := mem[q + 2].int - mem[q + 4].int;
max := abs(x1);
if abs(x2) > max then
max := abs(x2);
if abs(x3) > max then
max := abs(x3);
if abs(y1) > max then
max := abs(y1);
if abs(y2) > max then
max := abs(y2);
if abs(y3) > max then
max := abs(y3);
if max = 0 then
goto 40;
while max < 134217728 do begin
max := max + max;
x1 := x1 + x1;
x2 := x2 + x2;
x3 := x3 + x3;
y1 := y1 + y1;
y2 := y2 + y2;
y3 := y3 + y3
end;
t := x1;
x1 := takefraction(x1, x) + takefraction(y1, y);
y1 := takefraction(y1, x) - takefraction(t, y);
t := x2;
x2 := takefraction(x2, x) + takefraction(y2, y);
y2 := takefraction(y2, x) - takefraction(t, y);
t := x3;
x3 := takefraction(x3, x) + takefraction(y3, y);
y3 := takefraction(y3, x) - takefraction(t, y) {:543};
if y1 = 0 then
if x1 >= 0 then
goto 40;
if n > 0 then begin {544:}
theta := narg(x1, y1);
if theta >= 0 then
if phi <= 0 then
if phi >= (theta - 188743680) then
goto 40;
{:
544}
if theta <= 0 then
if phi >= 0 then
if phi <= (theta + 188743680) then
goto 40;
if p = h then
goto 45
end;
if (x3 <> 0) or (y3 <> 0) then
phi := narg(x3, y3);
{546:}
if x1 < 0 then
if x2 < 0 then
if x3 < 0 then
goto 30;
if abvscd(y1, y3, y2, y2) = 0 then begin {548:}
if abvscd(y1, y2, 0, 0) < 0 then begin
t := makefraction(y1, y1 - y2);
x1 := x1 - takefraction(x1 - x2, t);
x2 := x2 - takefraction(x2 - x3, t);
if (x1 - takefraction(x1 - x2, t)) >= 0 then begin
tt := (t + 2048) div 4096;
goto 40
end
end else if y3 = 0 then
if y1 = 0 then begin {549:}
t := crossingpoint(-x1, -x2, -x3);
if t <= 268435456 then begin
tt := (t + 2048) div 4096;
goto 40
end;
if abvscd(x1, x3, x2, x2) <= 0 then begin
t := makefraction(x1, x1 - x2);
begin
tt := (t + 2048) div 4096;
goto 40
end
end
end else if x3 >= 0 then begin {:549}
tt := 65536;
goto 40
end;
goto 30
end {:548};
if y1 <= 0 then
if y1 < 0 then begin
y1 := -y1;
y2 := -y2;
y3 := -y3
end else if y2 > 0 then begin
y2 := -y2;
y3 := -y3
end; {547:}
t := crossingpoint(y1, y2, y3);
if t > 268435456 then
goto 30;
y2 := y2 - takefraction(y2 - y3, t);
x1 := x1 - takefraction(x1 - x2, t);
x2 := x2 - takefraction(x2 - x3, t);
x1 := x1 - takefraction(x1 - x2, t);
if x1 >= 0 then begin
tt := (t + 2048) div 4096;
goto 40
end;
if y2 > 0 then
y2 := 0;
tt := t;
t := crossingpoint(0, -y2, -y3);
if t > 268435456 then
goto 30;
x1 := x1 - takefraction(x1 - x2, t);
x2 := x2 - takefraction(x2 - x3, t);
if (x1 - takefraction(x1 - x2, t)) >= 0 then begin
t := tt - takefraction(tt - 268435456, t);
begin
tt := (t + 2048) div 4096;
goto 40
end
end {:547};
30: {:546}
{:541}
;
p := q;
n := n + 65536
end;
45:
finddirectiontime := -65536;
goto 10;
40:
finddirectiontime := n + tt;
10:
end; {:539} {556:}
procedure cubicintersection(p, pp: halfword);
label
22, 45, 10;
var
q, qq: halfword;
begin
timetogo := 5000;
maxt := 2; {558:}
q := mem[p].hh.rh;
qq := mem[pp].hh.rh;
bisectptr := 20;
bisectstack[bisectptr - 5] := mem[p + 5].int - mem[p + 1].int;
bisectstack[bisectptr - 4] := mem[q + 3].int - mem[p + 5].int;
bisectstack[bisectptr - 3] := mem[q + 1].int - mem[q + 3].int;
if bisectstack[bisectptr - 5] < 0 then
if bisectstack[bisectptr - 3] >= 0 then begin
if bisectstack[bisectptr - 4] < 0 then
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
else
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 1] < 0 then
bisectstack[bisectptr - 1] := 0
end else begin
bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 2] > bisectstack[bisectptr - 5] then
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
if bisectstack[bisectptr - 1] < 0 then
bisectstack[bisectptr - 1] := 0
end
else if bisectstack[bisectptr - 3] <= 0 then begin
if bisectstack[bisectptr - 4] > 0 then
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
else
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 2] > 0 then
bisectstack[bisectptr - 2] := 0
end else begin
bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 1] < bisectstack[bisectptr - 5] then
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
if bisectstack[bisectptr - 2] > 0 then
bisectstack[bisectptr - 2] := 0
end;
bisectstack[bisectptr - 10] := mem[p + 6].int - mem[p + 2].int;
bisectstack[bisectptr - 9] := mem[q + 4].int - mem[p + 6].int;
bisectstack[bisectptr - 8] := mem[q + 2].int - mem[q + 4].int;
if bisectstack[bisectptr - 10] < 0 then
if bisectstack[bisectptr - 8] >= 0 then begin
if bisectstack[bisectptr - 9] < 0 then
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
else
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 6] < 0 then
bisectstack[bisectptr - 6] := 0
end else begin
bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 7] > bisectstack[bisectptr - 10] then
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
if bisectstack[bisectptr - 6] < 0 then
bisectstack[bisectptr - 6] := 0
end
else if bisectstack[bisectptr - 8] <= 0 then begin
if bisectstack[bisectptr - 9] > 0 then
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
else
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 7] > 0 then
bisectstack[bisectptr - 7] := 0
end else begin
bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 6] < bisectstack[bisectptr - 10] then
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
if bisectstack[bisectptr - 7] > 0 then
bisectstack[bisectptr - 7] := 0
end;
bisectstack[bisectptr - 15] := mem[pp + 5].int - mem[pp + 1].int;
bisectstack[bisectptr - 14] := mem[qq + 3].int - mem[pp + 5].int;
bisectstack[bisectptr - 13] := mem[qq + 1].int - mem[qq + 3].int;
if bisectstack[bisectptr - 15] < 0 then
if bisectstack[bisectptr - 13] >= 0 then begin
if bisectstack[bisectptr - 14] < 0 then
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
else
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 11] < 0 then
bisectstack[bisectptr - 11] := 0
end else begin
bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 12] > bisectstack[bisectptr - 15] then
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
if bisectstack[bisectptr - 11] < 0 then
bisectstack[bisectptr - 11] := 0
end
else if bisectstack[bisectptr - 13] <= 0 then begin
if bisectstack[bisectptr - 14] > 0 then
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
else
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 12] > 0 then
bisectstack[bisectptr - 12] := 0
end else begin
bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 11] < bisectstack[bisectptr - 15] then
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
if bisectstack[bisectptr - 12] > 0 then
bisectstack[bisectptr - 12] := 0
end;
bisectstack[bisectptr - 20] := mem[pp + 6].int - mem[pp + 2].int;
bisectstack[bisectptr - 19] := mem[qq + 4].int - mem[pp + 6].int;
bisectstack[bisectptr - 18] := mem[qq + 2].int - mem[qq + 4].int;
if bisectstack[bisectptr - 20] < 0 then
if bisectstack[bisectptr - 18] >= 0 then begin
if bisectstack[bisectptr - 19] < 0 then
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
else
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 16] < 0 then
bisectstack[bisectptr - 16] := 0
end else begin
bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 17] > bisectstack[bisectptr - 20] then
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
if bisectstack[bisectptr - 16] < 0 then
bisectstack[bisectptr - 16] := 0
end
else if bisectstack[bisectptr - 18] <= 0 then begin
if bisectstack[bisectptr - 19] > 0 then
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
else
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 17] > 0 then
bisectstack[bisectptr - 17] := 0
end else begin
bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 16] < bisectstack[bisectptr - 20] then
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
if bisectstack[bisectptr - 17] > 0 then
bisectstack[bisectptr - 17] := 0
end;
delx := mem[p + 1].int - mem[pp + 1].int;
dely := mem[p + 2].int - mem[pp + 2].int;
tol := 0;
uv := bisectptr;
xy := bisectptr;
threel := 0;
curt := 1;
curtt := 1 {:558};
while true do begin
22:
if (delx - tol) <= (bisectstack[xy - 11] - bisectstack[uv - 2]) then
if (delx + tol) >= (bisectstack[xy - 12] - bisectstack[uv - 1]) then
if (dely - tol) <= (bisectstack[xy - 16] - bisectstack[uv - 7]) then
if (dely + tol) >= (bisectstack[xy - 17] - bisectstack[uv - 6]) then begin
if curt >= maxt then begin
if maxt = 131072 then begin
curt := (curt + 1) div 2;
curtt := (curtt + 1) div 2;
goto 10
end;
maxt := maxt + maxt;
apprt := curt;
apprtt := curtt
end; {559:}
bisectstack[bisectptr] := delx;
bisectstack[bisectptr + 1] := dely;
bisectstack[bisectptr + 2] := tol;
bisectstack[bisectptr + 3] := uv;
bisectstack[bisectptr + 4] := xy;
bisectptr := bisectptr + 45;
curt := curt + curt;
curtt := curtt + curtt;
bisectstack[bisectptr - 25] := bisectstack[uv - 5];
bisectstack[bisectptr - 3] := bisectstack[uv - 3];
bisectstack[bisectptr - 24] := (bisectstack[bisectptr - 25] + bisectstack[uv - 4]) div 2;
bisectstack[bisectptr - 4] := (bisectstack[bisectptr - 3] + bisectstack[uv - 4]) div 2;
bisectstack[bisectptr - 23] := (bisectstack[bisectptr - 24] + bisectstack[bisectptr - 4]) div 2;
bisectstack[bisectptr - 5] := bisectstack[bisectptr - 23];
if bisectstack[bisectptr - 25] < 0 then
if bisectstack[bisectptr - 23] >= 0 then begin
if bisectstack[bisectptr - 24] < 0 then
bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]
else
bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25];
bisectstack[bisectptr - 21] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
if bisectstack[bisectptr - 21] < 0 then
bisectstack[bisectptr - 21] := 0
end else begin
bisectstack[bisectptr - 22] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
if bisectstack[bisectptr - 22] > bisectstack[bisectptr - 25] then
bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25];
bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24];
if bisectstack[bisectptr - 21] < 0 then
bisectstack[bisectptr - 21] := 0
end
else if bisectstack[bisectptr - 23] <= 0 then begin
if bisectstack[bisectptr - 24] > 0 then
bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]
else
bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25];
bisectstack[bisectptr - 22] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
if bisectstack[bisectptr - 22] > 0 then
bisectstack[bisectptr - 22] := 0
end else begin
bisectstack[bisectptr - 21] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
if bisectstack[bisectptr - 21] < bisectstack[bisectptr - 25] then
bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25];
bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24];
if bisectstack[bisectptr - 22] > 0 then
bisectstack[bisectptr - 22] := 0
end;
if bisectstack[bisectptr - 5] < 0 then
if bisectstack[bisectptr - 3] >= 0 then begin
if bisectstack[bisectptr - 4] < 0 then
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
else
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 1] < 0 then
bisectstack[bisectptr - 1] := 0
end else begin
bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 2] > bisectstack[bisectptr - 5] then
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
if bisectstack[bisectptr - 1] < 0 then
bisectstack[bisectptr - 1] := 0
end
else if bisectstack[bisectptr - 3] <= 0 then begin
if bisectstack[bisectptr - 4] > 0 then
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
else
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 2] > 0 then
bisectstack[bisectptr - 2] := 0
end else begin
bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
if bisectstack[bisectptr - 1] < bisectstack[bisectptr - 5] then
bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
if bisectstack[bisectptr - 2] > 0 then
bisectstack[bisectptr - 2] := 0
end;
bisectstack[bisectptr - 30] := bisectstack[uv - 10];
bisectstack[bisectptr - 8] := bisectstack[uv - 8];
bisectstack[bisectptr - 29] := (bisectstack[bisectptr - 30] + bisectstack[uv - 9]) div 2;
bisectstack[bisectptr - 9] := (bisectstack[bisectptr - 8] + bisectstack[uv - 9]) div 2;
bisectstack[bisectptr - 28] := (bisectstack[bisectptr - 29] + bisectstack[bisectptr - 9]) div 2;
bisectstack[bisectptr - 10] := bisectstack[bisectptr - 28];
if bisectstack[bisectptr - 30] < 0 then
if bisectstack[bisectptr - 28] >= 0 then begin
if bisectstack[bisectptr - 29] < 0 then
bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]
else
bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30];
bisectstack[bisectptr - 26] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
if bisectstack[bisectptr - 26] < 0 then
bisectstack[bisectptr - 26] := 0
end else begin
bisectstack[bisectptr - 27] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
if bisectstack[bisectptr - 27] > bisectstack[bisectptr - 30] then
bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30];
bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29];
if bisectstack[bisectptr - 26] < 0 then
bisectstack[bisectptr - 26] := 0
end
else if bisectstack[bisectptr - 28] <= 0 then begin
if bisectstack[bisectptr - 29] > 0 then
bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]
else
bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30];
bisectstack[bisectptr - 27] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
if bisectstack[bisectptr - 27] > 0 then
bisectstack[bisectptr - 27] := 0
end else begin
bisectstack[bisectptr - 26] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
if bisectstack[bisectptr - 26] < bisectstack[bisectptr - 30] then
bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30];
bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29];
if bisectstack[bisectptr - 27] > 0 then
bisectstack[bisectptr - 27] := 0
end;
if bisectstack[bisectptr - 10] < 0 then
if bisectstack[bisectptr - 8] >= 0 then begin
if bisectstack[bisectptr - 9] < 0 then
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
else
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 6] < 0 then
bisectstack[bisectptr - 6] := 0
end else begin
bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 7] > bisectstack[bisectptr - 10] then
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
if bisectstack[bisectptr - 6] < 0 then
bisectstack[bisectptr - 6] := 0
end
else if bisectstack[bisectptr - 8] <= 0 then begin
if bisectstack[bisectptr - 9] > 0 then
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
else
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 7] > 0 then
bisectstack[bisectptr - 7] := 0
end else begin
bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
if bisectstack[bisectptr - 6] < bisectstack[bisectptr - 10] then
bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
if bisectstack[bisectptr - 7] > 0 then
bisectstack[bisectptr - 7] := 0
end;
bisectstack[bisectptr - 35] := bisectstack[xy - 15];
bisectstack[bisectptr - 13] := bisectstack[xy - 13];
bisectstack[bisectptr - 34] := (bisectstack[bisectptr - 35] + bisectstack[xy - 14]) div 2;
bisectstack[bisectptr - 14] := (bisectstack[bisectptr - 13] + bisectstack[xy - 14]) div 2;
bisectstack[bisectptr - 33] := (bisectstack[bisectptr - 34] + bisectstack[bisectptr - 14]) div 2;
bisectstack[bisectptr - 15] := bisectstack[bisectptr - 33];
if bisectstack[bisectptr - 35] < 0 then
if bisectstack[bisectptr - 33] >= 0 then begin
if bisectstack[bisectptr - 34] < 0 then
bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]
else
bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35];
bisectstack[bisectptr - 31] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
if bisectstack[bisectptr - 31] < 0 then
bisectstack[bisectptr - 31] := 0
end else begin
bisectstack[bisectptr - 32] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
if bisectstack[bisectptr - 32] > bisectstack[bisectptr - 35] then
bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35];
bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34];
if bisectstack[bisectptr - 31] < 0 then
bisectstack[bisectptr - 31] := 0
end
else if bisectstack[bisectptr - 33] <= 0 then begin
if bisectstack[bisectptr - 34] > 0 then
bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]
else
bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35];
bisectstack[bisectptr - 32] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
if bisectstack[bisectptr - 32] > 0 then
bisectstack[bisectptr - 32] := 0
end else begin
bisectstack[bisectptr - 31] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
if bisectstack[bisectptr - 31] < bisectstack[bisectptr - 35] then
bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35];
bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34];
if bisectstack[bisectptr - 32] > 0 then
bisectstack[bisectptr - 32] := 0
end;
if bisectstack[bisectptr - 15] < 0 then
if bisectstack[bisectptr - 13] >= 0 then begin
if bisectstack[bisectptr - 14] < 0 then
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
else
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 11] < 0 then
bisectstack[bisectptr - 11] := 0
end else begin
bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 12] > bisectstack[bisectptr - 15] then
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
if bisectstack[bisectptr - 11] < 0 then
bisectstack[bisectptr - 11] := 0
end
else if bisectstack[bisectptr - 13] <= 0 then begin
if bisectstack[bisectptr - 14] > 0 then
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
else
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 12] > 0 then
bisectstack[bisectptr - 12] := 0
end else begin
bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
if bisectstack[bisectptr - 11] < bisectstack[bisectptr - 15] then
bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
if bisectstack[bisectptr - 12] > 0 then
bisectstack[bisectptr - 12] := 0
end;
bisectstack[bisectptr - 40] := bisectstack[xy - 20];
bisectstack[bisectptr - 18] := bisectstack[xy - 18];
bisectstack[bisectptr - 39] := (bisectstack[bisectptr - 40] + bisectstack[xy - 19]) div 2;
bisectstack[bisectptr - 19] := (bisectstack[bisectptr - 18] + bisectstack[xy - 19]) div 2;
bisectstack[bisectptr - 38] := (bisectstack[bisectptr - 39] + bisectstack[bisectptr - 19]) div 2;
bisectstack[bisectptr - 20] := bisectstack[bisectptr - 38];
if bisectstack[bisectptr - 40] < 0 then
if bisectstack[bisectptr - 38] >= 0 then begin
if bisectstack[bisectptr - 39] < 0 then
bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]
else
bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40];
bisectstack[bisectptr - 36] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
if bisectstack[bisectptr - 36] < 0 then
bisectstack[bisectptr - 36] := 0
end else begin
bisectstack[bisectptr - 37] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
if bisectstack[bisectptr - 37] > bisectstack[bisectptr - 40] then
bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40];
bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39];
if bisectstack[bisectptr - 36] < 0 then
bisectstack[bisectptr - 36] := 0
end
else if bisectstack[bisectptr - 38] <= 0 then begin
if bisectstack[bisectptr - 39] > 0 then
bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]
else
bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40];
bisectstack[bisectptr - 37] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
if bisectstack[bisectptr - 37] > 0 then
bisectstack[bisectptr - 37] := 0
end else begin
bisectstack[bisectptr - 36] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
if bisectstack[bisectptr - 36] < bisectstack[bisectptr - 40] then
bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40];
bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39];
if bisectstack[bisectptr - 37] > 0 then
bisectstack[bisectptr - 37] := 0
end;
if bisectstack[bisectptr - 20] < 0 then
if bisectstack[bisectptr - 18] >= 0 then begin
if bisectstack[bisectptr - 19] < 0 then
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
else
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 16] < 0 then
bisectstack[bisectptr - 16] := 0
end else begin
bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 17] > bisectstack[bisectptr - 20] then
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
if bisectstack[bisectptr - 16] < 0 then
bisectstack[bisectptr - 16] := 0
end
else if bisectstack[bisectptr - 18] <= 0 then begin
if bisectstack[bisectptr - 19] > 0 then
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
else
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 17] > 0 then
bisectstack[bisectptr - 17] := 0
end else begin
bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
if bisectstack[bisectptr - 16] < bisectstack[bisectptr - 20] then
bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
if bisectstack[bisectptr - 17] > 0 then
bisectstack[bisectptr - 17] := 0
end;
uv := bisectptr - 20;
xy := bisectptr - 20;
delx := delx + delx;
dely := dely + dely;
tol := (tol - threel) + tolstep;
tol := tol + tol;
threel := threel + tolstep {:559};
goto 22
end;
if timetogo > 0 then
timetogo := timetogo - 1
else begin
while apprt < 65536 do begin
apprt := apprt + apprt;
apprtt := apprtt + apprtt
end;
curt := apprt;
curtt := apprtt;
goto 10
end; {560:}
45:
if odd(curtt) then
if odd(curt) then begin {561:}
curt := curt div 2;
curtt := curtt div 2;
if curt = 0 then
goto 10;
bisectptr := bisectptr - 45;
threel := threel - tolstep;
delx := bisectstack[bisectptr];
dely := bisectstack[bisectptr + 1];
tol := bisectstack[bisectptr + 2];
uv := bisectstack[bisectptr + 3];
xy := bisectstack[bisectptr + 4];
goto 45
end else begin {:561}
curt := curt + 1;
delx := ((delx + bisectstack[uv - 5]) + bisectstack[uv - 4]) + bisectstack[uv - 3];
dely := ((dely + bisectstack[uv - 10]) + bisectstack[uv - 9]) + bisectstack[uv - 8];
uv := uv + 20;
curtt := curtt - 1;
xy := xy - 20;
delx := ((delx + bisectstack[xy - 15]) + bisectstack[xy - 14]) + bisectstack[xy - 13];
dely := ((dely + bisectstack[xy - 20]) + bisectstack[xy - 19]) + bisectstack[xy - 18]
end
else begin
curtt := curtt + 1;
tol := tol + threel;
delx := ((delx - bisectstack[xy - 15]) - bisectstack[xy - 14]) - bisectstack[xy - 13];
dely := ((dely - bisectstack[xy - 20]) - bisectstack[xy - 19]) - bisectstack[xy - 18];
xy := xy + 20
end {:560}
end;
10:
end; {:556} {562:}
procedure pathintersection(h, hh: halfword);
label
10;
var
p, pp: halfword;
n, nn: integer; {563:}
begin
if mem[h].hh.b1 = 0 then begin
mem[h + 5].int := mem[h + 1].int;
mem[h + 3].int := mem[h + 1].int;
mem[h + 6].int := mem[h + 2].int;
mem[h + 4].int := mem[h + 2].int;
mem[h].hh.b1 := 1
end;
if mem[hh].hh.b1 = 0 then begin
mem[hh + 5].int := mem[hh + 1].int;
mem[hh + 3].int := mem[hh + 1].int;
mem[hh + 6].int := mem[hh + 2].int;
mem[hh + 4].int := mem[hh + 2].int;
mem[hh].hh.b1 := 1
end; {:563}
tolstep := 0;
repeat
n := -65536;
p := h;
repeat
if mem[p].hh.b1 <> 0 then begin
nn := -65536;
pp := hh;
repeat
if mem[pp].hh.b1 <> 0 then begin
cubicintersection(p, pp);
if curt > 0 then begin
curt := curt + n;
curtt := curtt + nn;
goto 10
end
end;
nn := nn + 65536;
pp := mem[pp].hh.rh
until pp = hh
end;
n := n + 65536;
p := mem[p].hh.rh
until p = h;
tolstep := tolstep + 3
until tolstep > 3;
curt := -65536;
curtt := -65536;
10:
end; {:562} {574:}
procedure openawindow(k: windownumber; r0, c0, r1, c1: scaled; x, y: scaled);
var
m, n: integer; {575:}
begin
if r0 < 0 then
r0 := 0
else
r0 := roundunscaled(r0);
r1 := roundunscaled(r1);
if r1 > screendepth then
r1 := screendepth;
if r1 < r0 then
if r0 > screendepth then
r0 := r1
else
r1 := r0;
if c0 < 0 then
c0 := 0
else
c0 := roundunscaled(c0);
c1 := roundunscaled(c1);
if c1 > screenwidth then
c1 := screenwidth;
if c1 < c0 then
if c0 > screenwidth then
c0 := c1
else
c1 := c0 {:575};
windowopen[k] := true;
windowtime[k] := windowtime[k] + 1;
leftcol[k] := c0;
rightcol[k] := c1;
toprow[k] := r0;
botrow[k] := r1; {576:}
m := roundunscaled(x);
n := roundunscaled(y) - 1;
mwindow[k] := c0 - m;
nwindow[k] := r0 + n {:576};
begin
if not screenstarted then begin
screenOK := initscreen;
screenstarted := true
end
end;
if screenOK then begin
blankrectangle(c0, c1, r0, r1);
updatescreen
end
end; { openawindow }
{:574}
{577:}
procedure dispedges(k: windownumber);
label
30, 40;
var
p, q: halfword;
alreadythere: boolean;
r: integer; {580:}
n: screencol;
w, ww: integer;
b: pixelcolor;
m, mm: integer;
d: integer;
madjustment: integer;
rightedge: integer;
mincol: screencol; {:580}
begin
if screenOK then
if leftcol[k] < rightcol[k] then
if toprow[k] < botrow[k] then begin
alreadythere := false;
if mem[curedges + 3].hh.rh = k then
if mem[curedges + 4].int = windowtime[k] then
alreadythere := true;
if not alreadythere then
blankrectangle(leftcol[k], rightcol[k], toprow[k], botrow[k]); {581:}
madjustment := mwindow[k] - mem[curedges + 3].hh.lh;
rightedge := 8 * (rightcol[k] - madjustment);
mincol := leftcol[k] {:581};
p := mem[curedges].hh.rh;
r := nwindow[k] - (mem[curedges + 1].hh.lh - 4096);
while (p <> curedges) and (r >= toprow[k]) do begin
if r < botrow[k] then begin {578:}
if mem[p + 1].hh.lh > (-29999) then
sortedges(p)
else if mem[p + 1].hh.lh = (-29999) then
if alreadythere then
goto 30;
mem[p + 1].hh.lh := -29999; {582:}
n := 0;
ww := 0;
m := -1;
w := 0;
q := mem[p + 1].hh.rh;
rowtransition[0] := mincol;
while true do begin
if q = 30000 then
d := rightedge
else
d := mem[q].hh.lh + 32768;
mm := (d div 8) + madjustment;
if mm <> m then begin {583:}
if w <= 0 then begin
if ww > 0 then
if m > mincol then begin
if n = 0 then
if alreadythere then begin
b := 0;
n := n + 1
end else
b := 1
else
n := n + 1;
rowtransition[n] := m
end
end else if ww <= 0 then
if m > mincol then begin
if n = 0 then
b := 1;
n := n + 1;
rowtransition[n] := m
end {:583};
m := mm;
w := ww
end;
if d >= rightedge then
goto 40;
ww := (ww + (d mod 8)) - 4;
q := mem[q].hh.rh
end;
40: {584:}
if alreadythere or (ww > 0) then begin
if n = 0 then
if ww > 0 then
b := 1
else
b := 0;
n := n + 1;
rowtransition[n] := rightcol[k]
end else if n = 0 then
goto 30 {:584}; {:582}
paintrow(r, b, rowtransition, n);
30: {:578}
end;
p := mem[p].hh.rh;
r := r - 1
end;
updatescreen;
windowtime[k] := windowtime[k] + 1;
mem[curedges + 3].hh.rh := k;
mem[curedges + 4].int := windowtime[k]
end
end; {:577} {591:}
function maxcoef(p: halfword): fraction;
var
x: fraction;
begin
x := 0;
while mem[p].hh.lh <> (-30000) do begin
if abs(mem[p + 1].int) > x then
x := abs(mem[p + 1].int);
p := mem[p].hh.rh
end;
maxcoef := x
end; {:591} {597:}
function pplusq(p: halfword; q: halfword; t: smallnumber): halfword;
label
30;
var
pp, qq: halfword;
r, s: halfword;
threshold: integer;
v: integer;
begin
if t = 17 then
threshold := 2685
else
threshold := 8;
r := 29999;
pp := mem[p].hh.lh;
qq := mem[q].hh.lh;
while true do
if pp = qq then
if pp = (-30000) then
goto 30 {598:}
else begin
v := mem[p + 1].int + mem[q + 1].int;
mem[p + 1].int := v;
s := p;
p := mem[p].hh.rh;
pp := mem[p].hh.lh;
if abs(v) < threshold then
freenode(s, 2)
else begin
if abs(v) >= 626349397 then
if watchcoefs then begin
mem[qq].hh.b0 := 0;
fixneeded := true
end;
mem[r].hh.rh := s;
r := s
end;
q := mem[q].hh.rh;
qq := mem[q].hh.lh
end {:598}
else if mem[pp + 1].int < mem[qq + 1].int then begin
s := getnode(2);
mem[s].hh.lh := qq;
mem[s + 1].int := mem[q + 1].int;
q := mem[q].hh.rh;
qq := mem[q].hh.lh;
mem[r].hh.rh := s;
r := s
end else begin
mem[r].hh.rh := p;
r := p;
p := mem[p].hh.rh;
pp := mem[p].hh.lh
end;
30:
mem[p + 1].int := slowadd(mem[p + 1].int, mem[q + 1].int);
mem[r].hh.rh := p;
depfinal := p;
pplusq := mem[29999].hh.rh
end; {:597} {599:}
function ptimesv(p: halfword; v: integer; t0, t1: smallnumber; visscaled: boolean): halfword;
var
r, s: halfword;
w: integer;
threshold: integer;
scalingdown: boolean;
begin
if t0 <> t1 then
scalingdown := true
else
scalingdown := not visscaled;
if t1 = 17 then
threshold := 1342
else
threshold := 4;
r := 29999;
while mem[p].hh.lh <> (-30000) do begin
if scalingdown then
w := takefraction(v, mem[p + 1].int)
else
w := takescaled(v, mem[p + 1].int);
if abs(w) <= threshold then begin
s := mem[p].hh.rh;
freenode(p, 2);
p := s
end else begin
if abs(w) >= 626349397 then begin
fixneeded := true;
mem[mem[p].hh.lh].hh.b0 := 0
end;
mem[r].hh.rh := p;
r := p;
mem[p + 1].int := w;
p := mem[p].hh.rh
end
end;
mem[r].hh.rh := p;
if visscaled then
mem[p + 1].int := takescaled(mem[p + 1].int, v)
else
mem[p + 1].int := takefraction(mem[p + 1].int, v);
ptimesv := mem[29999].hh.rh
end; {:599}
{601:}
function pwithxbecomingq(p, x, q: halfword; t: smallnumber): halfword;
var
r, s: halfword;
v: integer;
sx: integer;
begin
s := p;
r := 29999;
sx := mem[x + 1].int;
while mem[mem[s].hh.lh + 1].int > sx do begin
r := s;
s := mem[s].hh.rh
end;
if mem[s].hh.lh <> x then
pwithxbecomingq := p
else begin
mem[29999].hh.rh := p;
mem[r].hh.rh := mem[s].hh.rh;
v := mem[s + 1].int;
freenode(s, 2);
pwithxbecomingq := pplusfq(mem[29999].hh.rh, v, q, t, 17)
end
end; {:601} {606:}
procedure newdep(q, p: halfword);
var
r: halfword;
begin
mem[q + 1].hh.rh := p;
mem[q + 1].hh.lh := -29987;
r := mem[-29987].hh.rh;
mem[depfinal].hh.rh := r;
mem[r + 1].hh.lh := depfinal;
mem[-29987].hh.rh := q
end; {:606} {607:}
function constdependency(v: scaled): halfword;
begin
depfinal := getnode(2);
mem[depfinal + 1].int := v;
mem[depfinal].hh.lh := -30000;
constdependency := depfinal
end; {:607} {608:}
function singledependency(p: halfword): halfword;
var
q: halfword;
m: integer;
begin
m := mem[p + 1].int mod 64;
if m > 28 then
singledependency := constdependency(0)
else begin
q := getnode(2);
mem[q + 1].int := twotothe[28 - m];
mem[q].hh.lh := p;
mem[q].hh.rh := constdependency(0);
singledependency := q
end
end; {:608}
{609:}
function copydeplist(p: halfword): halfword;
label
30;
var
q: halfword;
begin
q := getnode(2);
depfinal := q;
while true do begin
mem[depfinal].hh.lh := mem[p].hh.lh;
mem[depfinal + 1].int := mem[p + 1].int;
if mem[depfinal].hh.lh = (-30000) then
goto 30;
mem[depfinal].hh.rh := getnode(2);
depfinal := mem[depfinal].hh.rh;
p := mem[p].hh.rh
end;
30:
copydeplist := q
end; {:609} {610:}
procedure lineareq(p: halfword; t: smallnumber);
var
q, r, s: halfword;
x: halfword;
n: integer;
v: integer;
prevr: halfword;
finalnode: halfword;
w: integer; {611:}
begin
q := p;
r := mem[p].hh.rh;
v := mem[q + 1].int;
while mem[r].hh.lh <> (-30000) do begin
if abs(mem[r + 1].int) > abs(v) then begin
q := r;
v := mem[r + 1].int
end;
r := mem[r].hh.rh
end {:611};
x := mem[q].hh.lh;
n := mem[x + 1].int mod 64; {612:}
s := 29999;
mem[s].hh.rh := p;
r := p;
repeat
if r = q then begin
mem[s].hh.rh := mem[r].hh.rh;
freenode(r, 2)
end else begin
w := makefraction(mem[r + 1].int, v);
if abs(w) <= 1342 then begin
mem[s].hh.rh := mem[r].hh.rh;
freenode(r, 2)
end else begin
mem[r + 1].int := -w;
s := r
end
end;
r := mem[s].hh.rh
until mem[r].hh.lh = (-30000);
if t = 18 then
mem[r + 1].int := -makescaled(mem[r + 1].int, v)
else if v <> (-268435456) then
mem[r + 1].int := -makefraction(mem[r + 1].int, v);
finalnode := r;
p := mem[29999].hh.rh {:612};
if internal[2] > 0 then {613:}
if interesting(x) then begin
begindiagnostic;
printnl(462);
printvariablename(x);
w := n;
while w > 0 do begin
print(455);
w := w - 2
end;
printchar(61);
printdependency(p, 17);
enddiagnostic(false)
end {:613};
{614:}
prevr := -29987;
r := mem[-29987].hh.rh;
while r <> (-29987) do begin
s := mem[r + 1].hh.rh;
q := pwithxbecomingq(s, x, p, mem[r].hh.b0);
if mem[q].hh.lh = (-30000) then
makeknown(r, q)
else begin
mem[r + 1].hh.rh := q;
repeat
q := mem[q].hh.rh
until mem[q].hh.lh = (-30000);
prevr := q
end;
r := mem[prevr].hh.rh
end {:614}; {615:}
if n > 0 then begin {616:}
s := 29999;
mem[29999].hh.rh := p;
r := p;
repeat
if n > 30 then
w := 0
else
w := mem[r + 1].int div twotothe[n];
if (abs(w) <= 1342) and (mem[r].hh.lh <> (-30000)) then begin
mem[s].hh.rh := mem[r].hh.rh;
freenode(r, 2)
end else begin
mem[r + 1].int := w;
s := r
end;
r := mem[s].hh.rh
until mem[s].hh.lh = (-30000);
p := mem[29999].hh.rh
end {:616};
if mem[p].hh.lh = (-30000) then begin
mem[x].hh.b0 := 16;
mem[x + 1].int := mem[p + 1].int;
if abs(mem[x + 1].int) >= 268435456 then
valtoobig(mem[x + 1].int);
freenode(p, 2);
if curexp = x then
if curtype = 19 then begin
curexp := mem[x + 1].int;
curtype := 16;
freenode(x, 2)
end
end else begin
mem[x].hh.b0 := 17;
depfinal := finalnode;
newdep(x, p);
if curexp = x then
if curtype = 19 then
curtype := 17
end {:615};
if fixneeded then
fixdependencies
end; {:610} {619:}
function newringentry(p: halfword): halfword;
var
q: halfword;
begin
q := getnode(2);
mem[q].hh.b1 := 11;
mem[q].hh.b0 := mem[p].hh.b0;
if mem[p + 1].int = (-30000) then
mem[q + 1].int := p
else
mem[q + 1].int := mem[p + 1].int;
mem[p + 1].int := q;
newringentry := q
end; {:619} {621:}
procedure nonlineareq(v: integer; p: halfword; flushp: boolean);
var
t: smallnumber;
q, r: halfword;
begin
t := mem[p].hh.b0 - 1;
q := mem[p + 1].int;
if flushp then
mem[p].hh.b0 := 1
else
p := q;
repeat
r := mem[q + 1].int;
mem[q].hh.b0 := t;
case t of
2:
mem[q + 1].int := v;
4:
begin
mem[q + 1].int := v;
begin
if strref[v] < 127 then
strref[v] := strref[v] + 1
end
end;
6:
begin
mem[q + 1].int := v;
mem[v].hh.lh := mem[v].hh.lh + 1
end;
9:
mem[q + 1].int := copypath(v);
11:
mem[q + 1].int := copyedges(v)
end;
q := r
until q = p
end; {:621} {622:}
procedure ringmerge(p, q: halfword);
label
10;
var
r: halfword;
begin
r := mem[p + 1].int;
while r <> p do begin
if r = q then begin {623:}
begin
begin
if interaction = 3 then
;
printnl(133);
print(465)
end;
begin
helpptr := 2;
helpline[1] := 466;
helpline[0] := 467
end;
putgeterror
end {:623};
goto 10
end;
r := mem[r + 1].int
end;
r := mem[p + 1].int;
mem[p + 1].int := mem[q + 1].int;
mem[q + 1].int := r;
10:
end; {:622} {626:}
procedure showcmdmod(c, m: integer);
begin
begindiagnostic;
printnl(123);
printcmdmod(c, m);
printchar(125);
enddiagnostic(false)
end; {:626} {635:}
procedure showcontext;
label
30;
var
oldsetting: 0..5; {641:}
i: 0..bufsize;
l: integer;
m: integer;
n: 0..errorline;
p: integer;
q: integer; {:641}
begin
fileptr := inputptr;
inputstack[fileptr] := curinput;
while true do begin
curinput := inputstack[fileptr]; {636:}
if (((fileptr = inputptr) or (curinput.indexfield <= 6)) or (curinput.indexfield <> 10)) or (curinput.locfield <> (-30000)) then begin
tally := 0;
oldsetting := selector;
if curinput.indexfield <= 6 then begin {637:}
if curinput.namefield <= 1 then
if (curinput.namefield = 0) and (fileptr = 0) then
printnl(469)
else
printnl(470)
else if curinput.namefield = 2 then
printnl(471)
else begin
printnl(472);
printint(line)
end;
printchar(32) {:637};
{644:}
begin
l := tally;
tally := 0;
selector := 4;
trickcount := 1000000
end;
if curinput.limitfield > 0 then
for i := curinput.startfield to curinput.limitfield - 1 do begin
if i = curinput.locfield then begin
firstcount := tally;
trickcount := ((tally + 1) + errorline) - halferrorline;
if trickcount < errorline then
trickcount := errorline
end;
print(buffer[i])
end {:644}
end else begin {638:}
if curinput.indexfield in
[7, 8, 9, 10, 11, 12] then
case curinput.indexfield of
7:
printnl(473);
8:
begin {639:}
printnl(478);
p := paramstack[curinput.limitfield];
if p <> (-30000) then
if mem[p].hh.rh = (-29999) then
printexp(p, 0)
else
showtokenlist(p, -30000, 20, tally);
print(479)
end; {:639}
9:
printnl(474);
10:
if curinput.locfield = (-30000) then
printnl(475)
else
printnl(476);
11:
printnl(477);
12:
begin
println;
if curinput.namefield <> (-30000) then
print(hash[curinput.namefield].rh) {640:}
else begin
p := paramstack[curinput.limitfield];
if p = (-30000) then
showtokenlist(paramstack[curinput.limitfield + 1], -30000, 20, tally)
else begin
q := p;
while mem[q].hh.rh <> (-30000) do
q := mem[q].hh.rh;
mem[q].hh.rh := paramstack[curinput.limitfield + 1];
showtokenlist(p, -30000, 20, tally);
mem[q].hh.rh := -30000
end
end {:640};
print(368)
end
end
else
printnl(63) {:638}; {645:}
begin
l := tally;
tally := 0;
selector := 4;
trickcount := 1000000
end;
if curinput.indexfield <> 12 then
showtokenlist(curinput.startfield, curinput.locfield, 100000, 0)
else
showmacro(curinput.startfield, curinput.locfield, 100000) {:645}
end;
selector := oldsetting; {643:}
if trickcount = 1000000 then begin
firstcount := tally;
trickcount := ((tally + 1) + errorline) - halferrorline;
if trickcount < errorline then
trickcount := errorline
end;
if tally < trickcount then
m := tally - firstcount
else
m := trickcount - firstcount;
if (l + firstcount) <= halferrorline then begin
p := 0;
n := l + firstcount
end else begin
print(146);
p := ((l + firstcount) - halferrorline) + 3;
n := halferrorline
end;
for q := p to firstcount - 1 do
printchar(trickbuf[q mod errorline]);
println;
for q := 1 to n do
printchar(32);
if (m + n) <= errorline then
p := firstcount + m
else
p := firstcount + ((errorline - n) - 3);
for q := firstcount to p - 1 do
printchar(trickbuf[q mod errorline]);
if (m + n) > errorline then
print(146) {:643}
end {:636};
if curinput.indexfield <= 6 then
if (curinput.namefield > 2) or (fileptr = 0) then
goto 30;
fileptr := fileptr - 1
end;
30:
curinput := inputstack[inputptr]
end; { showcontext }
{:635}
{649:}
procedure begintokenlist(p: halfword; t: quarterword);
begin
begin
if inputptr > maxinstack then begin
maxinstack := inputptr;
if inputptr = stacksize then
overflow(480, stacksize)
end;
inputstack[inputptr] := curinput;
inputptr := inputptr + 1
end;
curinput.startfield := p;
curinput.indexfield := t;
curinput.limitfield := paramptr;
curinput.locfield := p
end; {:649} {650:}
procedure endtokenlist;
label
30;
var
p: halfword;
begin
if curinput.indexfield >= 10 then
if curinput.indexfield <= 11 then begin
flushtokenlist(curinput.startfield);
goto 30
end else
deletemacref(curinput.startfield);
while paramptr > curinput.limitfield do begin
paramptr := paramptr - 1;
p := paramstack[paramptr];
if p <> (-30000) then
if mem[p].hh.rh = (-29999) then begin
recyclevalue(p);
freenode(p, 2)
end else
flushtokenlist(p)
end;
30:
begin
inputptr := inputptr - 1;
curinput := inputstack[inputptr]
end;
begin
if interrupt <> 0 then
pauseforinstructions
end
end; {:650} {651:}
{855:}
{856:}
procedure encapsulate(p: halfword);
begin
curexp := getnode(2);
mem[curexp].hh.b0 := curtype;
mem[curexp].hh.b1 := 11;
newdep(curexp, p)
end; { encapsulate }
{:856}
{858:}
procedure install(r, q: halfword);
var
p: halfword;
begin
if mem[q].hh.b0 = 16 then begin
mem[r + 1].int := mem[q + 1].int;
mem[r].hh.b0 := 16
end else if mem[q].hh.b0 = 19 then begin
p := singledependency(q);
if p = depfinal then begin
mem[r].hh.b0 := 16;
mem[r + 1].int := 0;
freenode(p, 2)
end else begin
mem[r].hh.b0 := 17;
newdep(r, p)
end
end else begin
mem[r].hh.b0 := mem[q].hh.b0;
newdep(r, copydeplist(mem[q + 1].hh.rh))
end
end; {:858}
procedure makeexpcopy(p: halfword);
label
20;
var
q, r, t: halfword;
begin
20:
curtype := mem[p].hh.b0;
if curtype in
[1, 2, 16, 3, 5, 7, 12, 10,
4, 6, 11, 9, 8, 13, 14, 17,
18, 15, 19] then
case curtype of
1, 2, 16:
curexp := mem[p + 1].int;
3, 5, 7, 12, 10:
curexp := newringentry(p);
4:
begin
curexp := mem[p + 1].int;
begin
if strref[curexp] < 127 then
strref[curexp] := strref[curexp] + 1
end
end;
6:
begin
curexp := mem[p + 1].int;
mem[curexp].hh.lh := mem[curexp].hh.lh + 1
end;
11:
curexp := copyedges(mem[p + 1].int);
9, 8:
curexp := copypath(mem[p + 1].int);
13, 14:
begin {857:}
if mem[p + 1].int = (-30000) then
initbignode(p);
t := getnode(2);
mem[t].hh.b1 := 11;
mem[t].hh.b0 := curtype;
initbignode(t);
q := mem[p + 1].int + bignodesize[curtype];
r := mem[t + 1].int + bignodesize[curtype];
repeat
q := q - 2;
r := r - 2;
install(r, q)
until q = mem[p + 1].int;
curexp := t
end; {:857}
17, 18:
encapsulate(copydeplist(mem[p + 1].hh.rh));
15:
begin
begin
mem[p].hh.b0 := 19;
serialno := serialno + 64;
mem[p + 1].int := serialno
end;
goto 20
end;
19:
begin
q := singledependency(p);
if q = depfinal then begin
curtype := 16;
curexp := 0;
freenode(q, 2)
end else begin
curtype := 17;
encapsulate(q)
end
end
end
else
confusion(664)
end; {:855}
function curtok: halfword;
var
p: halfword;
savetype: smallnumber;
saveexp: integer;
begin
if cursym = 0 then
if curcmd = 38 then begin
savetype := curtype;
saveexp := curexp;
makeexpcopy(curmod);
p := stashcurexp;
mem[p].hh.rh := -30000;
curtype := savetype;
curexp := saveexp
end else begin
p := getnode(2);
mem[p + 1].int := curmod;
mem[p].hh.b1 := 12;
if curcmd = 42 then
mem[p].hh.b0 := 16
else
mem[p].hh.b0 := 4
end
else begin
begin
p := avail;
if p = (-30000) then
p := getavail
else begin
avail := mem[p].hh.rh;
mem[p].hh.rh := -30000
end {dynused:=dynused+1;}
end;
mem[p].hh.lh := cursym
end;
curtok := p
end; {:651} {652:}
procedure backinput;
var
p: halfword;
s: 0..150;
begin
p := curtok;
while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
endtokenlist;
begintokenlist(p, 10)
end; {:652} {653:}
procedure backerror;
begin
OKtointerrupt := false;
backinput;
OKtointerrupt := true;
error
end; { backerror }
procedure inserror;
begin
OKtointerrupt := false;
backinput;
curinput.indexfield := 11;
OKtointerrupt := true;
error
end; {:653} {654:}
procedure beginfilereading;
begin
if inopen = 6 then
overflow(481, 6);
if first = bufsize then
overflow(128, bufsize);
inopen := inopen + 1;
begin
if inputptr > maxinstack then begin
maxinstack := inputptr;
if inputptr = stacksize then
overflow(480, stacksize)
end;
inputstack[inputptr] := curinput;
inputptr := inputptr + 1
end;
curinput.indexfield := inopen;
linestack[curinput.indexfield] := line;
curinput.startfield := first;
curinput.namefield := 0
end; {:654} {655:}
procedure endfilereading;
begin
first := curinput.startfield;
line := linestack[curinput.indexfield];
if curinput.indexfield <> inopen then
confusion(482);
if curinput.namefield > 2 then
aclose(inputfile[curinput.indexfield]);
begin
inputptr := inputptr - 1;
curinput := inputstack[inputptr]
end;
inopen := inopen - 1
end; {:655} {656:}
procedure clearforerrorprompt;
begin
while (((curinput.indexfield <= 6) and (curinput.namefield = 0)) and (inputptr > 0)) and (curinput.locfield = curinput.limitfield) do
endfilereading;
println
end; {:656} {661:}
function checkoutervalidity: boolean;
var
p: halfword;
begin
if scannerstatus = 0 then
checkoutervalidity := true
else begin
deletionsallowed := false; {662:}
if cursym <> 0 then begin
p := getavail;
mem[p].hh.lh := cursym;
begintokenlist(p, 10)
end {:662};
if scannerstatus > 1 then begin {663:}
runaway;
if cursym = 0 then begin
if interaction = 3 then
;
printnl(133);
print(488)
end else begin
begin
if interaction = 3 then
;
printnl(133);
print(489)
end
end;
print(490);
begin
helpptr := 4;
helpline[3] := 491;
helpline[2] := 492;
helpline[1] := 493;
helpline[0] := 494
end;
case scannerstatus of {664:}
2:
begin
print(495);
helpline[3] := 496;
cursym := 2235
end;
3:
begin
print(497);
helpline[3] := 498;
if warninginfo = 0 then
cursym := 2239
else begin
cursym := 2231;
eqtb[2231].rh := warninginfo
end
end;
4, 5:
begin
print(499);
if scannerstatus = 5 then
print(hash[warninginfo].rh)
else
printvariablename(warninginfo);
cursym := 2237
end;
6:
begin
print(500);
print(hash[warninginfo].rh);
print(501);
helpline[3] := 502;
cursym := 2236
end
end {:664};
inserror
end else begin {:663}
begin
if interaction = 3 then
;
printnl(133);
print(483)
end;
printint(warninginfo);
begin
helpptr := 3;
helpline[2] := 484;
helpline[1] := 485;
helpline[0] := 486
end;
if cursym = 0 then
helpline[2] := 487;
cursym := 2238;
inserror
end;
deletionsallowed := true;
checkoutervalidity := false
end
end; {:661} {666:}
procedure firmuptheline;
forward; {:666} {667:}
procedure getnext;
label
20, 10, 40, 25, 85, 86, 87, 30;
var
k: 0..bufsize;
c: ASCIIcode;
class: ASCIIcode;
n, f: integer;
begin
20:
cursym := 0;
if curinput.indexfield <= 6 then begin {669:}
25:
c := buffer[curinput.locfield];
curinput.locfield := curinput.locfield + 1;
class := charclass[c];
if class in
[0, 1, 2, 3, 4, 5, 6, 7,
8, 20] then
case class of
0:
goto 85;
1:
begin
class := charclass[buffer[curinput.locfield]];
if class > 1 then
goto 25
else if class < 1 then begin
n := 0;
goto 86
end
end;
2:
goto 25;
3:
begin {679:}
if curinput.namefield > 2 then begin {681:}
line := line + 1;
first := curinput.startfield;
if not forceeof then begin
if inputln(inputfile[curinput.indexfield], true) then
firmuptheline
else
forceeof := true
end;
if forceeof then begin
printchar(41);
forceeof := false;
flush(output);
endfilereading;
if checkoutervalidity then
goto 20
else
goto 20
end;
buffer[curinput.limitfield] := 37;
first := curinput.limitfield + 1;
curinput.locfield := curinput.startfield
end else begin {:681}
if inputptr > 0 then begin
endfilereading;
goto 20
end;
if selector < 2 then
openlogfile;
if interaction > 1 then begin
if curinput.limitfield = curinput.startfield then
printnl(517);
println;
first := curinput.startfield;
begin
print(42);
terminput
end;
curinput.limitfield := last;
buffer[curinput.limitfield] := 37;
first := curinput.limitfield + 1;
curinput.locfield := curinput.startfield
end else
fatalerror(518)
end {:679};
begin
if interrupt <> 0 then
pauseforinstructions
end;
goto 25
end;
4:
begin {671:}
if buffer[curinput.locfield] = 34 then
curmod := 155
else begin
k := curinput.locfield;
buffer[curinput.limitfield + 1] := 34;
repeat
curinput.locfield := curinput.locfield + 1
until buffer[curinput.locfield] = 34;
if curinput.locfield > curinput.limitfield then begin {672:}
curinput.locfield := curinput.limitfield;
begin
if interaction = 3 then
;
printnl(133);
print(510)
end;
begin
helpptr := 3;
helpline[2] := 511;
helpline[1] := 512;
helpline[0] := 513
end;
deletionsallowed := false;
error;
deletionsallowed := true;
goto 20
end {:672};
if curinput.locfield = (k + 1) then
curmod := buffer[k]
else begin
begin
if ((poolptr + curinput.locfield) - k) > maxpoolptr then begin
if ((poolptr + curinput.locfield) - k) > poolsize then
overflow(129, poolsize - initpoolptr);
maxpoolptr := (poolptr + curinput.locfield) - k
end
end;
repeat
begin
strpool[poolptr] := buffer[k];
poolptr := poolptr + 1
end;
k := k + 1
until k = curinput.locfield;
curmod := makestring
end
end;
curinput.locfield := curinput.locfield + 1;
curcmd := 39;
goto 10
end; {:671}
5, 6, 7, 8:
begin
k := curinput.locfield - 1;
goto 40
end;
20:
begin {670:}
begin
if interaction = 3 then
;
printnl(133);
print(507)
end;
begin
helpptr := 2;
helpline[1] := 508;
helpline[0] := 509
end;
deletionsallowed := false;
error;
deletionsallowed := true;
goto 20
end
end
else
{:670};
k := curinput.locfield - 1;
while charclass[buffer[curinput.locfield]] = class do
curinput.locfield := curinput.locfield + 1;
goto 40;
85: {673:}
n := c - 48;
while charclass[buffer[curinput.locfield]] = 0 do begin
if n < 4096 then
n := ((10 * n) + buffer[curinput.locfield]) - 48;
curinput.locfield := curinput.locfield + 1
end;
if buffer[curinput.locfield] = 46 then
if charclass[buffer[curinput.locfield + 1]] = 0 then
goto 30;
f := 0;
goto 87;
30:
curinput.locfield := curinput.locfield + 1 {:673};
86: {674:}
k := 0;
repeat
if k < 17 then begin
dig[k] := buffer[curinput.locfield] - 48;
k := k + 1
end;
curinput.locfield := curinput.locfield + 1
until charclass[buffer[curinput.locfield]] <> 0;
f := rounddecimals(k);
if f = 65536 then begin
n := n + 1;
f := 0
end {:674};
87: {675:}
if n < 4096 then
curmod := (n * 65536) + f
else begin
begin
if interaction = 3 then
;
printnl(133);
print(514)
end;
begin
helpptr := 2;
helpline[1] := 515;
helpline[0] := 516
end;
deletionsallowed := false;
error;
deletionsallowed := true;
curmod := 268435455
end;
curcmd := 42;
goto 10 {:675};
40:
cursym := idlookup(k, curinput.locfield - k)
end else if curinput.locfield >= himemmin then begin {:669} {676:}
cursym := mem[curinput.locfield].hh.lh;
curinput.locfield := mem[curinput.locfield].hh.rh;
if cursym >= 2242 then
if cursym >= 2392 then begin {677:}
if cursym >= 2542 then
cursym := cursym - 150;
begintokenlist(paramstack[(curinput.limitfield + cursym) - 2392], 9);
goto 20
end else begin {:677}
curcmd := 38;
curmod := paramstack[(curinput.limitfield + cursym) - 2242];
cursym := 0;
goto 10
end
end else if curinput.locfield > (-30000) then begin {678:}
if mem[curinput.locfield].hh.b1 = 12 then begin
curmod := mem[curinput.locfield + 1].int;
if mem[curinput.locfield].hh.b0 = 16 then
curcmd := 42
else begin
curcmd := 39;
begin
if strref[curmod] < 127 then
strref[curmod] := strref[curmod] + 1
end
end
end else begin
curmod := curinput.locfield;
curcmd := 38
end;
curinput.locfield := mem[curinput.locfield].hh.rh;
goto 10
end else begin {:678}
endtokenlist;
goto 20
end {:676}; {668:}
curcmd := eqtb[cursym].lh;
curmod := eqtb[cursym].rh;
if curcmd >= 83 then
if checkoutervalidity then
curcmd := curcmd - 83
else
goto 20 {:668};
10:
end; {:667} {682:}
procedure firmuptheline;
var
k: 0..bufsize;
begin
curinput.limitfield := last;
if internal[31] > 0 then
if interaction > 1 then begin
println;
if curinput.startfield < curinput.limitfield then
for k := curinput.startfield to curinput.limitfield - 1 do
print(buffer[k]);
first := curinput.limitfield;
begin
print(519);
terminput
end;
if last > first then begin
for k := first to last - 1 do
buffer[(k + curinput.startfield) - first] := buffer[k];
curinput.limitfield := (curinput.startfield + last) - first
end
end
end; {:682}
{685:}
function scantoks(terminator: commandcode; substlist, tailend: halfword; suffixcount: smallnumber): halfword;
label
30, 40;
var
p: halfword;
q: halfword;
balance: integer;
begin
p := 29998;
balance := 1;
mem[29998].hh.rh := -30000;
while true do begin
getnext;
if cursym > 0 then begin {686:}
begin
q := substlist;
while q <> (-30000) do begin
if mem[q].hh.lh = cursym then begin
cursym := mem[q + 1].int;
curcmd := 7;
goto 40
end;
q := mem[q].hh.rh
end;
40: {:686}
end;
if curcmd = terminator then {687:}
if curmod > 0 then
balance := balance + 1
else begin
balance := balance - 1;
if balance = 0 then
goto 30
end {:687}
else if curcmd = 61 then begin {690:}
if curmod = 0 then
getnext
else if curmod <= suffixcount then
cursym := 2391 + curmod
end {:690}
end;
mem[p].hh.rh := curtok;
p := mem[p].hh.rh
end;
30:
mem[p].hh.rh := tailend;
flushnodelist(substlist);
scantoks := mem[29998].hh.rh
end; {:685} {691:}
procedure getsymbol;
label
20;
begin
20:
getnext;
if (cursym = 0) or (cursym > 2229) then begin
begin
if interaction = 3 then
;
printnl(133);
print(531)
end;
begin
helpptr := 3;
helpline[2] := 532;
helpline[1] := 533;
helpline[0] := 534
end;
if cursym > 0 then
helpline[2] := 535
else if curcmd = 39 then begin
if strref[curmod] < 127 then
if strref[curmod] > 1 then
strref[curmod] := strref[curmod] - 1
else
flushstring(curmod)
end;
cursym := 2229;
inserror;
goto 20
end
end; { getsymbol }
{:691}
{692:}
procedure getclearsymbol;
begin
getsymbol;
clearsymbol(cursym, false)
end; {:692} {693:}
procedure checkequals;
begin
if curcmd <> 51 then
if curcmd <> 77 then begin
missingerr(61);
begin
helpptr := 5;
helpline[4] := 536;
helpline[3] := 537;
helpline[2] := 538;
helpline[1] := 539;
helpline[0] := 540
end;
backerror
end
end; {:693} {694:}
procedure makeopdef;
var
m: commandcode;
p, q, r: halfword;
begin
m := curmod;
getsymbol;
q := getnode(2);
mem[q].hh.lh := cursym;
mem[q + 1].int := 2242;
getclearsymbol;
warninginfo := cursym;
getsymbol;
p := getnode(2);
mem[p].hh.lh := cursym;
mem[p + 1].int := 2243;
mem[p].hh.rh := q;
getnext;
checkequals;
scannerstatus := 5;
q := getavail;
mem[q].hh.lh := -30000;
r := getavail;
mem[q].hh.rh := r;
mem[r].hh.lh := 0;
mem[r].hh.rh := scantoks(16, p, -30000, 0);
scannerstatus := 0;
eqtb[warninginfo].lh := m;
eqtb[warninginfo].rh := q;
getxnext
end; {:694}
{697:}
{1032:}
procedure checkdelimiter(ldelim, rdelim: halfword);
label
10;
begin
if curcmd = 62 then
if curmod = ldelim then
goto 10;
if cursym <> rdelim then begin
missingerr(hash[rdelim].rh);
begin
helpptr := 2;
helpline[1] := 786;
helpline[0] := 787
end;
backerror
end else begin
begin
if interaction = 3 then
;
printnl(133);
print(788)
end;
print(hash[rdelim].rh);
print(789);
begin
helpptr := 3;
helpline[2] := 790;
helpline[1] := 791;
helpline[0] := 792
end;
error
end;
10:
end; {:1032} {1011:}
function scandeclaredvariable: halfword;
label
30;
var
x: halfword;
h, t: halfword;
l: halfword;
begin
getsymbol;
x := cursym;
if curcmd <> 41 then
clearsymbol(x, false);
if eqtb[x].rh = (-30000) then
newroot(x);
h := getavail;
mem[h].hh.lh := x;
t := h;
while true do begin
getxnext;
if cursym = 0 then
goto 30;
if curcmd <> 41 then
if curcmd <> 40 then
if curcmd = 63 then begin {1012:}
l := cursym;
getxnext;
if curcmd <> 64 then begin
backinput;
cursym := l;
curcmd := 63;
goto 30
end else
cursym := 0
end else {:1012}
goto 30;
mem[t].hh.rh := getavail;
t := mem[t].hh.rh;
mem[t].hh.lh := cursym
end;
30:
scandeclaredvariable := h
end; {:1011}
procedure scandef;
var
m: 1..2;
n: 0..3;
k: 0..150;
c: 0..7;
r: halfword;
q: halfword;
p: halfword;
base: halfword;
ldelim, rdelim: halfword;
begin
m := curmod;
c := 0;
mem[29998].hh.rh := -30000;
q := getavail;
mem[q].hh.lh := -30000;
r := -30000; {700:}
if m = 1 then begin
getclearsymbol;
warninginfo := cursym;
getnext;
scannerstatus := 5;
n := 0;
eqtb[warninginfo].lh := 10;
eqtb[warninginfo].rh := q
end else begin
p := scandeclaredvariable;
flushvariable(eqtb[mem[p].hh.lh].rh, mem[p].hh.rh, true);
warninginfo := findvariable(p);
flushlist(p);
if warninginfo = (-30000) then begin {701:}
begin
if interaction = 3 then
;
printnl(133);
print(547)
end;
begin
helpptr := 2;
helpline[1] := 548;
helpline[0] := 549
end;
error;
warninginfo := -29979
end {:701};
scannerstatus := 4;
n := 2;
if curcmd = 61 then
if curmod = 3 then begin
n := 3;
getnext
end;
mem[warninginfo].hh.b0 := 20 + n;
mem[warninginfo + 1].int := q
end {:700};
k := n;
if curcmd = 31 then {703:}
repeat
ldelim := cursym;
rdelim := curmod;
getnext;
if (curcmd = 56) and (curmod >= 2242) then
base := curmod
else begin
begin
if interaction = 3 then
;
printnl(133);
print(550)
end;
begin
helpptr := 1;
helpline[0] := 551
end;
backerror;
base := 2242
end; {704:}
repeat
mem[q].hh.rh := getavail;
q := mem[q].hh.rh;
mem[q].hh.lh := base + k;
getsymbol;
p := getnode(2);
mem[p + 1].int := base + k;
mem[p].hh.lh := cursym;
if k = 150 then
overflow(552, 150);
k := k + 1;
mem[p].hh.rh := r;
r := p;
getnext
until curcmd <> 79 {:704};
checkdelimiter(ldelim, rdelim);
getnext
until curcmd <> 31 {:703};
if curcmd = 56 then begin {705:}
p := getnode(2);
if curmod < 2242 then begin
c := curmod;
mem[p + 1].int := 2242 + k
end else begin
mem[p + 1].int := curmod + k;
if curmod = 2242 then
c := 4
else if curmod = 2392 then
c := 6
else
c := 7
end;
if k = 150 then
overflow(552, 150);
k := k + 1;
getsymbol;
mem[p].hh.lh := cursym;
mem[p].hh.rh := r;
r := p;
getnext;
if c = 4 then
if curcmd = 69 then begin
c := 5;
p := getnode(2);
if k = 150 then
overflow(552, 150);
mem[p + 1].int := 2242 + k;
getsymbol;
mem[p].hh.lh := cursym;
mem[p].hh.rh := r;
r := p;
getnext
end
end {:705};
checkequals;
p := getavail;
mem[p].hh.lh := c;
mem[q].hh.rh := p; {698:}
if m = 1 then
mem[p].hh.rh := scantoks(16, r, -30000, n)
else begin
q := getavail;
mem[q].hh.lh := bgloc;
mem[p].hh.rh := q;
p := getavail;
mem[p].hh.lh := egloc;
mem[q].hh.rh := scantoks(16, r, p, n)
end;
if warninginfo = (-29979) then
flushtokenlist(mem[-29978].int) {:698};
scannerstatus := 0;
getxnext
end; {:697} {706:}
procedure scanprimary;
forward;
procedure scansecondary;
forward;
procedure scantertiary;
forward;
procedure scanexpression;
forward;
procedure scansuffix;
forward; {720:}
{722:}
procedure printmacroname(a, n: halfword);
var
p, q: halfword;
begin
if n <> (-30000) then
print(hash[n].rh)
else begin
p := mem[a].hh.lh;
if p = (-30000) then
print(hash[mem[mem[mem[a].hh.rh].hh.lh].hh.lh].rh)
else begin
q := p;
while mem[q].hh.rh <> (-30000) do
q := mem[q].hh.rh;
mem[q].hh.rh := mem[mem[a].hh.rh].hh.lh;
showtokenlist(p, -30000, 1000, 0);
mem[q].hh.rh := -30000
end
end
end; {:722} {723:}
procedure printarg(q: halfword; n: integer; b: halfword);
begin
if mem[q].hh.rh = (-29999) then
printnl(365)
else if (b < 2542) and (b <> 7) then
printnl(366)
else
printnl(367);
printint(n);
print(568);
if mem[q].hh.rh = (-29999) then
printexp(q, 1)
else
showtokenlist(q, -30000, 1000, 0)
end; {:723} {730:}
procedure scantextarg(ldelim, rdelim: halfword);
label
30;
var
balance: integer;
p: halfword;
begin
warninginfo := ldelim;
scannerstatus := 3;
p := 29998;
balance := 1;
mem[29998].hh.rh := -30000;
while true do begin
getnext;
if ldelim = 0 then begin {732:}
if curcmd > 79 then begin
if balance = 1 then
goto 30
else if curcmd = 81 then
balance := balance - 1
end else if curcmd = 32 then
balance := balance + 1
end else begin {:732} {731:}
if curcmd = 62 then begin
if curmod = ldelim then begin
balance := balance - 1;
if balance = 0 then
goto 30
end
end else if curcmd = 31 then
if curmod = rdelim then
balance := balance + 1
end {:731};
mem[p].hh.rh := curtok;
p := mem[p].hh.rh
end;
30:
curexp := mem[29998].hh.rh;
curtype := 20;
scannerstatus := 0
end; {:730}
procedure macrocall(defref, arglist, macroname: halfword);
label
40;
var
r: halfword;
p, q: halfword;
n: integer;
ldelim, rdelim: halfword;
tail: halfword;
begin
r := mem[defref].hh.rh;
mem[defref].hh.lh := mem[defref].hh.lh + 1;
if arglist = (-30000) then
n := 0 {724:}
else begin
n := 1;
tail := arglist;
while mem[tail].hh.rh <> (-30000) do begin
n := n + 1;
tail := mem[tail].hh.rh
end
end {:724};
if internal[9] > 0 then begin {721:}
begindiagnostic;
println;
printmacroname(arglist, macroname);
if n = 3 then
print(530);
showmacro(defref, -30000, 100000);
if arglist <> (-30000) then begin
n := 0;
p := arglist;
repeat
q := mem[p].hh.lh;
printarg(q, n, 0);
n := n + 1;
p := mem[p].hh.rh
until p = (-30000)
end;
enddiagnostic(false)
end {:721}; {725:}
curcmd := 80;
while mem[r].hh.lh >= 2242 do begin {726:}
if curcmd <> 79 then begin
getxnext;
if curcmd <> 31 then begin
begin
if interaction = 3 then
;
printnl(133);
print(574)
end;
printmacroname(arglist, macroname);
begin
helpptr := 3;
helpline[2] := 575;
helpline[1] := 576;
helpline[0] := 577
end;
if mem[r].hh.lh >= 2392 then begin
curexp := -30000;
curtype := 20
end else begin
curexp := 0;
curtype := 16
end;
backerror;
curcmd := 62;
goto 40
end;
ldelim := cursym;
rdelim := curmod
end; {729:}
if mem[r].hh.lh >= 2542 then
scantextarg(ldelim, rdelim)
else begin
getxnext;
if mem[r].hh.lh >= 2392 then
scansuffix
else
scanexpression
end {:729};
if curcmd <> 79 then {727:}
if (curcmd <> 62) or (curmod <> ldelim) then
if mem[mem[r].hh.rh].hh.lh >= 2242 then begin
missingerr(44);
begin
helpptr := 3;
helpline[2] := 578;
helpline[1] := 579;
helpline[0] := 573
end;
backerror;
curcmd := 79
end else begin
missingerr(hash[rdelim].rh);
begin
helpptr := 2;
helpline[1] := 580;
helpline[0] := 573
end;
backerror
end {:727};
40: {728:}
begin
p := getavail;
if curtype = 20 then
mem[p].hh.lh := curexp
else
mem[p].hh.lh := stashcurexp;
if internal[9] > 0 then begin
begindiagnostic;
printarg(mem[p].hh.lh, n, mem[r].hh.lh);
enddiagnostic(false)
end;
if arglist = (-30000) then
arglist := p
else
mem[tail].hh.rh := p;
tail := p;
n := n + 1
end {:728} {:726};
r := mem[r].hh.rh
end;
if curcmd = 79 then begin
begin
if interaction = 3 then
;
printnl(133);
print(569)
end;
printmacroname(arglist, macroname);
printchar(59);
printnl(570);
print(hash[rdelim].rh);
print(170);
begin
helpptr := 3;
helpline[2] := 571;
helpline[1] := 572;
helpline[0] := 573
end;
error
end;
if mem[r].hh.lh <> 0 then begin {733:}
if mem[r].hh.lh < 7 then begin
getxnext;
if mem[r].hh.lh <> 6 then
if (curcmd = 51) or (curcmd = 77) then
getxnext
end;
case mem[r].hh.lh of
1:
scanprimary;
2:
scansecondary;
3:
scantertiary;
4:
scanexpression;
5:
begin {734:}
scanexpression;
p := getavail;
mem[p].hh.lh := stashcurexp;
if internal[9] > 0 then begin
begindiagnostic;
printarg(mem[p].hh.lh, n, 0);
enddiagnostic(false)
end;
if arglist = (-30000) then
arglist := p
else
mem[tail].hh.rh := p;
tail := p;
n := n + 1;
if curcmd <> 69 then begin
missingerr(347);
print(581);
printmacroname(arglist, macroname);
begin
helpptr := 1;
helpline[0] := 582
end;
backerror
end;
getxnext;
scanprimary
end; {:734}
6:
begin {735:}
if curcmd <> 31 then
ldelim := -30000
else begin
ldelim := cursym;
rdelim := curmod;
getxnext
end;
scansuffix;
if ldelim <> (-30000) then begin
if (curcmd <> 62) or (curmod <> ldelim) then begin
missingerr(hash[rdelim].rh);
begin
helpptr := 2;
helpline[1] := 580;
helpline[0] := 573
end;
backerror
end;
getxnext
end
end; {:735}
7:
scantextarg(0, 0)
end;
backinput; {728:}
begin
p := getavail;
if curtype = 20 then
mem[p].hh.lh := curexp
else
mem[p].hh.lh := stashcurexp;
if internal[9] > 0 then begin
begindiagnostic;
printarg(mem[p].hh.lh, n, mem[r].hh.lh);
enddiagnostic(false)
end;
if arglist = (-30000) then
arglist := p
else
mem[tail].hh.rh := p;
tail := p;
n := n + 1
end {:728}
end {:733};
r := mem[r].hh.rh {:725}; {736:}
while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
endtokenlist;
if (paramptr + n) > maxparamstack then begin
maxparamstack := paramptr + n;
if maxparamstack > 150 then
overflow(552, 150)
end;
begintokenlist(defref, 12);
curinput.namefield := macroname;
curinput.locfield := r;
if n > 0 then begin
p := arglist;
repeat
paramstack[paramptr] := mem[p].hh.lh;
paramptr := paramptr + 1;
p := mem[p].hh.rh
until p = (-30000);
flushlist(arglist)
end {:736}
end; {:720}
procedure getboolean;
forward;
procedure passtext;
forward;
procedure conditional;
forward;
procedure startinput;
forward;
procedure beginiteration;
forward;
procedure resumeiteration;
forward;
procedure stopiteration;
forward; {:706} {707:}
procedure expand;
var
p: halfword;
k: integer;
j: poolpointer;
begin
if internal[7] > 65536 then
if curcmd <> 10 then
showcmdmod(curcmd, curmod);
case curcmd of
1:
conditional;
2: {751:}
if curmod > iflimit then
if iflimit = 1 then begin
missingerr(58);
backinput;
cursym := 2234;
inserror
end else begin
begin
if interaction = 3 then
;
printnl(133);
print(589)
end;
printcmdmod(2, curmod);
begin
helpptr := 1;
helpline[0] := 590
end;
error
end
else begin
while curmod <> 2 do
passtext;
{745:}
begin
p := condptr;
ifline := mem[p + 1].int;
curif := mem[p].hh.b1;
iflimit := mem[p].hh.b0;
condptr := mem[p].hh.rh;
freenode(p, 2)
end {:745}
end {:751};
3: {711:}
if curmod > 0 then
forceeof := true
else {:711}
startinput;
4:
if curmod = 0 then begin {708:}
begin
if interaction = 3 then
;
printnl(133);
print(553)
end;
begin
helpptr := 2;
helpline[1] := 554;
helpline[0] := 555
end;
error
end else {:708}
beginiteration;
5:
begin {712:}
while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
endtokenlist;
if loopptr = (-30000) then begin
begin
if interaction = 3 then
;
printnl(133);
print(557)
end;
begin
helpptr := 2;
helpline[1] := 558;
helpline[0] := 559
end;
error
end else
resumeiteration
end; {:712}
6:
begin {713:}
getboolean;
if internal[7] > 65536 then
showcmdmod(33, curexp);
if curexp = 30 then
if loopptr = (-30000) then begin
begin
if interaction = 3 then
;
printnl(133);
print(560)
end;
begin
helpptr := 1;
helpline[0] := 561
end;
if curcmd = 80 then
error
else
backerror
end else begin {714:}
p := -30000;
repeat
if curinput.indexfield <= 6 then
endfilereading
else begin
if curinput.indexfield <= 8 then
p := curinput.startfield;
endtokenlist
end
until p <> (-30000);
if p <> mem[loopptr].hh.lh then
fatalerror(564);
stopiteration
end {:714}
else if curcmd <> 80 then begin
missingerr(59);
begin
helpptr := 2;
helpline[1] := 562;
helpline[0] := 563
end;
backerror
end
end; {:713}
7:
;
9:
begin {715:}
getnext;
p := curtok;
getnext;
if curcmd < 11 then
expand
else
backinput;
begintokenlist(p, 10)
end; {:715}
8:
begin {716:}
getxnext;
scanprimary;
if curtype <> 4 then begin
disperr(-30000, 565);
begin
helpptr := 2;
helpline[1] := 566;
helpline[0] := 567
end;
putgetflusherror(0)
end else begin
backinput;
if (strstart[curexp + 1] - strstart[curexp]) > 0 then begin {717:}
beginfilereading;
curinput.namefield := 2;
k := first + (strstart[curexp + 1] - strstart[curexp]);
if k >= maxbufstack then begin
if k >= bufsize then begin
maxbufstack := bufsize;
overflow(128, bufsize)
end;
maxbufstack := k + 1
end;
j := strstart[curexp];
curinput.limitfield := k;
while first < curinput.limitfield do begin
buffer[first] := strpool[j];
j := j + 1;
first := first + 1
end;
buffer[curinput.limitfield] := 37;
first := curinput.limitfield + 1;
curinput.locfield := curinput.startfield;
flushcurexp(0)
end {:717}
end
end; {:716}
10:
macrocall(curmod, -30000, cursym)
end
end; {:707} {718:}
procedure getxnext;
var
saveexp: halfword;
begin
getnext;
if curcmd < 11 then begin
saveexp := stashcurexp;
repeat
if curcmd = 10 then
macrocall(curmod, -30000, cursym)
else
expand;
getnext
until curcmd >= 11;
unstashcurexp(saveexp)
end
end; {:718} {737:}
procedure stackargument(p: halfword);
begin
if paramptr = maxparamstack then begin
maxparamstack := maxparamstack + 1;
if maxparamstack > 150 then
overflow(552, 150)
end;
paramstack[paramptr] := p;
paramptr := paramptr + 1
end; {:737} {742:}
procedure passtext;
label
30;
var
l: integer;
begin
scannerstatus := 1;
l := 0;
warninginfo := line;
while true do begin
getnext;
if curcmd <= 2 then
if curcmd < 2 then
l := l + 1
else begin
if l = 0 then
goto 30;
if curmod = 2 then
l := l - 1
end {743:}
else if curcmd = 39 then begin
if strref[curmod] < 127 then
if strref[curmod] > 1 then
strref[curmod] := strref[curmod] - 1
else
flushstring(curmod)
end {:743}
end;
30:
scannerstatus := 0
end; {:742} {746:}
procedure changeiflimit(l: smallnumber; p: halfword);
label
10;
var
q: halfword;
begin
if p = condptr then
iflimit := l
else begin
q := condptr;
while true do begin
if q = (-30000) then
confusion(583);
if mem[q].hh.rh = p then begin
mem[q].hh.b0 := l;
goto 10
end;
q := mem[q].hh.rh
end
end;
10:
end; {:746} {747:}
procedure checkcolon;
begin
if curcmd <> 78 then begin
missingerr(58);
begin
helpptr := 2;
helpline[1] := 586;
helpline[0] := 563
end;
backerror
end
end; {:747} {748:}
procedure conditional;
label
10, 30, 21, 40;
var
savecondptr: halfword;
newiflimit: 2..4;
p: halfword; {744:}
begin
begin
p := getnode(2);
mem[p].hh.rh := condptr;
mem[p].hh.b0 := iflimit;
mem[p].hh.b1 := curif;
mem[p + 1].int := ifline;
condptr := p;
iflimit := 1;
ifline := line;
curif := 1
end {:744};
savecondptr := condptr;
21:
getboolean;
newiflimit := 4;
if internal[7] > 65536 then begin {750:}
begindiagnostic;
if curexp = 30 then
print(587)
else
print(588);
enddiagnostic(false)
end {:750};
40:
checkcolon;
if curexp = 30 then begin
changeiflimit(newiflimit, savecondptr);
goto 10
end; {749:}
while true do begin
passtext;
if condptr = savecondptr then
goto 30
else if curmod = 2 then begin {745:}
p := condptr;
ifline := mem[p + 1].int;
curif := mem[p].hh.b1;
iflimit := mem[p].hh.b0;
condptr := mem[p].hh.rh;
freenode(p, 2)
end {:745}
end {:749};
30:
curif := curmod;
ifline := line;
if curmod = 2 then begin {745:}
p := condptr;
ifline := mem[p + 1].int;
curif := mem[p].hh.b1;
iflimit := mem[p].hh.b0;
condptr := mem[p].hh.rh;
freenode(p, 2)
end else if curmod = 4 then {:745}
goto 21
else begin
curexp := 30;
newiflimit := 2;
getxnext;
goto 40
end;
10:
end; {:748} {754:}
procedure badfor(s: strnumber);
begin
disperr(-30000, 591);
print(s);
print(177);
begin
helpptr := 4;
helpline[3] := 592;
helpline[2] := 593;
helpline[1] := 594;
helpline[0] := 179
end;
putgetflusherror(0)
end; {:754} {755:}
procedure beginiteration;
label
22, 30, 40;
var
m: halfword;
n: halfword;
p, q, s, pp: halfword;
begin
m := curmod;
n := cursym;
s := getnode(2);
if m = 1 then begin
mem[s + 1].hh.lh := -29999;
p := -30000;
getxnext;
goto 40
end;
getsymbol;
p := getnode(2);
mem[p].hh.lh := cursym;
mem[p + 1].int := m;
getxnext;
if (curcmd <> 51) and (curcmd <> 77) then begin
missingerr(61);
begin
helpptr := 3;
helpline[2] := 595;
helpline[1] := 538;
helpline[0] := 596
end;
backerror
end;
{764:}
mem[s + 1].hh.lh := -30000;
q := s + 1;
mem[q].hh.rh := -30000;
repeat
getxnext;
if m <> 2242 then
scansuffix
else begin
if curcmd >= 78 then
if curcmd <= 79 then
goto 22;
scanexpression;
if curcmd = 74 then
if q = (s + 1) then begin {765:}
if curtype <> 16 then
badfor(602);
pp := getnode(4);
mem[pp + 1].int := curexp;
getxnext;
scanexpression;
if curtype <> 16 then
badfor(603);
mem[pp + 2].int := curexp;
if curcmd <> 75 then begin
missingerr(357);
begin
helpptr := 2;
helpline[1] := 604;
helpline[0] := 605
end;
backerror
end;
getxnext;
scanexpression;
if curtype <> 16 then
badfor(606);
mem[pp + 3].int := curexp;
mem[s + 1].hh.lh := pp;
goto 30
end {:765};
curexp := stashcurexp
end;
mem[q].hh.rh := getavail;
q := mem[q].hh.rh;
mem[q].hh.lh := curexp;
curtype := 1;
22:
until curcmd <> 79;
30: {:764}
;
40: {756:}
if curcmd <> 78 then begin
missingerr(58);
begin
helpptr := 3;
helpline[2] := 597;
helpline[1] := 598;
helpline[0] := 599
end;
backerror
end {:756}; {758:}
q := getavail;
mem[q].hh.lh := 2230;
scannerstatus := 6;
warninginfo := n;
mem[s].hh.lh := scantoks(4, p, q, 0);
scannerstatus := 0;
mem[s].hh.rh := loopptr;
loopptr := s {:758};
resumeiteration
end; {:755} {760:}
procedure resumeiteration;
label
45, 10;
var
p, q: halfword;
begin
p := mem[loopptr + 1].hh.lh;
if p > (-29999) then begin
curexp := mem[p + 1].int; {761:}
if ((mem[p + 2].int > 0) and (curexp > mem[p + 3].int)) or ((mem[p + 2].int < 0) and (curexp < mem[p + 3].int)) then {:761}
goto 45;
curtype := 16;
q := stashcurexp;
mem[p + 1].int := curexp + mem[p + 2].int
end else if p < (-29999) then begin
p := mem[loopptr + 1].hh.rh;
if p = (-30000) then
goto 45;
mem[loopptr + 1].hh.rh := mem[p].hh.rh;
q := mem[p].hh.lh;
begin
mem[p].hh.rh := avail;
avail := p
end {dynused:=dynused-1;}
end else begin
begintokenlist(mem[loopptr].hh.lh, 7);
goto 10
end;
begintokenlist(mem[loopptr].hh.lh, 8);
stackargument(q);
if internal[7] > 65536 then begin {762:}
begindiagnostic;
printnl(601);
if (q <> (-30000)) and (mem[q].hh.rh = (-29999)) then
printexp(q, 1)
else
showtokenlist(q, -30000, 50, 0);
printchar(125);
enddiagnostic(false)
end {:762};
goto 10;
45:
stopiteration;
10:
end; {:760} {763:}
procedure stopiteration;
var
p, q: halfword;
begin
p := mem[loopptr + 1].hh.lh;
if p > (-29999) then
freenode(p, 4)
else if p < (-29999) then begin
q := mem[loopptr + 1].hh.rh;
while q <> (-30000) do begin
p := mem[q].hh.lh;
if p <> (-30000) then
if mem[p].hh.rh = (-29999) then begin
recyclevalue(p);
freenode(p, 2)
end else
flushtokenlist(p);
p := q;
q := mem[q].hh.rh;
begin
mem[p].hh.rh := avail;
avail := p
end {dynused:=dynused-1;}
end
end;
p := loopptr;
loopptr := mem[p].hh.rh;
flushtokenlist(mem[p].hh.lh);
freenode(p, 2)
end; {:763} {770:}
procedure beginname;
begin
areadelimiter := 0;
extdelimiter := 0
end; {:770} {771:}
function morename(c: ASCIIcode): boolean;
begin
if (c = 32) or (c = 9) then
morename := false
else begin
if c = 47 then begin
areadelimiter := poolptr;
extdelimiter := 0
end else if (c = 46) and (extdelimiter = 0) then
extdelimiter := poolptr;
begin
if (poolptr + 1) > maxpoolptr then begin
if (poolptr + 1) > poolsize then
overflow(129, poolsize - initpoolptr);
maxpoolptr := poolptr + 1
end
end;
begin
strpool[poolptr] := c;
poolptr := poolptr + 1
end;
morename := true
end
end; { morename }
{:771}
{772:}
procedure endname;
begin
if (strptr + 3) > maxstrptr then begin
if (strptr + 3) > maxstrings then
overflow(130, maxstrings - initstrptr);
maxstrptr := strptr + 3
end;
if areadelimiter = 0 then
curarea := 155
else begin
curarea := strptr;
strptr := strptr + 1;
strstart[strptr] := areadelimiter + 1
end;
if extdelimiter = 0 then begin
curext := 155;
curname := makestring
end else begin
curname := strptr;
strptr := strptr + 1;
strstart[strptr] := extdelimiter;
curext := makestring
end
end; {:772} {774:}
procedure packfilename(n, a, e: strnumber);
var
k: integer;
c: ASCIIcode;
j: poolpointer;
begin
k := 0;
for j := strstart[a] to strstart[a + 1] - 1 do begin
c := strpool[j];
k := k + 1;
if k <= filenamesize then
nameoffile[k] := xchr[c]
end;
for j := strstart[n] to strstart[n + 1] - 1 do begin
c := strpool[j];
k := k + 1;
if k <= filenamesize then
nameoffile[k] := xchr[c]
end;
for j := strstart[e] to strstart[e + 1] - 1 do begin
c := strpool[j];
k := k + 1;
if k <= filenamesize then
nameoffile[k] := xchr[c]
end;
if k <= filenamesize then
namelength := k
else
namelength := filenamesize;
for k := namelength + 1 to filenamesize do
nameoffile[k] := ' '
end; {:774}
{778:}
procedure packbufferedname(n: smallnumber; a, b: integer);
var
k: integer;
c: ASCIIcode;
j: integer;
begin
if (((n + b) - a) + 6) > filenamesize then
b := ((a + filenamesize) - n) - 6;
k := 0;
for j := 1 to n do begin
c := xord[MFbasedefault[j]];
k := k + 1;
if k <= filenamesize then
nameoffile[k] := xchr[c]
end;
for j := a to b do begin
c := buffer[j];
k := k + 1;
if k <= filenamesize then
nameoffile[k] := xchr[c]
end;
for j := 6 to 10 do begin
c := xord[MFbasedefault[j]];
k := k + 1;
if k <= filenamesize then
nameoffile[k] := xchr[c]
end;
if k <= filenamesize then
namelength := k
else
namelength := filenamesize;
for k := namelength + 1 to filenamesize do
nameoffile[k] := ' '
end; {:778}
{780:}
function makenamestring: strnumber;
var
k, kstart: 1..filenamesize;
begin
k := 1;
while (k < filenamesize) and (xord[realnameoffile[k]] <> 32) do
k := k + 1;
namelength := k - 1;
if ((poolptr + namelength) > poolsize) or (strptr = maxstrings) then
makenamestring := 63
else begin
if (xord[realnameoffile[1]] = 46) and (xord[realnameoffile[2]] = 47) then
kstart := 3
else
kstart := 1;
for k := kstart to namelength do begin
strpool[poolptr] := xord[realnameoffile[k]];
poolptr := poolptr + 1
end;
makenamestring := makestring
end
end;
function amakenamestring(var f: alphafile): strnumber;
begin
amakenamestring := makenamestring
end; { amakenamestring }
function bmakenamestring(var f: bytefile): strnumber;
begin
bgetname(f, realnameoffile);
bmakenamestring := makenamestring
end; { bmakenamestring }
function wmakenamestring(var f: wordfile): strnumber;
begin
wmakenamestring := makenamestring
end; {:780} {781:}
procedure scanfilename;
label
30;
begin
beginname;
while (buffer[curinput.locfield] = 32) or (buffer[curinput.locfield] = 9) do
curinput.locfield := curinput.locfield + 1;
while true do begin
if (buffer[curinput.locfield] = 59) or (buffer[curinput.locfield] = 37) then
goto 30;
if not morename(buffer[curinput.locfield]) then
goto 30;
curinput.locfield := curinput.locfield + 1
end;
30:
endname
end; {:781} {784:}
procedure packjobname(s: strnumber);
begin
curarea := 155;
curext := s;
curname := jobname;
packfilename(curname, curarea, curext)
end; {:784} {786:}
procedure promptfilename(s, e: strnumber);
label
30;
var
k: 0..bufsize;
begin
if interaction = 2 then
;
if s = 607 then begin
if interaction = 3 then
;
printnl(133);
print(608)
end else begin
if interaction = 3 then
;
printnl(133);
print(609)
end;
printfilename(curname, curarea, curext);
print(610);
if e = 611 then
showcontext;
printnl(612);
print(s);
if interaction < 2 then
fatalerror(613);
begin
print(614);
terminput
end;
{787:}
begin
beginname;
k := first;
while ((buffer[k] = 32) or (buffer[k] = 9)) and (k < last) do
k := k + 1;
while true do begin
if k = last then
goto 30;
if not morename(buffer[k]) then
goto 30;
k := k + 1
end;
30:
endname
end {:787};
if curext = 155 then
curext := e;
packfilename(curname, curarea, curext)
end; { promptfilename }
{:786}
{788:}
procedure openlogfile;
var
oldsetting: 0..5;
k: 0..bufsize;
l: 0..bufsize;
m: integer;
months: packed array [1..36] of char;
begin
oldsetting := selector;
if jobname = 0 then
jobname := 615;
packjobname(616);
while not aopenout(logfile) do begin {789:}
if interaction < 2 then begin
begin
if interaction = 3 then
;
printnl(133);
print(609)
end;
printfilename(curname, curarea, curext);
print(610);
jobname := 0;
history := 3;
jumpout
end;
promptfilename(618, 616)
end {:789};
logname := amakenamestring(logfile);
selector := 2; {790:}
begin
write(logfile, 'This is METAFONT, Version 1.0 for Berkeley UNIX');
print(baseident);
print(619);
printint(roundunscaled(internal[16]));
printchar(32);
months := 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
m := roundunscaled(internal[15]);
for k := (3 * m) - 2 to 3 * m do
write(logfile, months[k]);
printchar(32);
printint(roundunscaled(internal[14]));
printchar(32);
m := roundunscaled(internal[17]);
printdd(m div 60);
printchar(58);
printdd(m mod 60)
end {:790};
inputstack[inputptr] := curinput;
printnl(617);
l := inputstack[0].limitfield - 1;
for k := 1 to l do
print(buffer[k]);
println;
selector := oldsetting + 2
end; {:788} {793:}
procedure startinput;
label
30; {795:}
begin
while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
endtokenlist;
if curinput.indexfield > 6 then begin
begin
if interaction = 3 then
;
printnl(133);
print(621)
end;
begin
helpptr := 3;
helpline[2] := 622;
helpline[1] := 623;
helpline[0] := 624
end;
error
end;
if curinput.indexfield <= 6 then
scanfilename
else begin
curname := 155;
curext := 155;
curarea := 155
end {:795};
if curext = 155 then
curext := 611;
packfilename(curname, curarea, curext);
while true do begin
beginfilereading;
if aopenin(inputfile[curinput.indexfield], 6) then
goto 30;
endfilereading;
promptfilename(607, 611)
end;
30:
curinput.namefield := amakenamestring(inputfile[curinput.indexfield]);
strref[curname] := 127;
if jobname = 0 then begin
jobname := curname;
openlogfile
end;
if (termoffset + (strstart[curinput.namefield + 1] - strstart[curinput.namefield])) > (maxprintline - 2) then
println
else if (termoffset > 0) or (fileoffset > 0) then
printchar(32);
printchar(40);
print(curinput.namefield);
flush(output); {794:}
begin
if not inputln(inputfile[curinput.indexfield], false) then
;
firmuptheline;
buffer[curinput.limitfield] := 37;
first := curinput.limitfield + 1;
curinput.locfield := curinput.startfield;
line := 1
end {:794}
end; {:793} {824:}
procedure badexp(s: strnumber);
var
saveflag: 0..82;
begin
begin
if interaction = 3 then
;
printnl(133);
print(s)
end;
print(634);
printcmdmod(curcmd, curmod);
printchar(39);
begin
helpptr := 4;
helpline[3] := 635;
helpline[2] := 636;
helpline[1] := 637;
helpline[0] := 638
end;
backinput;
cursym := 0;
curcmd := 42;
curmod := 0;
inserror;
saveflag := varflag;
varflag := 0;
getxnext;
varflag := saveflag
end; {:824} {827:}
procedure stashin(p: halfword);
var
q: halfword;
begin
mem[p].hh.b0 := curtype;
{
829:}
if curtype = 16 then
mem[p + 1].int := curexp
else begin
if curtype = 19 then begin
q := singledependency(curexp);
if q = depfinal then begin
mem[p].hh.b0 := 16;
mem[p + 1].int := 0;
freenode(q, 2)
end else begin
mem[p].hh.b0 := 17;
newdep(p, q)
end;
recyclevalue(curexp)
end else begin {:829}
mem[p + 1] := mem[curexp + 1];
mem[mem[p + 1].hh.lh].hh.rh := p
end;
freenode(curexp, 2)
end;
curtype := 1
end; { stashin }
{:827}
{848:}
procedure backexpr;
var
p: halfword;
begin
p := stashcurexp;
mem[p].hh.rh := -30000;
begintokenlist(p, 10)
end; {:848} {849:}
procedure badsubscript;
begin
disperr(-30000, 650);
begin
helpptr := 3;
helpline[2] := 651;
helpline[1] := 652;
helpline[0] := 653
end;
flusherror(0)
end; {:849} {851:}
procedure obliterated(q: halfword);
begin
begin
if interaction = 3 then
;
printnl(133);
print(654)
end;
showtokenlist(q, -30000, 1000, 0);
print(655);
begin
helpptr := 5;
helpline[4] := 656;
helpline[3] := 657;
helpline[2] := 658;
helpline[1] := 659;
helpline[0] := 660
end
end; {:851} {863:}
procedure binarymac(p, c, n: halfword);
var
q, r: halfword;
begin
q := getavail;
r := getavail;
mem[q].hh.rh := r;
mem[q].hh.lh := p;
mem[r].hh.lh := stashcurexp;
macrocall(c, q, n)
end; {:863} {865:}
procedure materializepen;
label
50;
var
aminusb, aplusb, majoraxis, minoraxis: scaled;
theta: angle;
p: halfword;
q: halfword;
begin
q := curexp;
if mem[q].hh.b0 = 0 then begin
begin
if interaction = 3 then
;
printnl(133);
print(670)
end;
begin
helpptr := 2;
helpline[1] := 671;
helpline[0] := 442
end;
putgeterror;
curexp := -29997;
goto 50
end else if mem[q].hh.b0 = 4 then begin {866:}
tx := mem[q + 1].int;
ty := mem[q + 2].int;
txx := mem[q + 3].int - tx;
tyx := mem[q + 4].int - ty;
txy := mem[q + 5].int - tx;
tyy := mem[q + 6].int - ty;
aminusb := pythadd(txx - tyy, tyx + txy);
aplusb := pythadd(txx + tyy, tyx - txy);
majoraxis := (aminusb + aplusb) div 2;
minoraxis := abs(aplusb - aminusb) div 2;
if majoraxis = minoraxis then
theta := 0
else
theta := (narg(txx - tyy, tyx + txy) + narg(txx + tyy, tyx - txy)) div 2;
freenode(q, 7);
q := makeellipse(majoraxis, minoraxis, theta);
if (tx <> 0) or (ty <> 0) then begin {867:}
p := q;
repeat
mem[p + 1].int := mem[p + 1].int + tx;
mem[p + 2].int := mem[p + 2].int + ty;
p := mem[p].hh.rh
until p = q
end {:867}
end {:866};
curexp := makepen(q);
50:
tossknotlist(q);
curtype := 6
end; {:865}
{871:}
{872:}
procedure knownpair;
var
p: halfword;
begin
if curtype <> 14 then begin
disperr(-30000, 673);
begin
helpptr := 5;
helpline[4] := 674;
helpline[3] := 675;
helpline[2] := 676;
helpline[1] := 677;
helpline[0] := 678
end;
putgetflusherror(0);
curx := 0;
cury := 0
end else begin
p := mem[curexp + 1].int; {873:}
if mem[p].hh.b0 = 16 then
curx := mem[p + 1].int
else begin
disperr(p, 679);
begin
helpptr := 5;
helpline[4] := 680;
helpline[3] := 675;
helpline[2] := 676;
helpline[1] := 677;
helpline[0] := 678
end;
putgeterror;
recyclevalue(p);
curx := 0
end;
if mem[p + 2].hh.b0 = 16 then
cury := mem[p + 3].int
else begin
disperr(p + 2, 681);
begin
helpptr := 5;
helpline[4] := 682;
helpline[3] := 675;
helpline[2] := 676;
helpline[1] := 677;
helpline[0] := 678
end;
putgeterror;
recyclevalue(p + 2);
cury := 0
end {:873};
flushcurexp(0)
end
end; {:872}
function newknot: halfword;
var
q: halfword;
begin
q := getnode(7);
mem[q].hh.b0 := 0;
mem[q].hh.b1 := 0;
mem[q].hh.rh := q;
knownpair;
mem[q + 1].int := curx;
mem[q + 2].int := cury;
newknot := q
end; {:871} {875:}
function scandirection: smallnumber;
var
t: 2..4;
x: scaled;
begin
getxnext;
if curcmd = 60 then begin {876:}
getxnext;
scanexpression;
if (curtype <> 16) or (curexp < 0) then begin
disperr(-30000, 685);
begin
helpptr := 1;
helpline[0] := 686
end;
putgetflusherror(65536)
end;
t := 3
end else begin {:876} {877:}
scanexpression;
if curtype > 14 then begin {878:}
if curtype <> 16 then begin
disperr(-30000, 679);
begin
helpptr := 5;
helpline[4] := 680;
helpline[3] := 675;
helpline[2] := 676;
helpline[1] := 677;
helpline[0] := 678
end;
putgetflusherror(0)
end;
x := curexp;
if curcmd <> 79 then begin
missingerr(44);
begin
helpptr := 2;
helpline[1] := 687;
helpline[0] := 688
end;
backerror
end;
getxnext;
scanexpression;
if curtype <> 16 then begin
disperr(-30000, 681);
begin
helpptr := 5;
helpline[4] := 682;
helpline[3] := 675;
helpline[2] := 676;
helpline[1] := 677;
helpline[0] := 678
end;
putgetflusherror(0)
end;
cury := curexp;
curx := x
end else {:878}
knownpair;
if (curx = 0) and (cury = 0) then
t := 4
else begin
t := 2;
curexp := narg(curx, cury)
end
end {:877};
if curcmd <> 65 then begin
missingerr(125);
begin
helpptr := 3;
helpline[2] := 683;
helpline[1] := 684;
helpline[0] := 563
end;
backerror
end;
getxnext;
scandirection := t
end; {:875} {895:}
procedure donullary(c: quarterword);
var
k: integer;
begin
begin
if aritherror then
cleararith
end;
if internal[7] > 131072 then
showcmdmod(33, c);
case c of
30, 31:
begin
curtype := 2;
curexp := c
end;
32:
begin
curtype := 11;
curexp := getnode(6);
initedges(curexp)
end;
33:
begin
curtype := 6;
curexp := -29997
end;
37:
begin
curtype := 16;
curexp := normrand
end;
36:
begin {896:}
curtype := 8;
curexp := getnode(7);
mem[curexp].hh.b0 := 4;
mem[curexp].hh.b1 := 4;
mem[curexp].hh.rh := curexp;
mem[curexp + 1].int := 0;
mem[curexp + 2].int := 0;
mem[curexp + 3].int := 65536;
mem[curexp + 4].int := 0;
mem[curexp + 5].int := 0;
mem[curexp + 6].int := 65536
end; {:896}
34:
begin
if jobname = 0 then
openlogfile;
curtype := 4;
curexp := jobname
end;
35:
begin {897:}
if interaction <= 1 then
fatalerror(699);
beginfilereading;
curinput.namefield := 1;
begin
print(155);
terminput
end;
begin
if ((poolptr + last) - curinput.startfield) > maxpoolptr then begin
if ((poolptr + last) - curinput.startfield) > poolsize then
overflow(129, poolsize - initpoolptr);
maxpoolptr := (poolptr + last) - curinput.startfield
end
end;
for k := curinput.startfield to last - 1 do begin
strpool[poolptr] := buffer[k];
poolptr := poolptr + 1
end;
endfilereading;
curtype := 4;
curexp := makestring
end
end {:897};
begin
if aritherror then
cleararith
end
end; {:895} {898:}
{899:}
function nicepair(p: integer; t: quarterword): boolean;
label
10;
begin
if t = 14 then begin
p := mem[p + 1].int;
if mem[p].hh.b0 = 16 then
if mem[p + 2].hh.b0 = 16 then begin
nicepair := true;
goto 10
end
end;
nicepair := false;
10:
end; {:899} {900:}
procedure printknownorunknownt(t: smallnumber; v: integer);
begin
printchar(40);
if t < 17 then
if t <> 14 then
printtype(t)
else if nicepair(v, 14) then
print(207)
else
print(700)
else
print(701);
printchar(41)
end; {:900} {901:}
procedure badunary(c: quarterword);
begin
disperr(-30000, 702);
printop(c);
printknownorunknownt(curtype, curexp);
begin
helpptr := 3;
helpline[2] := 703;
helpline[1] := 704;
helpline[0] := 705
end;
putgeterror
end; {:901} {904:}
procedure negatedeplist(p: halfword);
label
10;
begin
while true do begin
mem[p + 1].int := -mem[p + 1].int;
if mem[p].hh.lh = (-30000) then
goto 10;
p := mem[p].hh.rh
end;
10:
end; {:904}
{908:}
procedure pairtopath;
begin
curexp := newknot;
curtype := 9
end; {:908}
{910:}
procedure takepart(c: quarterword);
var
p: halfword;
begin
p := mem[curexp + 1].int;
mem[-29982].int := p;
mem[-29983].hh.b0 := curtype;
mem[p].hh.rh := -29983;
freenode(curexp, 2);
makeexpcopy(p + (2 * (c - 53)));
recyclevalue(-29983)
end; {:910} {913:}
procedure strtonum(c: quarterword);
var
n: integer;
m: ASCIIcode;
k: poolpointer;
b: 8..16;
badchar: boolean;
begin
if c = 49 then
if (strstart[curexp + 1] - strstart[curexp]) = 0 then
n := -1
else
n := strpool[strstart[curexp]]
else begin
if c = 47 then
b := 8
else
b := 16;
n := 0;
badchar := false;
for k := strstart[curexp] to strstart[curexp + 1] - 1 do begin
m := strpool[k];
if (m >= 48) and (m <= 57) then
m := m - 48
else if (m >= 65) and (m <= 70) then
m := m - 55
else if (m >= 97) and (m <= 102) then
m := m - 87
else begin
badchar := true;
m := 0
end;
if m >= b then begin
badchar := true;
m := 0
end;
if n < (32768 div b) then
n := (n * b) + m
else
n := 32767
end; {914:}
if badchar then begin
disperr(-30000, 707);
if c = 47 then begin
helpptr := 1;
helpline[0] := 708
end else begin
helpptr := 1;
helpline[0] := 709
end;
putgeterror
end;
if n > 4095 then begin
begin
if interaction = 3 then
;
printnl(133);
print(710)
end;
printint(n);
printchar(41);
begin
helpptr := 1;
helpline[0] := 711
end;
putgeterror
end {:914}
end;
flushcurexp(n * 65536)
end; { strtonum }
{:913}
{916:}
function pathlength: scaled;
var
n: scaled;
p: halfword;
begin
p := curexp;
if mem[p].hh.b0 = 0 then
n := -65536
else
n := 0;
repeat
p := mem[p].hh.rh;
n := n + 65536
until p = curexp;
pathlength := n
end; { pathlength }
{:916}
{919:}
procedure testknown(c: quarterword);
label
30;
var
b: 30..31;
p, q: halfword;
begin
b := 31;
if curtype in
[1, 2, 4, 6, 8, 9, 11, 16,
13, 14] then
case curtype of
1, 2, 4, 6, 8, 9, 11,
16:
b := 30;
13, 14:
begin
p := mem[curexp + 1].int;
q := p + bignodesize[curtype];
repeat
q := q - 2;
if mem[q].hh.b0 <> 16 then
goto 30
until q = p;
b := 30;
30:
end
end
else
;
if c = 39 then
flushcurexp(b)
else
flushcurexp(61 - b);
curtype := 2
end; {:919}
procedure dounary(c: quarterword);
var
p, q: halfword;
x: integer;
begin
begin
if aritherror then
cleararith
end;
if internal[7] > 131072 then begin {902:}
begindiagnostic;
printnl(123);
printop(c);
printchar(40);
printexp(-30000, 0);
print(706);
enddiagnostic(false)
end {:902};
case c of
69:
if curtype < 14 then
if curtype <> 11 then
badunary(69);
70: {903:}
if curtype in
[14, 19, 17, 18, 16, 11] then
case curtype of
14, 19:
begin
q := curexp;
makeexpcopy(q);
if curtype = 17 then
negatedeplist(mem[curexp + 1].hh.rh)
else if curtype = 14 then begin
p := mem[curexp + 1].int;
if mem[p].hh.b0 = 16 then
mem[p + 1].int := -mem[p + 1].int
else
negatedeplist(mem[p + 1].hh.rh);
if mem[p + 2].hh.b0 = 16 then
mem[p + 3].int := -mem[p + 3].int
else
negatedeplist(mem[p + 3].hh.rh)
end;
recyclevalue(q);
freenode(q, 2)
end;
17, 18:
negatedeplist(mem[curexp + 1].hh.rh);
16:
curexp := -curexp;
11:
negateedges(curexp)
end
else
badunary(70) {:903}; {905:}
41:
if curtype <> 2 then
badunary(41)
else
curexp := 61 - curexp; {:905} {906:}
59, 60, 61, 62, 63, 64, 65,
38, 66:
if curtype <> 16 then
badunary(c)
else
case c of
59:
curexp := squarert(curexp);
60:
curexp := mexp(curexp);
61:
curexp := mlog(curexp);
62, 63:
begin
nsincos((curexp mod 23592960) * 16);
if c = 62 then
curexp := roundfraction(nsin)
else
curexp := roundfraction(ncos)
end;
64:
curexp := floorscaled(curexp);
65:
curexp := unifrand(curexp);
38:
begin
if odd(roundunscaled(curexp)) then
curexp := 30
else
curexp := 31;
curtype := 2
end;
66:
begin {1181:}
curexp := roundunscaled(curexp) mod 256;
if curexp < 0 then
curexp := curexp + 256;
if charexists[curexp] then
curexp := 30
else
curexp := 31;
curtype := 2
end
end {:1181}; {:906} {907:}
67:
if nicepair(curexp, curtype) then begin
p := mem[curexp + 1].int;
x := narg(mem[p + 1].int, mem[p + 3].int);
if x >= 0 then
flushcurexp((x + 8) div 16)
else
flushcurexp(-(((-x) + 8) div 16))
end else
badunary(67); {:907} {909:}
53, 54:
if (curtype <= 14) and (curtype >= 13) then
takepart(c)
else
badunary(c);
55, 56, 57, 58:
if curtype = 13 then
takepart(c)
else
badunary(c); {:909} {912:}
50:
if curtype <> 16 then
badunary(50)
else begin
curexp := roundunscaled(curexp) mod 128;
curtype := 4;
if curexp < 0 then
curexp := curexp + 128;
if (strstart[curexp + 1] - strstart[curexp]) <> 1 then begin
begin
if (poolptr + 1) > maxpoolptr then begin
if (poolptr + 1) > poolsize then
overflow(129, poolsize - initpoolptr);
maxpoolptr := poolptr + 1
end
end;
begin
strpool[poolptr] := curexp;
poolptr := poolptr + 1
end;
curexp := makestring
end
end;
42:
if curtype <> 16 then
badunary(42)
else begin
oldsetting := selector;
selector := 5;
printscaled(curexp);
curexp := makestring;
selector := oldsetting;
curtype := 4
end;
47, 48, 49:
if curtype <> 4 then
badunary(c)
else
strtonum(c);
{:912}
{915:}
51:
if curtype = 4 then
flushcurexp((strstart[curexp + 1] - strstart[curexp]) * 65536)
else if curtype = 9 then
flushcurexp(pathlength)
else if curtype = 16 then
curexp := abs(curexp)
else if nicepair(curexp, curtype) then
flushcurexp(pythadd(mem[mem[curexp + 1].int + 1].int, mem[mem[curexp + 1].int + 3].int))
else
badunary(c); {:915} {917:}
52:
if curtype = 14 then
flushcurexp(0)
else if curtype <> 9 then
badunary(52)
else if mem[curexp].hh.b0 = 0 then
flushcurexp(0)
else begin
curpen := -29997;
curpathtype := 1;
curexp := makespec(curexp, -1879080960, 0);
flushcurexp(turningnumber * 65536)
end; {:917} {918:}
2:
begin
if (curtype >= 2) and (curtype <= 3) then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end;
4:
begin
if (curtype >= 4) and (curtype <= 5) then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end;
6:
begin
if (curtype >= 6) and (curtype <= 8) then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end;
9:
begin
if (curtype >= 9) and (curtype <= 10) then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end;
11:
begin
if (curtype >= 11) and (curtype <= 12) then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end;
13, 14:
begin
if curtype = c then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end;
15:
begin
if (curtype >= 16) and (curtype <= 19) then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end;
39, 40:
testknown(c); {:918} {920:}
68:
begin
if curtype <> 9 then
flushcurexp(31)
else if mem[curexp].hh.b0 <> 0 then
flushcurexp(30)
else
flushcurexp(31);
curtype := 2
end; {:920} {921:}
45:
begin
if curtype = 14 then
pairtopath;
if curtype = 9 then
curtype := 8
else
badunary(45)
end;
44:
begin
if curtype = 8 then
materializepen;
if curtype <> 6 then
badunary(44)
else begin
flushcurexp(makepath(curexp));
curtype := 9
end
end;
46:
if curtype <> 11 then
badunary(46)
else
flushcurexp(totalweight(curexp));
43:
if curtype = 9 then begin
p := htapypoc(curexp);
if mem[p].hh.b1 = 0 then
p := mem[p].hh.rh;
tossknotlist(curexp);
curexp := p
end else if curtype = 14 then
pairtopath
else
badunary(43)
end {:921};
begin
if aritherror then
cleararith
end
end; {:898} {922:} {923:}
procedure badbinary(p: halfword; c: quarterword);
begin
disperr(p, 155);
disperr(-30000, 702);
if c >= 94 then
printop(c);
printknownorunknownt(mem[p].hh.b0, p);
if c >= 94 then
print(347)
else
printop(c);
printknownorunknownt(curtype, curexp);
begin
helpptr := 3;
helpline[2] := 703;
helpline[1] := 712;
helpline[0] := 713
end;
putgeterror
end; {:923} {928:}
function tarnished(p: halfword): halfword;
label
10;
var
q: halfword;
r: halfword;
begin
q := mem[p + 1].int;
r := q + bignodesize[mem[p].hh.b0];
repeat
r := r - 2;
if mem[r].hh.b0 = 19 then begin
tarnished := -29999;
goto 10
end
until r = q;
tarnished := -30000;
10:
end; {:928} {930:} {935:}
procedure depfinish(v, q: halfword; t: smallnumber);
var
p: halfword;
vv: scaled;
begin
if q = (-30000) then
p := curexp
else
p := q;
mem[p + 1].hh.rh := v;
mem[p].hh.b0 := t;
if mem[v].hh.lh = (-30000) then begin
vv := mem[v + 1].int;
if q = (-30000) then
flushcurexp(vv)
else begin
recyclevalue(p);
mem[q].hh.b0 := 16;
mem[q + 1].int := vv
end
end else if q = (-30000) then
curtype := t;
if fixneeded then
fixdependencies
end; {:935}
procedure addorsubtract(p, q: halfword; c: quarterword);
label
30, 10;
var
s, t: smallnumber;
r: halfword;
v: integer;
begin
if q = (-30000) then begin
t := curtype;
if t < 17 then
v := curexp
else
v := mem[curexp + 1].hh.rh
end else begin
t := mem[q].hh.b0;
if t < 17 then
v := mem[q + 1].int
else
v := mem[q + 1].hh.rh
end;
if t = 16 then begin
if c = 70 then
v := -v;
if mem[p].hh.b0 = 16 then begin
v := slowadd(mem[p + 1].int, v);
if q = (-30000) then
curexp := v
else
mem[q + 1].int := v;
goto 10
end; {931:}
r := mem[p + 1].hh.rh;
while mem[r].hh.lh <> (-30000) do
r := mem[r].hh.rh;
mem[r + 1].int := slowadd(mem[r + 1].int, v);
if q = (-30000) then begin
q := getnode(2);
curexp := q;
curtype := mem[p].hh.b0;
mem[q].hh.b1 := 11
end;
mem[q + 1].hh.rh := mem[p + 1].hh.rh;
mem[q].hh.b0 := mem[p].hh.b0;
mem[q + 1].hh.lh := mem[p + 1].hh.lh;
mem[mem[p + 1].hh.lh].hh.rh := q;
mem[p].hh.b0 := 16
end else begin {:931}
if c = 70 then
negatedeplist(v); {932:}
if mem[p].hh.b0 = 16 then begin {933:}
while mem[v].hh.lh <> (-30000) do
v := mem[v].hh.rh;
mem[v + 1].int := slowadd(mem[p + 1].int, mem[v + 1].int)
end else begin {:933}
s := mem[p].hh.b0;
r := mem[p + 1].hh.rh;
if t = 17 then begin
if s = 17 then
if (maxcoef(r) + maxcoef(v)) < 626349397 then begin
v := pplusq(v, r, 17);
goto 30
end;
t := 18;
v := poverv(v, 65536, 17, 18)
end;
if s = 18 then
v := pplusq(v, r, 18)
else
v := pplusfq(v, 65536, r, 18, 17);
30: {934:}
if q <> (-30000) then
depfinish(v, q, t)
else begin
curtype := t;
depfinish(v, -30000, t)
end {:934}
end {:932}
end;
10:
end; {:930} {943:}
procedure depmult(p: halfword; v: integer; visscaled: boolean);
label
10;
var
q: halfword;
s, t: smallnumber;
begin
if p = (-30000) then
q := curexp
else if mem[p].hh.b0 <> 16 then
q := p
else begin
if visscaled then
mem[p + 1].int := takescaled(mem[p + 1].int, v)
else
mem[p + 1].int := takefraction(mem[p + 1].int, v);
goto 10
end;
t := mem[q].hh.b0;
q := mem[q + 1].hh.rh;
s := t;
if t = 17 then
if visscaled then
if abvscd(maxcoef(q), abs(v), 626349396, 65536) >= 0 then
t := 18;
q := ptimesv(q, v, s, t, visscaled);
depfinish(q, p, t);
10:
end; {:943} {946:}
procedure hardtimes(p: halfword);
var
q: halfword;
r: halfword;
u, v: scaled;
begin
if mem[p].hh.b0 = 14 then begin
q := stashcurexp;
unstashcurexp(p);
p := q
end;
r := mem[curexp + 1].int;
u := mem[r + 1].int;
v := mem[r + 3].int; {947:}
mem[r + 2].hh.b0 := mem[p].hh.b0;
newdep(r + 2, copydeplist(mem[p + 1].hh.rh));
mem[r].hh.b0 := mem[p].hh.b0;
mem[r + 1] := mem[p + 1];
mem[mem[p + 1].hh.lh].hh.rh := r;
freenode(p, 2) {:947};
depmult(r, u, true);
depmult(r + 2, v, true)
end; {:946} {949:}
procedure depdiv(p: halfword; v: scaled);
label
10;
var
q: halfword;
s, t: smallnumber;
begin
if p = (-30000) then
q := curexp
else if mem[p].hh.b0 <> 16 then
q := p
else begin
mem[p + 1].int := makescaled(mem[p + 1].int, v);
goto 10
end;
t := mem[q].hh.b0;
q := mem[q + 1].hh.rh;
s := t;
if t = 17 then
if abvscd(maxcoef(q), 65536, 626349396, abs(v)) >= 0 then
t := 18;
q := poverv(q, v, s, t);
depfinish(q, p, t);
10:
end; {:949} {953:}
procedure setuptrans(c: quarterword);
label
30, 10;
var
p, q, r: halfword;
begin
if (c <> 88) or (curtype <> 13) then begin {955:}
p := stashcurexp;
curexp := idtransform;
curtype := 13;
q := mem[curexp + 1].int;
case c of {957:}
84:
if mem[p].hh.b0 = 16 then begin {958:}
nsincos((mem[p + 1].int mod 23592960) * 16);
mem[q + 5].int := roundfraction(ncos);
mem[q + 9].int := roundfraction(nsin);
mem[q + 7].int := -mem[q + 9].int;
mem[q + 11].int := mem[q + 5].int;
goto 30
end {:958};
85:
if mem[p].hh.b0 > 14 then begin
install(q + 6, p);
goto 30
end;
86:
if mem[p].hh.b0 > 14 then begin
install(q + 4, p);
install(q + 10, p);
goto 30
end;
87:
if mem[p].hh.b0 = 14 then begin
r := mem[p + 1].int;
install(q, r);
install(q + 2, r + 2);
goto 30
end;
89:
if mem[p].hh.b0 > 14 then begin
install(q + 4, p);
goto 30
end;
90:
if mem[p].hh.b0 > 14 then begin
install(q + 10, p);
goto 30
end;
91:
if mem[p].hh.b0 = 14 then begin {959:}
r := mem[p + 1].int;
install(q + 4, r);
install(q + 10, r);
install(q + 8, r + 2);
if mem[r + 2].hh.b0 = 16 then
mem[r + 3].int := -mem[r + 3].int
else
negatedeplist(mem[r + 3].hh.rh);
install(q + 6, r + 2);
goto 30
end {:959};
88:
end {:957};
disperr(p, 722);
begin
helpptr := 3;
helpline[2] := 723;
helpline[1] := 724;
helpline[0] := 405
end;
putgeterror;
30:
recyclevalue(p);
freenode(p, 2)
end {:955}; {956:}
q := mem[curexp + 1].int;
r := q + 12;
repeat
r := r - 2;
if mem[r].hh.b0 <> 16 then
goto 10
until r = q;
txx := mem[q + 5].int;
txy := mem[q + 7].int;
tyx := mem[q + 9].int;
tyy := mem[q + 11].int;
tx := mem[q + 1].int;
ty := mem[q + 3].int;
flushcurexp(0) {:956};
10:
end; {:953} {960:}
procedure setupknowntrans(c: quarterword);
begin
setuptrans(c);
if curtype <> 16 then begin
disperr(-30000, 725);
begin
helpptr := 3;
helpline[2] := 726;
helpline[1] := 727;
helpline[0] := 405
end;
putgetflusherror(0);
txx := 65536;
txy := 0;
tyx := 0;
tyy := 65536;
tx := 0;
ty := 0
end
end; {:960} {961:}
procedure trans(p, q: halfword);
var
v: scaled;
begin
v := (takescaled(mem[p].int, txx) + takescaled(mem[q].int, txy)) + tx;
mem[q].int := (takescaled(mem[p].int, tyx) + takescaled(mem[q].int, tyy)) + ty;
mem[p].int := v
end; {:961} {962:}
procedure pathtrans(p: halfword; c: quarterword);
label
10;
var
q: halfword;
begin
setupknowntrans(c);
unstashcurexp(p);
if curtype = 6 then begin
if mem[curexp + 9].int = 0 then
if tx = 0 then
if ty = 0 then
goto 10;
flushcurexp(makepath(curexp));
curtype := 8
end;
q := curexp;
repeat
if mem[q].hh.b0 <> 0 then
trans(q + 3, q + 4);
trans(q + 1, q + 2);
if mem[q].hh.b1 <> 0 then
trans(q + 5, q + 6);
q := mem[q].hh.rh
until q = curexp;
10:
end; {:962} {963:}
procedure edgestrans(p: halfword; c: quarterword);
label
10;
begin
setupknowntrans(c);
unstashcurexp(p);
curedges := curexp;
if mem[curedges].hh.rh = curedges then
goto 10;
if txx = 0 then
if tyy = 0 then
if (txy mod 65536) = 0 then
if (tyx mod 65536) = 0 then begin
xyswapedges;
txx := txy;
tyy := tyx;
txy := 0;
tyx := 0;
if mem[curedges].hh.rh = curedges then
goto 10
end;
if txy = 0 then
if tyx = 0 then
if (txy mod 65536) = 0 then
if (tyy mod 65536) = 0 then begin {964:}
if (txx = 0) or (tyy = 0) then begin
tossedges(curedges);
curexp := getnode(6);
initedges(curexp)
end else begin
if txx < 0 then begin
xreflectedges;
txx := -txx
end;
if tyy < 0 then begin
yreflectedges;
tyy := -tyy
end;
if txx <> 65536 then
xscaleedges(txx div 65536);
if tyy <> 65536 then
yscaleedges(tyy div 65536); {965:}
tx := roundunscaled(tx);
ty := roundunscaled(ty);
if ((((((mem[curedges + 2].hh.lh + tx) <= 0) or ((mem[curedges + 2].hh.rh + tx) >= 8192)) or ((mem[curedges + 1].hh.lh + ty) <= 0)) or ((mem[curedges + 1].hh.rh + ty) >= 8191)) or (abs(tx) >= 4096)) or (abs(ty) >= 4096) then begin
begin
if interaction = 3 then
;
printnl(133);
print(731)
end;
begin
helpptr := 3;
helpline[2] := 732;
helpline[1] := 404;
helpline[0] := 405
end;
putgeterror
end else begin
if tx <> 0 then begin
if not (abs((mem[curedges + 3].hh.lh - tx) - 4096) < 4096) then
fixoffset;
mem[curedges + 2].hh.lh := mem[curedges + 2].hh.lh + tx;
mem[curedges + 2].hh.rh := mem[curedges + 2].hh.rh + tx;
mem[curedges + 3].hh.lh := mem[curedges + 3].hh.lh - tx;
mem[curedges + 4].int := 0
end;
if ty <> 0 then begin
mem[curedges + 1].hh.lh := mem[curedges + 1].hh.lh + ty;
mem[curedges + 1].hh.rh := mem[curedges + 1].hh.rh + ty;
mem[curedges + 5].hh.lh := mem[curedges + 5].hh.lh + ty;
mem[curedges + 4].int := 0
end
end {:965}
end;
goto 10
end {:964};
begin
if interaction = 3 then
;
printnl(133);
print(728)
end;
begin
helpptr := 3;
helpline[2] := 729;
helpline[1] := 730;
helpline[0] := 405
end;
putgeterror;
10:
end; {:963} {966:}
{968:}
procedure bilin1(p: halfword; t: scaled; q: halfword; u, delta: scaled);
var
r: halfword;
begin
if t <> 65536 then
depmult(p, t, true);
if u <> 0 then
if mem[q].hh.b0 = 16 then
delta := delta + takescaled(mem[q + 1].int, u)
else begin {969:}
if mem[p].hh.b0 <> 18 then begin
if mem[p].hh.b0 = 16 then
newdep(p, constdependency(mem[p + 1].int))
else
mem[p + 1].hh.rh := ptimesv(mem[p + 1].hh.rh, 65536, 17, 18, true);
mem[p].hh.b0 := 18
end {:969};
mem[p + 1].hh.rh := pplusfq(mem[p + 1].hh.rh, u, mem[q + 1].hh.rh, 18, mem[q].hh.b0)
end;
if mem[p].hh.b0 = 16 then
mem[p + 1].int := mem[p + 1].int + delta
else begin
r := mem[p + 1].hh.rh;
while mem[r].hh.lh <> (-30000) do
r := mem[r].hh.rh;
delta := mem[r + 1].int + delta;
if r <> mem[p + 1].hh.rh then
mem[r + 1].int := delta
else begin
recyclevalue(p);
mem[p].hh.b0 := 16;
mem[p + 1].int := delta
end
end;
if fixneeded then
fixdependencies
end; {:968} {971:}
procedure addmultdep(p: halfword; v: scaled; r: halfword);
begin
if mem[r].hh.b0 = 16 then
mem[depfinal + 1].int := mem[depfinal + 1].int + takescaled(mem[r + 1].int, v)
else begin
mem[p + 1].hh.rh := pplusfq(mem[p + 1].hh.rh, v, mem[r + 1].hh.rh, 18, mem[r].hh.b0);
if fixneeded then
fixdependencies
end
end; {:971} {972:}
procedure bilin2(p, t: halfword; v: scaled; u, q: halfword);
var
vv: scaled;
begin
vv := mem[p + 1].int;
mem[p].hh.b0 := 18;
newdep(p, constdependency(0));
if vv <> 0 then
addmultdep(p, vv, t);
if v <> 0 then
addmultdep(p, v, u);
if q <> (-30000) then
addmultdep(p, 65536, q);
if mem[p + 1].hh.rh = depfinal then begin
vv := mem[depfinal + 1].int;
recyclevalue(p);
mem[p].hh.b0 := 16;
mem[p + 1].int := vv
end
end; {:972} {974:}
procedure bilin3(p: halfword; t, v, u, delta: scaled);
begin
if t <> 65536 then
delta := delta + takescaled(mem[p + 1].int, t)
else
delta := delta + mem[p + 1].int;
if u <> 0 then
mem[p + 1].int := delta + takescaled(v, u)
else
mem[p + 1].int := delta
end; {:974}
procedure bigtrans(p: halfword; c: quarterword);
label
10;
var
q, r, pp, qq: halfword;
s: smallnumber;
begin
s := bignodesize[mem[p].hh.b0];
q := mem[p + 1].int;
r := q + s;
repeat
r := r - 2;
if mem[r].hh.b0 <> 16 then begin {967:}
setupknowntrans(c);
makeexpcopy(p);
r := mem[curexp + 1].int;
if curtype = 13 then begin
bilin1(r + 10, tyy, q + 6, tyx, 0);
bilin1(r + 8, tyy, q + 4, tyx, 0);
bilin1(r + 6, txx, q + 10, txy, 0);
bilin1(r + 4, txx, q + 8, txy, 0)
end;
bilin1(r + 2, tyy, q, tyx, ty);
bilin1(r, txx, q + 2, txy, tx);
goto 10
end {:967}
until r = q; {970:}
setuptrans(c);
if curtype = 16 then begin {973:}
makeexpcopy(p);
r := mem[curexp + 1].int;
if curtype = 13 then begin
bilin3(r + 10, tyy, mem[q + 7].int, tyx, 0);
bilin3(r + 8, tyy, mem[q + 5].int, tyx, 0);
bilin3(r + 6, txx, mem[q + 11].int, txy, 0);
bilin3(r + 4, txx, mem[q + 9].int, txy, 0)
end;
bilin3(r + 2, tyy, mem[q + 1].int, tyx, ty);
bilin3(r, txx, mem[q + 3].int, txy, tx)
end else begin {:973}
pp := stashcurexp;
qq := mem[pp + 1].int;
makeexpcopy(p);
r := mem[curexp + 1].int;
if curtype = 13 then begin
bilin2(r + 10, qq + 10, mem[q + 7].int, qq + 8, -30000);
bilin2(r + 8, qq + 10, mem[q + 5].int, qq + 8, -30000);
bilin2(r + 6, qq + 4, mem[q + 11].int, qq + 6, -30000);
bilin2(r + 4, qq + 4, mem[q + 9].int, qq + 6, -30000)
end;
bilin2(r + 2, qq + 10, mem[q + 1].int, qq + 8, qq + 2);
bilin2(r, qq + 4, mem[q + 3].int, qq + 6, qq);
recyclevalue(pp);
freenode(pp, 2)
end;
{:970}
10:
end; {:966} {976:}
procedure cat(p: halfword);
var
a, b: strnumber;
k: poolpointer;
begin
a := mem[p + 1].int;
b := curexp;
begin
if ((poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])) > maxpoolptr then begin
if ((poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])) > poolsize then
overflow(129, poolsize - initpoolptr);
maxpoolptr := (poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])
end
end;
for k := strstart[a] to strstart[a + 1] - 1 do begin
strpool[poolptr] := strpool[k];
poolptr := poolptr + 1
end;
for k := strstart[b] to strstart[b + 1] - 1 do begin
strpool[poolptr] := strpool[k];
poolptr := poolptr + 1
end;
curexp := makestring;
begin
if strref[b] < 127 then
if strref[b] > 1 then
strref[b] := strref[b] - 1
else
flushstring(b)
end
end; {:976} {977:}
procedure chopstring(p: halfword);
var
a, b: integer;
l: integer;
k: integer;
s: strnumber;
reversed: boolean;
begin
a := roundunscaled(mem[p + 1].int);
b := roundunscaled(mem[p + 3].int);
if a <= b then
reversed := false
else begin
reversed := true;
k := a;
a := b;
b := k
end;
s := curexp;
l := strstart[s + 1] - strstart[s];
if a < 0 then begin
a := 0;
if b < 0 then
b := 0
end;
if b > l then begin
b := l;
if a > l then
a := l
end;
begin
if ((poolptr + b) - a) > maxpoolptr then begin
if ((poolptr + b) - a) > poolsize then
overflow(129, poolsize - initpoolptr);
maxpoolptr := (poolptr + b) - a
end
end;
if reversed then
for k := (strstart[s] + b) - 1 downto strstart[s] + a do begin
strpool[poolptr] := strpool[k];
poolptr := poolptr + 1
end
else
for k := strstart[s] + a to (strstart[s] + b) - 1 do begin
strpool[poolptr] := strpool[k];
poolptr := poolptr + 1
end;
curexp := makestring;
begin
if strref[s] < 127 then
if strref[s] > 1 then
strref[s] := strref[s] - 1
else
flushstring(s)
end
end; {:977} {978:}
procedure choppath(p: halfword);
var
q: halfword;
pp, qq, rr, ss: halfword;
a, b, k, l: scaled;
reversed: boolean;
begin
l := pathlength;
a := mem[p + 1].int;
b := mem[p + 3].int;
if a <= b then
reversed := false
else begin
reversed := true;
k := a;
a := b;
b := k
end; {979:}
if a < 0 then
if mem[curexp].hh.b0 = 0 then begin
a := 0;
if b < 0 then
b := 0
end else
repeat
a := a + l;
b := b + l
until a >= 0;
if b > l then
if mem[curexp].hh.b0 = 0 then begin
b := l;
if a > l then
a := l
end else
while a >= l do begin
a := a - l;
b := b - l
end {:979};
q := curexp;
while a >= 65536 do begin
q := mem[q].hh.rh;
a := a - 65536;
b := b - 65536
end;
if b = a then begin {981:}
if a > 0 then begin
qq := mem[q].hh.rh;
splitcubic(q, a * 4096, mem[qq + 1].int, mem[qq + 2].int);
q := mem[q].hh.rh
end;
pp := copyknot(q);
qq := pp
end else begin {:981} {980:}
pp := copyknot(q);
qq := pp;
repeat
q := mem[q].hh.rh;
rr := qq;
qq := copyknot(q);
mem[rr].hh.rh := qq;
b := b - 65536
until b <= 0;
if a > 0 then begin
ss := pp;
pp := mem[pp].hh.rh;
splitcubic(ss, a * 4096, mem[pp + 1].int, mem[pp + 2].int);
pp := mem[ss].hh.rh;
freenode(ss, 7);
if rr = ss then begin
b := makescaled(b, 65536 - a);
rr := pp
end
end;
if b < 0 then begin
splitcubic(rr, (b + 65536) * 4096, mem[qq + 1].int, mem[qq + 2].int);
freenode(qq, 7);
qq := mem[rr].hh.rh
end
end {:980};
mem[pp].hh.b0 := 0;
mem[qq].hh.b1 := 0;
mem[qq].hh.rh := pp;
tossknotlist(curexp);
if reversed then begin
curexp := mem[htapypoc(pp)].hh.rh;
tossknotlist(pp)
end else
curexp := pp
end; {:978} {982:}
procedure pairvalue(x, y: scaled);
var
p: halfword;
begin
p := getnode(2);
flushcurexp(p);
curtype := 14;
mem[p].hh.b0 := 14;
mem[p].hh.b1 := 11;
initbignode(p);
p := mem[p + 1].int;
mem[p].hh.b0 := 16;
mem[p + 1].int := x;
mem[p + 2].hh.b0 := 16;
mem[p + 3].int := y
end; { pairvalue }
{:982}
{984:}
procedure setupoffset(p: halfword);
begin
findoffset(mem[p + 1].int, mem[p + 3].int, curexp);
pairvalue(curx, cury)
end;
procedure setupdirectiontime(p: halfword);
begin
flushcurexp(finddirectiontime(mem[p + 1].int, mem[p + 3].int, curexp))
end; {:984} {985:}
procedure findpoint(v: scaled; c: quarterword);
var
p: halfword;
n: scaled;
vv: scaled;
q: halfword;
begin
vv := v;
p := curexp;
if mem[p].hh.b0 = 0 then
n := -65536
else
n := 0;
repeat
p := mem[p].hh.rh;
n := n + 65536
until p = curexp;
if n = 0 then
v := 0
else if v < 0 then
if mem[p].hh.b0 = 0 then
v := 0
else
v := (n - 1) - (((-v) - 1) mod n)
else if v > n then
if mem[p].hh.b0 = 0 then
v := n
else
v := v mod n;
p := curexp;
while v >= 65536 do begin
p := mem[p].hh.rh;
v := v - 65536
end;
if v <> 0 then begin {986:}
q := mem[p].hh.rh;
splitcubic(p, v * 4096, mem[q + 1].int, mem[q + 2].int);
p := mem[p].hh.rh
end {:986}; {987:}
case c of
97:
pairvalue(mem[p + 1].int, mem[p + 2].int);
98:
if mem[p].hh.b0 = 0 then
pairvalue(mem[p + 1].int, mem[p + 2].int)
else
pairvalue(mem[p + 3].int, mem[p + 4].int);
99:
if mem[p].hh.b1 = 0 then
pairvalue(mem[p + 1].int, mem[p + 2].int)
else
pairvalue(mem[p + 5].int, mem[p + 6].int)
end {:987}
end; {:985}
procedure dobinary(p: halfword; c: quarterword);
label
30, 31, 10;
var
q, r, rr: halfword;
oldp, oldexp: halfword;
v: integer;
begin
begin
if aritherror then
cleararith
end;
if internal[7] > 131072 then begin {924:}
begindiagnostic;
printnl(714);
printexp(p, 0);
printchar(41);
printop(c);
printchar(40);
printexp(-30000, 0);
print(706);
enddiagnostic(false)
end {:924}; {926:}
if mem[p].hh.b0 in
[13, 14, 19] then
case mem[p].hh.b0 of
13, 14:
oldp := tarnished(p);
19:
oldp := -29999
end
else
oldp := -30000;
if oldp <> (-30000) then begin
q := stashcurexp;
oldp := p;
makeexpcopy(oldp);
p := stashcurexp;
unstashcurexp(q)
end; {:926}
{927:}
if curtype in
[13, 14, 19] then
case curtype of
13, 14:
oldexp := tarnished(curexp);
19:
oldexp := -29999
end
else
oldexp := -30000;
if oldexp <> (-30000) then begin
oldexp := curexp;
makeexpcopy(oldexp)
end {:927};
case c of
69, 70: {929:}
if (curtype < 14) or (mem[p].hh.b0 < 14) then
if (curtype = 11) and (mem[p].hh.b0 = 11) then begin
if c = 70 then
negateedges(curexp);
curedges := curexp;
mergeedges(mem[p + 1].int)
end else
badbinary(p, c)
else if curtype = 14 then
if mem[p].hh.b0 <> 14 then
badbinary(p, c)
else begin
q := mem[p + 1].int;
r := mem[curexp + 1].int;
addorsubtract(q, r, c);
addorsubtract(q + 2, r + 2, c)
end
else if mem[p].hh.b0 = 14 then
badbinary(p, c)
else
addorsubtract(p, -30000, c) {:929}; {936:}
77, 78, 79, 80, 81, 82:
begin
if (curtype > 14) and (mem[p].hh.b0 > 14) then
addorsubtract(p, -30000, 70)
else if curtype <> mem[p].hh.b0 then begin
badbinary(p, c);
goto 30
end else if curtype = 4 then
flushcurexp(strvsstr(mem[p + 1].int, curexp))
else if (curtype = 5) or (curtype = 3) then begin {938:}
q := mem[curexp + 1].int;
while (q <> curexp) and (q <> p) do
q := mem[q + 1].int;
if q = p then
flushcurexp(0)
end else if (curtype = 14) or (curtype = 13) then begin {:938} {939:}
q := mem[p + 1].int;
r := mem[curexp + 1].int;
rr := (r + bignodesize[curtype]) - 2;
while true do begin
addorsubtract(q, r, 70);
if mem[r].hh.b0 <> 16 then
goto 31;
if mem[r + 1].int <> 0 then
goto 31;
if r = rr then
goto 31;
q := q + 2;
r := r + 2
end;
31:
takepart(53 + ((r - mem[curexp + 1].int) div 2))
end else if curtype = 2 then {:939}
flushcurexp(curexp - mem[p + 1].int)
else begin
badbinary(p, c);
goto 30
end; {937:}
if curtype <> 16 then begin
if curtype < 16 then begin
disperr(p, 155);
begin
helpptr := 1;
helpline[0] := 715
end
end else begin
helpptr := 2;
helpline[1] := 716;
helpline[0] := 717
end;
disperr(-30000, 718);
putgetflusherror(31)
end else
case c of
77:
if curexp < 0 then
curexp := 30
else
curexp := 31;
78:
if curexp <= 0 then
curexp := 30
else
curexp := 31;
79:
if curexp > 0 then
curexp := 30
else
curexp := 31;
80:
if curexp >= 0 then
curexp := 30
else
curexp := 31;
81:
if curexp = 0 then
curexp := 30
else
curexp := 31;
82:
if curexp <> 0 then
curexp := 30
else
curexp := 31
end;
curtype := 2 {:937};
30:
end; {:936} {940:}
76, 75:
if (mem[p].hh.b0 <> 2) or (curtype <> 2) then
badbinary(p, c)
else if mem[p + 1].int = (c - 45) then
curexp := mem[p + 1].int; {:940} {941:}
71:
if (curtype < 14) or (mem[p].hh.b0 < 14) then
badbinary(p, 71)
else if (curtype = 16) or (mem[p].hh.b0 = 16) then begin {942:}
if mem[p].hh.b0 = 16 then begin
v := mem[p + 1].int;
freenode(p, 2)
end else begin
v := curexp;
unstashcurexp(p)
end;
if curtype = 16 then
curexp := takescaled(curexp, v)
else if curtype = 14 then begin
p := mem[curexp + 1].int;
depmult(p, v, true);
depmult(p + 2, v, true)
end else
depmult(-30000, v, true);
goto 10
end else if (nicepair(p, mem[p].hh.b0) and (curtype > 14)) or (nicepair(curexp, curtype) and (mem[p].hh.b0 > 14)) then begin {:942}
hardtimes(p);
goto 10
end else
badbinary(p, 71); {:941} {948:}
72:
if (curtype <> 16) or (mem[p].hh.b0 < 14) then
badbinary(p, 72)
else begin
v := curexp;
unstashcurexp(p);
if v = 0 then begin {950:}
disperr(-30000, 648);
begin
helpptr := 2;
helpline[1] := 720;
helpline[0] := 721
end;
putgeterror
end else begin {:950}
if curtype = 16 then
curexp := makescaled(curexp, v)
else if curtype = 14 then begin
p := mem[curexp + 1].int;
depdiv(p, v);
depdiv(p + 2, v)
end else
depdiv(-30000, v)
end;
goto 10
end; {:948} {951:}
73, 74:
if (curtype = 16) and (mem[p].hh.b0 = 16) then
if c = 73 then
curexp := pythadd(mem[p + 1].int, curexp)
else
curexp := pythsub(mem[p + 1].int, curexp)
else
badbinary(p, c); {:951} {952:}
84, 85, 86, 87, 88, 89, 90,
91:
if ((mem[p].hh.b0 = 9) or (mem[p].hh.b0 = 8)) or (mem[p].hh.b0 = 6) then begin
pathtrans(p, c);
goto 10
end else if (mem[p].hh.b0 = 14) or (mem[p].hh.b0 = 13) then
bigtrans(p, c)
else if mem[p].hh.b0 = 11 then begin
edgestrans(p, c);
goto 10
end else
badbinary(p, c); {:952} {975:}
83:
if (curtype = 4) and (mem[p].hh.b0 = 4) then
cat(p)
else
badbinary(p, 83);
94:
if nicepair(p, mem[p].hh.b0) and (curtype = 4) then
chopstring(mem[p + 1].int)
else
badbinary(p, 94);
95:
begin
if curtype = 14 then
pairtopath;
if nicepair(p, mem[p].hh.b0) and (curtype = 9) then
choppath(mem[p + 1].int)
else
badbinary(p, 95)
end; {:975} {983:}
97, 98, 99:
begin
if curtype = 14 then
pairtopath;
if (curtype = 9) and (mem[p].hh.b0 = 16) then
findpoint(mem[p + 1].int, c)
else
badbinary(p, c)
end;
100:
begin
if curtype = 8 then
materializepen;
if (curtype = 6) and nicepair(p, mem[p].hh.b0) then
setupoffset(mem[p + 1].int)
else
badbinary(p, 100)
end;
96:
begin
if curtype = 14 then
pairtopath;
if (curtype = 9) and nicepair(p, mem[p].hh.b0) then
setupdirectiontime(mem[p + 1].int)
else
badbinary(p, 96)
end; {:983} {988:}
92:
begin
if mem[p].hh.b0 = 14 then begin
q := stashcurexp;
unstashcurexp(p);
pairtopath;
p := stashcurexp;
unstashcurexp(q)
end;
if curtype = 14 then
pairtopath;
if (curtype = 9) and (mem[p].hh.b0 = 9) then begin
pathintersection(mem[p + 1].int, curexp);
pairvalue(curt, curtt)
end else
badbinary(p, 92)
end
end {:988};
recyclevalue(p);
freenode(p, 2);
10:
begin
if aritherror then
cleararith
end; {925:}
if oldp <> (-30000) then begin
recyclevalue(oldp);
freenode(oldp, 2)
end;
if oldexp <> (-30000) then begin
recyclevalue(oldexp);
freenode(oldexp, 2)
end {:925}
end; {:922} {944:}
procedure fracmult(n, d: scaled);
var
p: halfword;
oldexp: halfword;
v: fraction;
begin
if internal[7] > 131072 then begin {945:}
begindiagnostic;
printnl(714);
printscaled(n);
printchar(47);
printscaled(d);
print(719);
printexp(-30000, 0);
print(706);
enddiagnostic(false)
end {:945};
if curtype in
[13, 14, 19] then
case curtype of
13, 14:
oldexp := tarnished(curexp);
19:
oldexp := -29999
end
else
oldexp := -30000;
if oldexp <> (-30000) then begin
oldexp := curexp;
makeexpcopy(oldexp)
end;
v := makefraction(n, d);
if curtype = 16 then
curexp := takefraction(curexp, v)
else if curtype = 14 then begin
p := mem[curexp + 1].int;
depmult(p, v, false);
depmult(p + 2, v, false)
end else
depmult(-30000, v, false);
if oldexp <> (-30000) then begin
recyclevalue(oldexp);
freenode(oldexp, 2)
end
end; {:944} {989:} {1155:}
procedure gfswap;
begin
if gflimit = gfbufsize then begin
bwritebuf(gffile, gfbuf, 0, halfbuf - 1);
gflimit := halfbuf;
gfoffset := gfoffset + gfbufsize;
gfptr := 0
end else begin
bwritebuf(gffile, gfbuf, halfbuf, gfbufsize - 1);
gflimit := gfbufsize
end
end; {:1155} {1157:}
procedure gffour(x: integer);
begin
if x >= 0 then begin
gfbuf[gfptr] := x div 16777216;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end else begin
x := x + 1073741824;
x := x + 1073741824;
begin
gfbuf[gfptr] := (x div 16777216) + 128;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end;
x := x mod 16777216;
begin
gfbuf[gfptr] := x div 65536;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
x := x mod 65536;
begin
gfbuf[gfptr] := x div 256;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := x mod 256;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end; {:1157} {1158:}
procedure gftwo(x: integer);
begin
begin
gfbuf[gfptr] := x div 256;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := x mod 256;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end;
procedure gfthree(x: integer);
begin
begin
gfbuf[gfptr] := x div 65536;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := (x mod 65536) div 256;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := x mod 256;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end; {:1158} {1159:}
procedure gfpaint(d: integer);
begin
if d < 64 then begin
gfbuf[gfptr] := 0 + d;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end else if d < 256 then begin
begin
gfbuf[gfptr] := 64;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := d;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end else begin
begin
gfbuf[gfptr] := 65;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gftwo(d)
end
end; {:1159}
{1160:}
procedure gfstring(s, t: strnumber);
var
k: poolpointer;
l: integer;
begin
if s <> 0 then begin
l := strstart[s + 1] - strstart[s];
if t <> 0 then
l := l + (strstart[t + 1] - strstart[t]);
if l <= 255 then begin
begin
gfbuf[gfptr] := 239;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := l;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end else begin
begin
gfbuf[gfptr] := 241;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gfthree(l)
end;
for k := strstart[s] to strstart[s + 1] - 1 do begin
gfbuf[gfptr] := strpool[k];
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end;
if t <> 0 then
for k := strstart[t] to strstart[t + 1] - 1 do begin
gfbuf[gfptr] := strpool[k];
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end; {:1160}
{1161:}
procedure gfboc(minm, maxm, minn, maxn: integer);
label
10;
begin
if minm < gfminm then
gfminm := minm;
if maxn > gfmaxn then
gfmaxn := maxn;
if bocp = (-1) then
if bocc >= 0 then
if bocc < 256 then
if (maxm - minm) >= 0 then
if (maxm - minm) < 256 then
if maxm >= 0 then
if maxm < 256 then
if (maxn - minn) >= 0 then
if (maxn - minn) < 256 then
if maxn >= 0 then
if maxn < 256 then begin
begin
gfbuf[gfptr] := 68;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := bocc;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := maxm - minm;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := maxm;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := maxn - minn;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := maxn;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
goto 10
end;
begin
gfbuf[gfptr] := 67;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(bocc);
gffour(bocp);
gffour(minm);
gffour(maxm);
gffour(minn);
gffour(maxn);
10:
end; {:1161} {1163:}
procedure initgf;
var
k: eightbits;
t: integer;
begin
gfminm := 4096;
gfmaxm := -4096;
gfminn := 4096;
gfmaxn := -4096;
for k := 0 to 255 do
charptr[k] := -1; {1164:}
if internal[27] <= 0 then
gfext := 908
else begin
oldsetting := selector;
selector := 5;
printchar(46);
printint(makescaled(internal[27], 59429463));
print(909);
gfext := makestring;
selector := oldsetting
end {:1164};
begin
if jobname = 0 then
openlogfile;
packjobname(gfext);
while not bopenout(gffile, nameoffile) do
promptfilename(620, gfext);
outputfilename := bmakenamestring(gffile)
end;
begin
gfbuf[gfptr] := 247;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := 131;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
oldsetting := selector;
selector := 5;
print(907);
printint(roundunscaled(internal[14]));
printchar(46);
printdd(roundunscaled(internal[15]));
printchar(46);
printdd(roundunscaled(internal[16]));
printchar(58);
t := roundunscaled(internal[17]);
printdd(t div 60);
printdd(t mod 60);
selector := oldsetting;
begin
gfbuf[gfptr] := poolptr - strstart[strptr];
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
strstart[strptr + 1] := poolptr;
gfstring(0, strptr);
poolptr := strstart[strptr];
gfprevptr := gfoffset + gfptr
end; {:1163} {1165:}
procedure shipout(c: eightbits);
label
30;
var
f: integer;
prevm, m, mm: integer;
prevn, n: integer;
p, q: halfword;
prevw, w, ww: integer;
d: integer;
delta: integer;
curminm: integer;
xoff, yoff: integer;
begin
if outputfilename = 0 then
initgf;
f := roundunscaled(internal[19]);
xoff := roundunscaled(internal[29]);
yoff := roundunscaled(internal[30]);
if termoffset > (maxprintline - 9) then
println
else if (termoffset > 0) or (fileoffset > 0) then
printchar(32);
printchar(91);
printint(c);
if f <> 0 then begin
printchar(46);
printint(f)
end;
flush(output);
bocc := (256 * f) + c;
bocp := charptr[c];
charptr[c] := gfprevptr;
if internal[34] > 0 then begin {1166:}
if xoff <> 0 then begin
gfstring(308, 0);
begin
gfbuf[gfptr] := 243;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(xoff * 65536)
end;
if yoff <> 0 then begin
gfstring(309, 0);
begin
gfbuf[gfptr] := 243;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(yoff * 65536)
end
end {:1166}; {1167:}
prevn := 4096;
p := mem[curedges].hh.lh;
n := mem[curedges + 1].hh.rh - 4096;
while p <> curedges do begin {1169:}
if mem[p + 1].hh.lh > (-29999) then
sortedges(p);
q := mem[p + 1].hh.rh;
w := 0;
prevm := -268435456;
ww := 0;
prevw := 0;
m := prevm;
repeat
if q = 30000 then
mm := 268435456
else begin
d := mem[q].hh.lh + 32768;
mm := d div 8;
ww := (ww + (d mod 8)) - 4
end;
if mm <> m then begin
if prevw <= 0 then begin
if w > 0 then begin {1170:}
if prevm = (-268435456) then begin {1172:}
if prevn = 4096 then begin
gfboc((mem[curedges + 2].hh.lh + xoff) - 4096, (mem[curedges + 2].hh.rh + xoff) - 4096, (mem[curedges + 1].hh.lh + yoff) - 4096, n + yoff);
curminm := (mem[curedges + 2].hh.lh - 4096) + mem[curedges + 3].hh.lh
end else if prevn > (n + 1) then begin {1174:}
delta := (prevn - n) - 1;
if delta < 256 then
if delta = 0 then begin
gfbuf[gfptr] := 70;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end else begin
begin
gfbuf[gfptr] := 71;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := delta;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end
else begin
begin
gfbuf[gfptr] := 72;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gftwo(delta)
end
end else begin {:1174} {1173:}
delta := m - curminm;
if delta > 164 then begin
gfbuf[gfptr] := 70;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end else begin
begin
gfbuf[gfptr] := 74 + delta;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
goto 30
end
end {:1173};
gfpaint(m - curminm);
30:
prevn := n
end else {:1172}
gfpaint(m - prevm);
prevm := m;
prevw := w
end {:1170}
end else if w <= 0 then begin {1171:}
gfpaint(m - prevm);
prevm := m;
prevw := w
end {:1171};
m := mm
end;
w := ww;
q := mem[q].hh.rh
until mm = 268435456;
if w <> 0 then
printnl(911);
if ((prevm - mem[curedges + 3].hh.lh) + xoff) > gfmaxm then
gfmaxm := (prevm - mem[curedges + 3].hh.lh) + xoff {:1169};
p := mem[p].hh.lh;
n := n - 1
end;
if prevn = 4096 then begin {1168:}
gfboc(0, 0, 0, 0);
if gfmaxm < 0 then
gfmaxm := 0;
if gfminn > 0 then
gfminn := 0
end else if (prevn + yoff) < gfminn then {:1168}
gfminn := prevn + yoff {:1167};
begin
gfbuf[gfptr] := 69;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gfprevptr := gfoffset + gfptr;
totalchars := totalchars + 1;
printchar(93);
flush(output);
if internal[11] > 0 then
printedges(910, true, xoff, yoff)
end; { shipout }
{:1165}
{995:}
{1006:}
procedure tryeq(l, r: halfword);
label
30, 31;
var
p: halfword;
t: 16..19;
q: halfword;
pp: halfword;
tt: 17..19;
copied: boolean; {1007:}
begin
t := mem[l].hh.b0;
if t = 16 then begin
t := 17;
p := constdependency(-mem[l + 1].int);
q := p
end else if t = 19 then begin
t := 17;
p := singledependency(l);
mem[p + 1].int := -mem[p + 1].int;
q := depfinal
end else begin
p := mem[l + 1].hh.rh;
q := p;
while true do begin
mem[q + 1].int := -mem[q + 1].int;
if mem[q].hh.lh = (-30000) then
goto 30;
q := mem[q].hh.rh
end;
30:
mem[mem[l + 1].hh.lh].hh.rh := mem[q].hh.rh;
mem[mem[q].hh.rh + 1].hh.lh := mem[l + 1].hh.lh;
mem[l].hh.b0 := 16
end {:1007};
{1009:}
if r = (-30000) then
if curtype = 16 then begin
mem[q + 1].int := mem[q + 1].int + curexp;
goto 31
end else begin
tt := curtype;
if tt = 19 then
pp := singledependency(curexp)
else
pp := mem[curexp + 1].hh.rh
end
else if mem[r].hh.b0 = 16 then begin
mem[q + 1].int := mem[q + 1].int + mem[r + 1].int;
goto 31
end else begin
tt := mem[r].hh.b0;
if tt = 19 then
pp := singledependency(r)
else
pp := mem[r + 1].hh.rh
end;
if tt <> 19 then
copied := false
else begin
copied := true;
tt := 17
end; {1010:}
watchcoefs := false;
if t = tt then
p := pplusq(p, pp, t)
else if t = 18 then
p := pplusfq(p, 65536, pp, 18, 17)
else begin
q := p;
while mem[q].hh.lh <> (-30000) do begin
mem[q + 1].int := roundfraction(mem[q + 1].int);
q := mem[q].hh.rh
end;
t := 18;
p := pplusq(p, pp, t)
end;
watchcoefs := true;
{:1010}
if copied then
flushnodelist(pp);
31: {:1009}
;
if mem[p].hh.lh = (-30000) then begin {1008:}
if abs(mem[p + 1].int) > 64 then begin
begin
if interaction = 3 then
;
printnl(133);
print(761)
end;
print(763);
printscaled(mem[p + 1].int);
printchar(41);
begin
helpptr := 2;
helpline[1] := 762;
helpline[0] := 760
end;
putgeterror
end else if r = (-30000) then begin {623:}
begin
if interaction = 3 then
;
printnl(133);
print(465)
end;
begin
helpptr := 2;
helpline[1] := 466;
helpline[0] := 467
end;
putgeterror
end {:623};
freenode(p, 2)
end else begin {:1008}
lineareq(p, t);
if r = (-30000) then
if curtype <> 16 then
if mem[curexp].hh.b0 = 16 then begin
pp := curexp;
curexp := mem[curexp + 1].int;
curtype := 16;
freenode(pp, 2)
end
end
end; {:1006} {1001:}
procedure makeeq(lhs: halfword);
label
20, 30, 45;
var
t: smallnumber;
v: integer;
p, q: halfword;
begin
20:
t := mem[lhs].hh.b0;
if t <= 14 then
v := mem[lhs + 1].int;
case t of {1003:}
2, 4, 6, 9, 11:
if curtype = (t + 1) then begin
nonlineareq(v, curexp, false);
goto 30
end else if curtype = t then begin {1004:}
if curtype <= 4 then begin
if curtype = 4 then begin
if strvsstr(v, curexp) <> 0 then
goto 45
end else if v <> curexp then
goto 45; {623:}
begin
begin
if interaction = 3 then
;
printnl(133);
print(465)
end;
begin
helpptr := 2;
helpline[1] := 466;
helpline[0] := 467
end;
putgeterror
end {:623};
goto 30
end;
begin
if interaction = 3 then
;
printnl(133);
print(758)
end;
begin
helpptr := 2;
helpline[1] := 759;
helpline[0] := 760
end;
putgeterror;
goto 30;
45:
begin
if interaction = 3 then
;
printnl(133);
print(761)
end;
begin
helpptr := 2;
helpline[1] := 762;
helpline[0] := 760
end;
putgeterror;
goto 30
end {:1004};
3, 5, 7, 12, 10:
if curtype = (t - 1) then begin
nonlineareq(curexp, lhs, true);
goto 30
end else if curtype = t then begin
ringmerge(lhs, curexp);
goto 30
end else if curtype = 14 then
if t = 10 then begin
pairtopath;
goto 20
end;
13, 14:
if curtype = t then begin {1005:}
p := v + bignodesize[t];
q := mem[curexp + 1].int + bignodesize[t];
repeat
p := p - 2;
q := q - 2;
tryeq(p, q)
until p = v;
goto 30
end {:1005};
16, 17, 18, 19:
if curtype >= 16 then begin
tryeq(lhs, -30000);
goto 30
end;
1:
end
{:1003}; {1002:}
disperr(lhs, 155);
disperr(-30000, 755);
if mem[lhs].hh.b0 <= 14 then
printtype(mem[lhs].hh.b0)
else
print(211);
printchar(61);
if curtype <= 14 then
printtype(curtype)
else
print(211);
printchar(41);
begin
helpptr := 2;
helpline[1] := 756;
helpline[0] := 757
end; {:1002}
putgeterror;
30:
begin
if aritherror then
cleararith
end;
recyclevalue(lhs);
freenode(lhs, 2)
end; {:1001}
procedure doassignment;
forward;
procedure doequation;
var
lhs: halfword;
p: halfword;
begin
lhs := stashcurexp;
getxnext;
varflag := 77;
scanexpression;
if curcmd = 51 then
doequation
else if curcmd = 77 then
doassignment;
if internal[7] > 131072 then begin {997:}
begindiagnostic;
printnl(714);
printexp(lhs, 0);
print(750);
printexp(-30000, 0);
print(706);
enddiagnostic(false)
end {:997};
if curtype = 10 then
if mem[lhs].hh.b0 = 14 then begin
p := stashcurexp;
unstashcurexp(lhs);
lhs := p
end;
makeeq(lhs)
end; {:995} {996:}
procedure doassignment;
var
lhs: halfword;
p: halfword;
q: halfword;
begin
if curtype <> 20 then begin
disperr(-30000, 747);
begin
helpptr := 2;
helpline[1] := 748;
helpline[0] := 749
end;
error;
doequation
end else begin
lhs := curexp;
curtype := 1;
getxnext;
varflag := 77;
scanexpression;
if curcmd = 51 then
doequation
else if curcmd = 77 then
doassignment;
if internal[7] > 131072 then begin {998:}
begindiagnostic;
printnl(123);
if mem[lhs].hh.lh > 2241 then
print(intname[mem[lhs].hh.lh - 2241])
else
showtokenlist(lhs, -30000, 1000, 0);
print(329);
printexp(-30000, 0);
printchar(125);
enddiagnostic(false)
end {:998};
if mem[lhs].hh.lh > 2241 then {999:}
if curtype = 16 then
internal[mem[lhs].hh.lh - 2241] := curexp
else begin
disperr(-30000, 751);
print(intname[mem[lhs].hh.lh - 2241]);
print(752);
begin
helpptr := 2;
helpline[1] := 753;
helpline[0] := 754
end;
putgeterror
end {:999} {1000:}
else begin
p := findvariable(lhs);
if p <> (-30000) then begin
q := stashcurexp;
curtype := undtype(p);
recyclevalue(p);
mem[p].hh.b0 := curtype;
mem[p + 1].int := -30000;
makeexpcopy(p);
p := stashcurexp;
unstashcurexp(q);
makeeq(p)
end else begin
obliterated(lhs);
putgeterror
end
end {:1000};
flushnodelist(lhs)
end
end; {:996} {1015:}
procedure dotypedeclaration;
var
t: smallnumber;
p: halfword;
q: halfword;
begin
if curmod >= 13 then
t := curmod
else
t := curmod + 1;
repeat
p := scandeclaredvariable;
flushvariable(eqtb[mem[p].hh.lh].rh, mem[p].hh.rh, false);
q := findvariable(p);
if q <> (-30000) then begin
mem[q].hh.b0 := t;
mem[q + 1].int := -30000
end else begin
begin
if interaction = 3 then
;
printnl(133);
print(764)
end;
begin
helpptr := 2;
helpline[1] := 765;
helpline[0] := 766
end;
putgeterror
end;
flushlist(p);
if curcmd < 79 then begin {1016:}
begin
if interaction = 3 then
;
printnl(133);
print(767)
end;
begin
helpptr := 5;
helpline[4] := 768;
helpline[3] := 769;
helpline[2] := 770;
helpline[1] := 771;
helpline[0] := 772
end;
if curcmd = 42 then
helpline[2] := 773;
putgeterror;
scannerstatus := 2;
repeat
getnext; {743:}
if curcmd = 39 then begin
if strref[curmod] < 127 then
if strref[curmod] > 1 then
strref[curmod] := strref[curmod] - 1
else
flushstring(curmod)
end {:743}
until curcmd >= 79;
scannerstatus := 0
end {:1016}
until curcmd > 79
end; { dotypedeclaration }
{:1015}
{1021:}
procedure dorandomseed;
begin
getxnext;
if curcmd <> 77 then begin
missingerr(329);
begin
helpptr := 1;
helpline[0] := 778
end;
backerror
end;
getxnext;
scanexpression;
if curtype <> 16 then begin
disperr(-30000, 779);
begin
helpptr := 2;
helpline[1] := 780;
helpline[0] := 781
end;
putgetflusherror(0)
end else begin {1022:}
initrandoms(curexp);
if selector >= 2 then begin
oldsetting := selector;
selector := 2;
printnl(782);
printscaled(curexp);
printchar(125);
printnl(155);
selector := oldsetting
end
end {:1022}
end; {:1021} {1029:}
procedure doprotection;
var
m: 0..1;
t: halfword;
begin
m := curmod;
repeat
getsymbol;
t := eqtb[cursym].lh;
if m = 0 then begin
if t >= 83 then
eqtb[cursym].lh := t - 83
end else if t < 83 then
eqtb[cursym].lh := t + 83;
getxnext
until curcmd <> 79
end; {:1029} {1031:}
procedure defdelims;
var
ldelim, rdelim: halfword;
begin
getclearsymbol;
ldelim := cursym;
getclearsymbol;
rdelim := cursym;
eqtb[ldelim].lh := 31;
eqtb[ldelim].rh := rdelim;
eqtb[rdelim].lh := 62;
eqtb[rdelim].rh := ldelim;
getxnext
end; {:1031} {1034:}
procedure dostatement;
forward;
procedure dointerim;
begin
getxnext;
if curcmd <> 40 then begin
begin
if interaction = 3 then
;
printnl(133);
print(788)
end;
if cursym = 0 then
print(793)
else
print(hash[cursym].rh);
print(794);
begin
helpptr := 1;
helpline[0] := 795
end;
backerror
end else begin
saveinternal(curmod);
backinput
end;
dostatement
end; { dointerim }
{:1034}
{1035:}
procedure dolet;
var
l: halfword;
begin
getsymbol;
l := cursym;
getxnext;
if curcmd <> 51 then
if curcmd <> 77 then begin
missingerr(61);
begin
helpptr := 3;
helpline[2] := 796;
helpline[1] := 538;
helpline[0] := 797
end;
backerror
end;
getsymbol;
if curcmd in
[10, 53, 44, 49] then
case curcmd of
10, 53, 44, 49:
mem[curmod].hh.lh := mem[curmod].hh.lh + 1
end
else
;
clearsymbol(l, false);
eqtb[l].lh := curcmd;
if curcmd = 41 then
eqtb[l].rh := -30000
else
eqtb[l].rh := curmod;
getxnext
end; {:1035} {1036:}
procedure donewinternal;
begin
repeat
if intptr = maxinternal then
overflow(798, maxinternal);
getclearsymbol;
intptr := intptr + 1;
eqtb[cursym].lh := 40;
eqtb[cursym].rh := intptr;
intname[intptr] := hash[cursym].rh;
internal[intptr] := 0;
getxnext
until curcmd <> 79
end; {:1036} {1040:}
procedure doshow;
begin
repeat
getxnext;
scanexpression;
printnl(629);
printexp(-30000, 2);
flushcurexp(0)
until curcmd <> 79
end; {:1040} {1041:}
procedure disptoken;
begin
printnl(804);
if cursym = 0 then begin {1042:}
if curcmd = 42 then
printscaled(curmod)
else if curcmd = 38 then begin
gpointer := curmod;
printcapsule
end else begin
printchar(34);
print(curmod);
printchar(34);
begin
if strref[curmod] < 127 then
if strref[curmod] > 1 then
strref[curmod] := strref[curmod] - 1
else
flushstring(curmod)
end
end
end else begin {:1042}
print(hash[cursym].rh);
printchar(61);
if eqtb[cursym].lh >= 83 then
print(805);
printcmdmod(curcmd, curmod);
if curcmd = 10 then begin
println;
showmacro(curmod, -30000, 100000)
end
end
end; {:1041} {1044:}
procedure doshowtoken;
begin
repeat
getnext;
disptoken;
getxnext
until curcmd <> 79
end; {:1044} {1045:}
procedure doshowstats;
{printint(varused);printchar(38);printint(dynused);
if false then}
begin
printnl(814);
print(228);
print(425);
printint((himemmin - lomemmax) - 1);
print(815);
println;
printnl(816);
printint(strptr - initstrptr);
printchar(38);
printint(poolptr - initpoolptr);
print(425);
printint(maxstrings - maxstrptr);
printchar(38);
printint(poolsize - maxpoolptr);
print(815);
println;
getxnext
end; {:1045}
{1046:}
procedure dispvar(p: halfword);
var
q: halfword;
n: 0..maxprintline;
begin
if mem[p].hh.b0 = 21 then begin {1047:}
q := mem[p + 1].hh.lh;
repeat
dispvar(q);
q := mem[q].hh.rh
until q = (-29983);
q := mem[p + 1].hh.rh;
while mem[q].hh.b1 = 3 do begin
dispvar(q);
q := mem[q].hh.rh
end
end else if mem[p].hh.b0 >= 22 then begin {:1047} {1048:}
printnl(155);
printvariablename(p);
if mem[p].hh.b0 > 22 then
print(530);
print(817);
if fileoffset >= (maxprintline - 20) then
n := 5
else
n := (maxprintline - fileoffset) - 15;
showmacro(mem[p + 1].int, -30000, n)
end else if mem[p].hh.b0 <> 0 then begin {:1048}
printnl(155);
printvariablename(p);
printchar(61);
printexp(p, 0)
end
end; {:1046} {1049:}
procedure doshowvar;
label
30;
begin
repeat
getnext;
if cursym > 0 then
if cursym <= 2241 then
if curcmd = 41 then
if curmod <> (-30000) then begin
dispvar(curmod);
goto 30
end;
disptoken;
30:
getxnext
until curcmd <> 79
end; {:1049} {1050:}
procedure doshowdependencies;
var
p: halfword;
begin
p := mem[-29987].hh.rh;
while p <> (-29987) do begin
if interesting(p) then begin
printnl(155);
printvariablename(p);
if mem[p].hh.b0 = 17 then
printchar(61)
else
print(632);
printdependency(mem[p + 1].hh.rh, mem[p].hh.b0)
end;
p := mem[p + 1].hh.rh;
while mem[p].hh.lh <> (-30000) do
p := mem[p].hh.rh;
p := mem[p].hh.rh
end;
getxnext
end; {:1050} {1051:}
procedure doshowwhatever;
begin
if interaction = 3 then
;
case curmod of
0:
doshowtoken;
1:
doshowstats;
2:
doshow;
3:
doshowvar;
4:
doshowdependencies
end;
if internal[32] > 0 then begin
begin
if interaction = 3 then
;
printnl(133);
print(818)
end;
if interaction < 3 then begin
helpptr := 0;
errorcount := errorcount - 1
end else begin
helpptr := 1;
helpline[0] := 819
end;
if curcmd = 80 then
error
else
putgeterror
end
end; {:1051} {1054:}
function scanwith: boolean;
var
t: smallnumber;
result: boolean;
begin
t := curmod;
curtype := 1;
getxnext;
scanexpression;
result := false;
if curtype <> t then begin {1055:}
disperr(-30000, 827);
begin
helpptr := 2;
helpline[1] := 828;
helpline[0] := 829
end;
if t = 6 then
helpline[1] := 830;
putgetflusherror(0)
end else if curtype = 6 then {:1055}
result := true {1056:}
else begin
curexp := roundunscaled(curexp);
if (abs(curexp) < 4) and (curexp <> 0) then
result := true
else begin
begin
if interaction = 3 then
;
printnl(133);
print(831)
end;
begin
helpptr := 1;
helpline[0] := 829
end;
putgetflusherror(0)
end
end {:1056};
scanwith := result
end; {:1054} {1057:}
procedure findedgesvar(t: halfword);
var
p: halfword;
begin
p := findvariable(t);
curedges := -30000;
if p = (-30000) then begin
obliterated(t);
putgeterror
end else if mem[p].hh.b0 <> 11 then begin
begin
if interaction = 3 then
;
printnl(133);
print(654)
end;
showtokenlist(t, -30000, 1000, 0);
print(832);
printtype(mem[p].hh.b0);
printchar(41);
begin
helpptr := 2;
helpline[1] := 833;
helpline[0] := 834
end;
putgeterror
end else
curedges := mem[p + 1].int;
flushnodelist(t)
end; {:1057} {1059:}
procedure doaddto;
label
30, 45;
var
lhs, rhs: halfword;
t: smallnumber;
w: integer;
p: halfword;
q: halfword;
begin
getxnext;
varflag := 68;
scanprimary;
if curtype <> 20 then begin {1060:}
disperr(-30000, 835);
begin
helpptr := 4;
helpline[3] := 836;
helpline[2] := 837;
helpline[1] := 838;
helpline[0] := 834
end;
putgetflusherror(0)
end else begin {:1060}
lhs := curexp;
curpathtype := curmod;
curtype := 1;
getxnext;
scanexpression;
if curpathtype = 2 then begin {1061:}
findedgesvar(lhs);
if curedges = (-30000) then
flushcurexp(0)
else if curtype <> 11 then begin
disperr(-30000, 839);
begin
helpptr := 2;
helpline[1] := 840;
helpline[0] := 834
end;
putgetflusherror(0)
end else begin
mergeedges(curexp);
flushcurexp(0)
end
end else begin {:1061} {1062:}
if curtype = 14 then
pairtopath;
if curtype <> 9 then begin
disperr(-30000, 839);
begin
helpptr := 2;
helpline[1] := 841;
helpline[0] := 834
end;
putgetflusherror(0);
flushtokenlist(lhs)
end else begin
rhs := curexp;
w := 1;
curpen := -29997;
{
1063:}
while curcmd = 66 do
if scanwith then
if curtype = 16 then
w := curexp
else begin
if mem[curpen].hh.lh = (-30000) then
tosspen(curpen)
else
mem[curpen].hh.lh := mem[curpen].hh.lh - 1;
curpen := curexp
end {:1063}; {1064:}
findedgesvar(lhs);
if curedges = (-30000) then
tossknotlist(rhs)
else begin
lhs := -30000;
if mem[rhs].hh.b0 = 0 then
if curpathtype = 0 then {1065:}
if mem[rhs].hh.rh = rhs then begin {1066:}
mem[rhs + 5].int := mem[rhs + 1].int;
mem[rhs + 6].int := mem[rhs + 2].int;
mem[rhs + 3].int := mem[rhs + 1].int;
mem[rhs + 4].int := mem[rhs + 2].int;
mem[rhs].hh.b0 := 1;
mem[rhs].hh.b1 := 1
end else begin {:1066}
p := htapypoc(rhs);
q := mem[p].hh.rh;
mem[pathtail + 5].int := mem[q + 5].int;
mem[pathtail + 6].int := mem[q + 6].int;
mem[pathtail].hh.b1 := mem[q].hh.b1;
mem[pathtail].hh.rh := mem[q].hh.rh;
freenode(q, 7);
mem[p + 5].int := mem[rhs + 5].int;
mem[p + 6].int := mem[rhs + 6].int;
mem[p].hh.b1 := mem[rhs].hh.b1;
mem[p].hh.rh := mem[rhs].hh.rh;
freenode(rhs, 7);
rhs := p
end {:1065} {1067:}
else begin
begin
if interaction = 3 then
;
printnl(133);
print(842)
end;
begin
helpptr := 2;
helpline[1] := 843;
helpline[0] := 834
end;
putgeterror;
tossknotlist(rhs);
goto 45
end {:1067}
else if curpathtype = 0 then
lhs := htapypoc(rhs);
curwt := w;
rhs := makespec(rhs, mem[curpen + 9].int, internal[5]); {1068:}
if turningnumber <= 0 then
if curpathtype <> 0 then
if internal[39] > 0 then
if (turningnumber < 0) and (mem[curpen].hh.rh = (-30000)) then
curwt := -curwt
else begin
if turningnumber = 0 then
if (internal[39] <= 65536) and (mem[curpen].hh.rh = (-30000)) then
goto 30
else
printstrange(844)
else
printstrange(845);
begin
helpptr := 3;
helpline[2] := 846;
helpline[1] := 847;
helpline[0] := 848
end;
putgeterror
end;
30: {:1068}
;
if mem[curpen + 9].int = 0 then
fillspec(rhs)
else
fillenvelope(rhs);
if lhs <> (-30000) then begin
revturns := true;
lhs := makespec(lhs, mem[curpen + 9].int, internal[5]);
revturns := false;
if mem[curpen + 9].int = 0 then
fillspec(lhs)
else
fillenvelope(lhs)
end;
45: {:1064}
end;
if mem[curpen].hh.lh = (-30000) then
tosspen(curpen)
else
mem[curpen].hh.lh := mem[curpen].hh.lh - 1
end
end {:1062}
end
end; {:1059} {1070:} {1098:}
function tfmcheck(m: smallnumber): scaled;
begin
if abs(internal[m]) >= 134217728 then begin
begin
if interaction = 3 then
;
printnl(133);
print(865)
end;
print(intname[m]);
print(866);
begin
helpptr := 1;
helpline[0] := 867
end;
putgeterror;
if internal[m] > 0 then
tfmcheck := 134217727
else
tfmcheck := -134217727
end else
tfmcheck := internal[m]
end; {:1098}
procedure doshipout;
label
10;
var
c: integer;
begin
getxnext;
varflag := 80;
scanexpression;
{1060:
}
if curtype <> 20 then
if curtype = 11 then
curedges := curexp
else begin
begin
disperr(-30000, 835);
begin
helpptr := 4;
helpline[3] := 836;
helpline[2] := 837;
helpline[1] := 838;
helpline[0] := 834
end;
putgetflusherror(0)
end {:1060};
goto 10
end
else begin
findedgesvar(curexp);
curtype := 1
end;
if curedges <> (-30000) then begin
c := roundunscaled(internal[18]) mod 256;
if c < 0 then
c := c + 256; {1099:}
if c < bc then
bc := c;
if c > ec then
ec := c;
charexists[c] := true;
gfdx[c] := internal[24];
gfdy[c] := internal[25];
tfmwidth[c] := tfmcheck(20);
tfmheight[c] := tfmcheck(21);
tfmdepth[c] := tfmcheck(22);
tfmitalcorr[c] := tfmcheck(23) {:1099};
if internal[34] >= 0 then
shipout(c)
end;
flushcurexp(0);
10:
end; {:1070}
{1071:}
procedure dodisplay;
label
45, 50, 10;
var
e: halfword;
begin
getxnext;
varflag := 73;
scanprimary;
if curtype <> 20 then begin {1060:}
disperr(-30000, 835);
begin
helpptr := 4;
helpline[3] := 836;
helpline[2] := 837;
helpline[1] := 838;
helpline[0] := 834
end;
putgetflusherror(0)
end else begin {:1060}
e := curexp;
curtype := 1;
getxnext;
scanexpression;
if curtype <> 16 then
goto 50;
curexp := roundunscaled(curexp);
if curexp < 0 then
goto 45;
if curexp > 15 then
goto 45;
if not windowopen[curexp] then
goto 45;
findedgesvar(e);
if curedges <> (-30000) then
dispedges(curexp);
goto 10;
45:
curexp := curexp * 65536;
50:
disperr(-30000, 849);
begin
helpptr := 1;
helpline[0] := 850
end;
putgetflusherror(0);
flushtokenlist(e)
end;
10:
end; { dodisplay }
{:1071}
{1072:}
function getpair(c: commandcode): boolean;
var
p: halfword;
b: boolean;
begin
if curcmd <> c then
getpair := false
else begin
getxnext;
scanexpression;
if nicepair(curexp, curtype) then begin
p := mem[curexp + 1].int;
curx := mem[p + 1].int;
cury := mem[p + 3].int;
b := true
end else
b := false;
flushcurexp(0);
getpair := b
end
end; {:1072} {1073:}
procedure doopenwindow;
label
45, 10;
var
k: integer;
r0, c0, r1, c1: scaled;
begin
getxnext;
scanexpression;
if curtype <> 16 then
goto 45;
k := roundunscaled(curexp);
if k < 0 then
goto 45;
if k > 15 then
goto 45;
if not getpair(70) then
goto 45;
r0 := curx;
c0 := cury;
if not getpair(71) then
goto 45;
r1 := curx;
c1 := cury;
if not getpair(72) then
goto 45;
openawindow(k, r0, c0, r1, c1, curx, cury);
goto 10;
45:
begin
if interaction = 3 then
;
printnl(133);
print(851)
end;
begin
helpptr := 2;
helpline[1] := 852;
helpline[0] := 853
end;
putgeterror;
10:
end; {:1073} {1074:}
procedure docull;
label
45, 10;
var
e: halfword;
keeping: 0..1;
w, win, wout: integer;
begin
w := 1;
getxnext;
varflag := 67;
scanprimary;
if curtype <> 20 then begin {1060:}
disperr(-30000, 835);
begin
helpptr := 4;
helpline[3] := 836;
helpline[2] := 837;
helpline[1] := 838;
helpline[0] := 834
end;
putgetflusherror(0)
end else begin {:1060}
e := curexp;
curtype := 1;
keeping := curmod;
if not getpair(67) then
goto 45;
while (curcmd = 66) and (curmod = 16) do
if scanwith then
w := curexp; {1075:}
if curx > cury then
goto 45;
if keeping = 0 then begin
if (curx > 0) or (cury < 0) then
goto 45;
wout := w;
win := 0
end else begin
if (curx <= 0) and (cury >= 0) then
goto 45;
wout := 0;
win := w
end {:1075};
findedgesvar(e);
if curedges <> (-30000) then
culledges(floorunscaled(curx + 65535), floorunscaled(cury), wout, win);
goto 10;
45:
begin
if interaction = 3 then
;
printnl(133);
print(854)
end;
begin
helpptr := 1;
helpline[0] := 855
end;
putgeterror;
flushtokenlist(e)
end;
10:
end; {:1074} {1082:}
procedure domessage;
var
m: 0..2;
begin
m := curmod;
getxnext;
scanexpression;
if curtype <> 4 then begin
disperr(-30000, 565);
begin
helpptr := 1;
helpline[0] := 859
end;
putgeterror
end else
case m of
0:
begin
printnl(155);
slowprint(curexp)
end;
1:
begin {1086:}
begin
if interaction = 3 then
;
printnl(133);
print(155)
end;
slowprint(curexp);
if errhelp <> 0 then
useerrhelp := true
else if longhelpseen then begin
helpptr := 1;
helpline[0] := 860
end else begin
if interaction < 3 then
longhelpseen := true;
begin
helpptr := 4;
helpline[3] := 861;
helpline[2] := 862;
helpline[1] := 863;
helpline[0] := 864
end
end;
putgeterror;
useerrhelp := false
end; {:1086}
2:
begin {1083:}
if errhelp <> 0 then begin
if strref[errhelp] < 127 then
if strref[errhelp] > 1 then
strref[errhelp] := strref[errhelp] - 1
else
flushstring(errhelp)
end;
if (strstart[curexp + 1] - strstart[curexp]) = 0 then
errhelp := 0
else begin
errhelp := curexp;
begin
if strref[errhelp] < 127 then
strref[errhelp] := strref[errhelp] + 1
end
end
end
end {:1083};
flushcurexp(0)
end; {:1082} {1103:}
function getcode: eightbits;
label
40;
var
c: integer;
begin
getxnext;
scanexpression;
if curtype = 16 then begin
c := roundunscaled(curexp);
if c >= 0 then
if c < 256 then
goto 40
end else if curtype = 4 then
if (strstart[curexp + 1] - strstart[curexp]) = 1 then begin
c := strpool[strstart[curexp]];
goto 40
end;
disperr(-30000, 873);
begin
helpptr := 2;
helpline[1] := 874;
helpline[0] := 875
end;
putgetflusherror(0);
c := 0;
40:
getcode := c
end; {:1103} {1104:}
procedure settag(c: eightbits; t: smallnumber; r: eightbits);
begin
if chartag[c] = 0 then begin
chartag[c] := t;
charremainder[c] := r
end else begin {1105:}
begin
if interaction = 3 then
;
printnl(133);
print(876)
end;
if (c > 32) and (c < 128) then
print(c)
else begin
print(877);
printint(c)
end;
print(878);
case chartag[c] of
1:
print(879);
2:
print(880);
3:
print(870)
end;
begin
helpptr := 2;
helpline[1] := 881;
helpline[0] := 834
end;
putgeterror
end {:1105}
end; {:1104} {1106:}
procedure dotfmcommand;
label
22;
var
c, cc: eightbits;
k: 0..256;
j: integer;
begin
case curmod of
0:
begin {1107:}
c := getcode;
while curcmd = 78 do begin
cc := getcode;
settag(c, 2, cc);
c := cc
end
end; {:1107}
1:
begin {1108:}
22:
c := getcode;
if curcmd = 78 then begin {1111:}
if nl < 256 then
settag(c, 1, nl)
else begin
begin
if interaction = 3 then
;
printnl(133);
print(891)
end;
begin
helpptr := 1;
helpline[0] := 892
end;
error
end;
goto 22
end {:1111};
if curcmd = 76 then begin {1112:}
ligkern[nl].b1 := c - 128;
ligkern[nl].b2 := curmod - 128;
ligkern[nl].b0 := -128;
if curmod = 0 then
ligkern[nl].b3 := getcode - 128
else begin
getxnext;
scanexpression;
if curtype <> 16 then begin
disperr(-30000, 893);
begin
helpptr := 2;
helpline[1] := 894;
helpline[0] := 179
end;
putgetflusherror(0)
end;
kern[nk] := curexp;
k := 0;
while kern[k] <> curexp do
k := k + 1;
if k = nk then begin
if nk = 256 then
overflow(890, 256);
nk := nk + 1
end;
ligkern[nl].b3 := k - 128
end {:1112};
if nl = ligtablesize then
overflow(886, ligtablesize);
nl := nl + 1;
if curcmd = 79 then
goto 22
end else begin
begin
if interaction = 3 then
;
printnl(133);
print(887)
end;
begin
helpptr := 1;
helpline[0] := 888
end;
backerror
end;
if nl > 0 then
ligkern[nl - 1].b0 := 0
end; {:1108}
2:
begin {1113:}
if ne = 256 then
overflow(870, 256);
c := getcode;
settag(c, 3, ne);
if curcmd <> 78 then begin
missingerr(58);
begin
helpptr := 1;
helpline[0] := 895
end;
backerror
end;
exten[ne].b0 := getcode - 128;
if curcmd <> 79 then begin
missingerr(44);
begin
helpptr := 1;
helpline[0] := 895
end;
backerror
end;
exten[ne].b1 := getcode - 128;
if curcmd <> 79 then begin
missingerr(44);
begin
helpptr := 1;
helpline[0] := 895
end;
backerror
end;
exten[ne].b2 := getcode - 128;
if curcmd <> 79 then begin
missingerr(44);
begin
helpptr := 1;
helpline[0] := 895
end;
backerror
end;
exten[ne].b3 := getcode - 128;
ne := ne + 1
end; {:1113}
3, 4:
begin
c := curmod;
getxnext;
scanexpression;
if (curtype <> 16) or (curexp < 32768) then begin
disperr(-30000, 882);
begin
helpptr := 2;
helpline[1] := 883;
helpline[0] := 884
end;
putgeterror
end else begin
j := roundunscaled(curexp);
if curcmd <> 78 then begin
missingerr(58);
begin
helpptr := 1;
helpline[0] := 885
end;
backerror
end;
if c = 3 then {1114:}
repeat
if j > headersize then
overflow(871, headersize);
headerbyte[j] := getcode;
j := j + 1
until curcmd <> 79 {:1114} {1115:}
else
repeat
if j > maxfontdimen then
overflow(872, maxfontdimen);
while j > np do begin
np := np + 1;
param[np] := 0
end;
getxnext;
scanexpression;
if curtype <> 16 then begin
disperr(-30000, 896);
begin
helpptr := 1;
helpline[0] := 179
end;
putgetflusherror(0)
end;
param[j] := curexp;
j := j + 1
until curcmd <> 79 {:1115}
end
end
end
end; {:1106} {1177:}
procedure dospecial;
var
m: smallnumber;
begin
m := curmod;
getxnext;
scanexpression;
if internal[34] >= 0 then
if curtype <> m then begin {1178:}
disperr(-30000, 914);
begin
helpptr := 1;
helpline[0] := 915
end;
putgeterror
end else begin {:1178}
if outputfilename = 0 then
initgf;
if m = 4 then
gfstring(curexp, 0)
else begin
begin
gfbuf[gfptr] := 243;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(curexp)
end
end;
flushcurexp(0)
end; {:1177} {1186:}
{procedure storebasefile;var k:integer;
p,q:halfword;x:integer;w:fourquarters;begin[1200:]selector:=5;
print(925);print(jobname);printchar(32);
printint(roundunscaled(internal[14])mod 100);printchar(46);
printint(roundunscaled(internal[15]));printchar(46);
printint(roundunscaled(internal[16]));printchar(41);
if interaction=0 then selector:=2 else selector:=3;
begin if poolptr+1>maxpoolptr then begin if poolptr+1>poolsize then
overflow(129,poolsize-initpoolptr);maxpoolptr:=poolptr+1;end;end;
baseident:=makestring;strref[baseident]:=127;packjobname(926);
while not wopenout(basefile)do promptfilename(927,926);printnl(928);
print(wmakenamestring(basefile));flushstring(strptr-1);
printnl(baseident)[:1200];[1190:]begin basefile^.int:=503742536;
put(basefile);end;begin basefile^.int:=-30000;put(basefile);end;
begin basefile^.int:=30000;put(basefile);end;begin basefile^.int:=2100;
put(basefile);end;begin basefile^.int:=1777;put(basefile);end;
begin basefile^.int:=6;put(basefile);end[:1190];
[1192:]begin basefile^.int:=poolptr;put(basefile);end;
begin basefile^.int:=strptr;put(basefile);end;
for k:=0 to strptr do begin basefile^.int:=strstart[k];put(basefile);
end;k:=0;while k+4<poolptr do begin w.b0:=strpool[k];w.b1:=strpool[k+1];
w.b2:=strpool[k+2];w.b3:=strpool[k+3];begin basefile^.qqqq:=w;
put(basefile);end;k:=k+4;end;k:=poolptr-4;w.b0:=strpool[k];
w.b1:=strpool[k+1];w.b2:=strpool[k+2];w.b3:=strpool[k+3];
begin basefile^.qqqq:=w;put(basefile);end;println;printint(strptr);
print(922);printint(poolptr)[:1192];[1194:]sortavail;varused:=0;
begin basefile^.int:=lomemmax;put(basefile);end;
begin basefile^.int:=rover;put(basefile);end;p:=-30000;q:=rover;x:=0;
repeat for k:=p to q+1 do begin basefile^:=mem[k];put(basefile);end;
x:=x+q+2-p;varused:=varused+q-p;p:=q+mem[q].hh.lh;q:=mem[q+1].hh.rh;
until q=rover;varused:=varused+lomemmax-p;dynused:=memend+1-himemmin;
for k:=p to lomemmax do begin basefile^:=mem[k];put(basefile);end;
x:=x+lomemmax+1-p;begin basefile^.int:=himemmin;put(basefile);end;
begin basefile^.int:=avail;put(basefile);end;
for k:=himemmin to memend do begin basefile^:=mem[k];put(basefile);end;
x:=x+memend+1-himemmin;p:=avail;
while p<>-30000 do begin dynused:=dynused-1;p:=mem[p].hh.rh;end;
begin basefile^.int:=varused;put(basefile);end;
begin basefile^.int:=dynused;put(basefile);end;println;printint(x);
print(923);printint(varused);printchar(38);printint(dynused)[:1194];
[1196:]begin basefile^.int:=hashused;put(basefile);end;
stcount:=2228-hashused;
for p:=1 to hashused do if hash[p].rh<>0 then begin begin basefile^.int
:=p;put(basefile);end;begin basefile^.hh:=hash[p];put(basefile);end;
begin basefile^.hh:=eqtb[p];put(basefile);end;stcount:=stcount+1;end;
for p:=hashused+1 to 2241 do begin begin basefile^.hh:=hash[p];
put(basefile);end;begin basefile^.hh:=eqtb[p];put(basefile);end;end;
begin basefile^.int:=stcount;put(basefile);end;println;
printint(stcount);print(924)[:1196];[1198:]begin basefile^.int:=intptr;
put(basefile);end;
for k:=1 to intptr do begin begin basefile^.int:=internal[k];
put(basefile);end;begin basefile^.int:=intname[k];put(basefile);end;end;
begin basefile^.int:=startsym;put(basefile);end;
begin basefile^.int:=interaction;put(basefile);end;
begin basefile^.int:=baseident;put(basefile);end;
begin basefile^.int:=bgloc;put(basefile);end;begin basefile^.int:=egloc;
put(basefile);end;begin basefile^.int:=serialno;put(basefile);end;
begin basefile^.int:=69069;put(basefile);end;internal[12]:=0[:1198];
[1201:]wclose(basefile)[:1201];end;}
{:1186}
procedure dostatement;
begin
curtype := 1;
getxnext;
if curcmd > 43 then begin {990:}
if curcmd < 80 then begin
begin
if interaction = 3 then
;
printnl(133);
print(733)
end;
printcmdmod(curcmd, curmod);
printchar(39);
begin
helpptr := 5;
helpline[4] := 734;
helpline[3] := 735;
helpline[2] := 736;
helpline[1] := 737;
helpline[0] := 738
end;
backerror;
getxnext
end
end else if curcmd > 30 then begin {:990} {993:}
varflag := 77;
scanexpression;
if curcmd < 81 then begin
if curcmd = 51 then
doequation
else if curcmd = 77 then
doassignment
else if curtype = 4 then begin {994:}
if internal[1] > 0 then begin
printnl(155);
slowprint(curexp);
{---------------------}
auxprintnl(155);
auxslowprint(curexp);
{---------------------}
flush(output)
end;
if internal[34] > 0 then begin {1179:}
if outputfilename = 0 then
initgf;
gfstring(916, curexp)
end {:1179}
end else if curtype <> 1 then begin {:994}
disperr(-30000, 743);
begin
helpptr := 3;
helpline[2] := 744;
helpline[1] := 745;
helpline[0] := 746
end;
putgeterror
end;
flushcurexp(0);
curtype := 1
end
end else begin {:993} {992:}
if internal[7] > 0 then
showcmdmod(curcmd, curmod);
case curcmd of
30:
dotypedeclaration;
16:
if curmod > 2 then
makeopdef
else if curmod > 0 then
scandef; {1020:}
24:
dorandomseed; {:1020} {1023:}
23:
begin
println;
interaction := curmod; {70:}
if interaction = 0 then
selector := 0
else
selector := 1 {:70};
if jobname <> 0 then
selector := selector + 2;
getxnext
end; {:1023} {1026:}
21:
doprotection; {:1026} {1030:}
27:
defdelims; {:1030} {1033:}
12:
repeat
getsymbol;
savevariable(cursym);
getxnext
until curcmd <> 79;
13:
dointerim;
14:
dolet;
15:
donewinternal; {:1033} {1039:}
22:
doshowwhatever;
{:1039}
{1058:}
18:
doaddto; {:1058} {1069:}
17:
doshipout;
11:
dodisplay;
28:
doopenwindow;
19:
docull; {:1069} {1076:}
26:
begin
getsymbol;
startsym := cursym;
getxnext
end; {:1076} {1081:}
25:
domessage; {:1081} {1100:}
20:
dotfmcommand; {:1100} {1175:}
29:
dospecial
end {:1175};
curtype := 1
end {:992};
if curcmd < 80 then begin {991:}
begin
if interaction = 3 then
;
printnl(133);
print(739)
end;
begin
helpptr := 6;
helpline[5] := 740;
helpline[4] := 741;
helpline[3] := 742;
helpline[2] := 736;
helpline[1] := 737;
helpline[0] := 738
end;
backerror;
scannerstatus := 2;
repeat
getnext; {743:}
if curcmd = 39 then begin
if strref[curmod] < 127 then
if strref[curmod] > 1 then
strref[curmod] := strref[curmod] - 1
else
flushstring(curmod)
end {:743}
until curcmd > 79;
scannerstatus := 0
end {:991};
errorcount := 0
end; {:989}
{1017:}
procedure maincontrol;
begin
repeat
dostatement;
if curcmd = 81 then begin
begin
if interaction = 3 then
;
printnl(133);
print(774)
end;
begin
helpptr := 2;
helpline[1] := 775;
helpline[0] := 555
end;
flusherror(0)
end
until curcmd = 82
end; {:1017} {1117:}
function sortin(v: scaled): halfword;
label
40;
var
p, q, r: halfword;
begin
p := 29999;
while true do begin
q := mem[p].hh.rh;
if v <= mem[q + 1].int then
goto 40;
p := q
end;
40:
if v < mem[q + 1].int then begin
r := getnode(2);
mem[r + 1].int := v;
mem[r].hh.rh := q;
mem[p].hh.rh := r
end;
sortin := mem[p].hh.rh
end; {:1117}
{1118:}
function mincover(d: scaled): integer;
var
p: halfword;
l: scaled;
m: integer;
begin
m := 0;
p := mem[29999].hh.rh;
perturbation := 2147483647;
while p <> (-29981) do begin
m := m + 1;
l := mem[p + 1].int;
repeat
p := mem[p].hh.rh
until mem[p + 1].int > (l + d);
if (mem[p + 1].int - l) < perturbation then
perturbation := mem[p + 1].int - l
end;
mincover := m
end; {:1118} {1120:}
function threshold(m: integer): scaled;
var
d: scaled;
begin
if mincover(0) <= m then
threshold := 0
else begin
repeat
d := perturbation
until mincover(d + d) <= m;
while mincover(d) > m do
d := perturbation;
threshold := d
end
end; {:1120}
{1121:}
function skimp(m: integer): integer;
var
d: scaled;
p, q, r: halfword;
l: scaled;
v: scaled;
begin
d := threshold(m);
perturbation := 0;
q := 29999;
m := 0;
p := mem[29999].hh.rh;
while p <> (-29981) do begin
m := m + 1;
l := mem[p + 1].int;
mem[p].hh.lh := m;
if mem[mem[p].hh.rh + 1].int <= (l + d) then begin {1122:}
repeat
p := mem[p].hh.rh;
mem[p].hh.lh := m
until mem[mem[p].hh.rh + 1].int > (l + d);
v := (l + mem[p + 1].int) div 2;
if (mem[p + 1].int - v) > perturbation then
perturbation := mem[p + 1].int - v;
r := q;
repeat
r := mem[r].hh.rh;
mem[r + 1].int := v
until r = p;
mem[q].hh.rh := p
end {:1122};
q := p;
p := mem[p].hh.rh
end;
skimp := m
end; {:1121} {1123:}
procedure tfmwarning(m: smallnumber);
begin
printnl(897);
print(intname[m]);
print(898);
printscaled(perturbation);
print(899)
end; { tfmwarning }
{:1123}
{1128:}
procedure fixdesignsize;
var
d: scaled;
begin
d := internal[26];
if (d < 65536) or (d >= 134217728) then begin
if d <> 0 then
printnl(900);
d := 8388608;
internal[26] := d
end;
if headerbyte[5] < 0 then
if headerbyte[6] < 0 then
if headerbyte[7] < 0 then
if headerbyte[8] < 0 then begin
headerbyte[5] := d div 1048576;
headerbyte[6] := (d div 4096) mod 256;
headerbyte[7] := (d div 16) mod 256;
headerbyte[8] := (d mod 16) * 16
end;
maxtfmdimen := (16 * internal[26]) - (internal[26] div 2097152);
if maxtfmdimen >= 134217728 then
maxtfmdimen := 134217727
end; {:1128} {1129:}
function dimenout(x: scaled): integer;
begin
if abs(x) > maxtfmdimen then begin
tfmchanged := tfmchanged + 1;
if x > 0 then
x := 16777215
else
x := -16777215
end else
x := makescaled(x * 16, internal[26]);
dimenout := x
end; {:1129} {1131:}
procedure fixchecksum;
label
10;
var
k: eightbits;
b1, b2, b3, b4: eightbits;
x: integer;
begin
if headerbyte[1] < 0 then
if headerbyte[2] < 0 then
if headerbyte[3] < 0 then
if headerbyte[4] < 0 then begin {1132:}
b1 := bc;
b2 := ec;
b3 := bc;
b4 := ec;
tfmchanged := 0;
for k := bc to ec do
if charexists[k] then begin
x := dimenout(mem[tfmwidth[k] + 1].int) + ((k + 4) * 4194304);
b1 := ((b1 + b1) + x) mod 255;
b2 := ((b2 + b2) + x) mod 253;
b3 := ((b3 + b3) + x) mod 251;
b4 := ((b4 + b4) + x) mod 247
end {:1132};
headerbyte[1] := b1;
headerbyte[2] := b2;
headerbyte[3] := b3;
headerbyte[4] := b4;
goto 10
end;
for k := 1 to 4 do
if headerbyte[k] < 0 then
headerbyte[k] := 0;
10:
end; {:1131}
{1133:}
procedure tfmqqqq(x: fourquarters);
begin
bwritebyte(tfmfile, x.b0 + 128);
bwritebyte(tfmfile, x.b1 + 128);
bwritebyte(tfmfile, x.b2 + 128);
bwritebyte(tfmfile, x.b3 + 128)
end; {:1133}
{1187:}
{779:}
function openbasefile: boolean;
label
40, 10;
var
j: 0..bufsize;
begin
j := curinput.locfield;
if buffer[curinput.locfield] = 38 then begin
curinput.locfield := curinput.locfield + 1;
j := curinput.locfield;
buffer[last] := 32;
while buffer[j] <> 32 do
j := j + 1;
packbufferedname(0, curinput.locfield, j - 1);
if wopenin(basefile) then
goto 40;
writeln(output, 'Sorry, I can''t find that base;', ' will try PLAIN.');
flush(output)
end;
packbufferedname(5, 1, 0);
if not wopenin(basefile) then begin
writeln(output, 'I can''t find the PLAIN base file!');
openbasefile := false;
goto 10
end;
40:
curinput.locfield := j;
openbasefile := true;
10:
end; {:779}
function loadbasefile: boolean;
label
6666, 10;
var
k: integer;
p, q: halfword;
x: integer;
w: fourquarters; {1191:}
begin
x := basefile^.int;
if x <> 503742536 then
goto 6666;
begin
get(basefile);
x := basefile^.int
end;
if x <> (-30000) then
goto 6666;
begin
get(basefile);
x := basefile^.int
end;
if x <> 30000 then
goto 6666;
begin
get(basefile);
x := basefile^.int
end;
if x <> 2100 then
goto 6666;
begin
get(basefile);
x := basefile^.int
end;
if x <> 1777 then
goto 6666;
begin
get(basefile);
x := basefile^.int
end;
if x <> 6 then
goto 6666 {:1191};
{1193:}
begin
begin
get(basefile);
x := basefile^.int
end;
if x < 0 then
goto 6666;
if x > poolsize then begin
writeln(output, '---! Must increase the ', 'string pool size');
goto 6666
end else
poolptr := x
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if x < 0 then
goto 6666;
if x > maxstrings then begin
writeln(output, '---! Must increase the ', 'max strings');
goto 6666
end else
strptr := x
end;
for k := 0 to strptr do begin
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 0) or (x > poolptr) then
goto 6666
else
strstart[k] := x
end;
strref[k] := 127
end;
k := 0;
while (k + 4) < poolptr do begin
begin
get(basefile);
w := basefile^.qqqq
end;
strpool[k] := w.b0;
strpool[k + 1] := w.b1;
strpool[k + 2] := w.b2;
strpool[k + 3] := w.b3;
k := k + 4
end;
k := poolptr - 4;
begin
get(basefile);
w := basefile^.qqqq
end;
strpool[k] := w.b0;
strpool[k + 1] := w.b1;
strpool[k + 2] := w.b2;
strpool[k + 3] := w.b3 {:1193}; {1195:}
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < (-28978)) or (x > 29997) then
goto 6666
else
lomemmax := x
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < (-29977)) or (x > lomemmax) then
goto 6666
else
rover := x
end;
p := -30000;
q := rover;
x := 0;
repeat
for k := p to q + 1 do begin
get(basefile);
mem[k] := basefile^
end;
p := q + mem[q].hh.lh;
if (p > lomemmax) or ((q >= mem[q + 1].hh.rh) and (mem[q + 1].hh.rh <> rover)) then
goto 6666;
q := mem[q + 1].hh.rh
until q = rover;
for k := p to lomemmax do begin
get(basefile);
mem[k] := basefile^
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < (lomemmax + 1)) or (x > 29998) then
goto 6666
else
himemmin := x
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < (-30000)) or (x > 30000) then
goto 6666
else
avail := x
end;
memend := 30000;
for k := himemmin to memend do begin
get(basefile);
mem[k] := basefile^
end;
begin
get(basefile);
varused := basefile^.int
end;
begin
get(basefile);
dynused := basefile^.int
end {:1195}; {1197:}
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 1) or (x > 2229) then
goto 6666
else
hashused := x
end;
p := 0;
repeat
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < (p + 1)) or (x > hashused) then
goto 6666
else
p := x
end;
begin
get(basefile);
hash[p] := basefile^.hh
end;
begin
get(basefile);
eqtb[p] := basefile^.hh
end
until p = hashused;
for p := hashused + 1 to 2241 do begin
begin
get(basefile);
hash[p] := basefile^.hh
end;
begin
get(basefile);
eqtb[p] := basefile^.hh
end
end;
begin
get(basefile);
stcount := basefile^.int
end {:1197}; {1199:}
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 40) or (x > maxinternal) then
goto 6666
else
intptr := x
end;
for k := 1 to intptr do begin
begin
get(basefile);
internal[k] := basefile^.int
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 0) or (x > strptr) then
goto 6666
else
intname[k] := x
end
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 0) or (x > 2229) then
goto 6666
else
startsym := x
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 0) or (x > 3) then
goto 6666
else
interaction := x
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 0) or (x > strptr) then
goto 6666
else
baseident := x
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 1) or (x > 2241) then
goto 6666
else
bgloc := x
end;
begin
begin
get(basefile);
x := basefile^.int
end;
if (x < 1) or (x > 2241) then
goto 6666
else
egloc := x
end;
begin
get(basefile);
serialno := basefile^.int
end;
begin
get(basefile);
x := basefile^.int
end;
if (x <> 69069) or eof(basefile) then
goto 6666 {:1199};
loadbasefile := true;
goto 10;
6666:
;
writeln(output, '(Fatal base file error; I''m stymied)');
loadbasefile := false;
10:
end; {:1187} {1202:} {823:}
procedure scanprimary;
label
20, 30, 31, 32;
var
p, q, r: halfword;
c: quarterword;
myvarflag: 0..82;
ldelim, rdelim: halfword; {831:}
groupline: integer; {:831} {836:}
num, denom: scaled; {:836} {843:}
prehead, posthead, tail: halfword;
tt: smallnumber;
t: halfword;
macroref: halfword; {:843}
begin
myvarflag := varflag;
varflag := 0;
20:
begin
if aritherror then
cleararith
end; {825:}
{if panicking then checkmem(false);}
if interrupt <> 0 then
if OKtointerrupt then begin
backinput;
begin
if interrupt <> 0 then
pauseforinstructions
end;
getxnext
end {:825};
if curcmd in
[31, 32, 39, 42, 33, 34, 30, 36,
43, 37, 35, 40, 38, 41] then
case curcmd of
31:
begin {826:}
ldelim := cursym;
rdelim := curmod;
getxnext;
scanexpression;
if (curcmd = 79) and (curtype >= 16) then begin {830:}
p := getnode(2);
mem[p].hh.b0 := 14;
mem[p].hh.b1 := 11;
initbignode(p);
q := mem[p + 1].int;
stashin(q);
getxnext;
scanexpression;
if curtype < 16 then begin
disperr(-30000, 639);
begin
helpptr := 4;
helpline[3] := 640;
helpline[2] := 641;
helpline[1] := 642;
helpline[0] := 643
end;
putgetflusherror(0)
end;
stashin(q + 2);
checkdelimiter(ldelim, rdelim);
curtype := 14;
curexp := p
end else {:830}
checkdelimiter(ldelim, rdelim)
end; {:826}
32:
begin {832:}
groupline := line;
if internal[7] > 0 then
showcmdmod(curcmd, curmod);
begin
p := getavail;
mem[p].hh.lh := 0;
mem[p].hh.rh := saveptr;
saveptr := p
end;
repeat
dostatement
until curcmd <> 80;
if curcmd <> 81 then begin
begin
if interaction = 3 then
;
printnl(133);
print(644)
end;
printint(groupline);
print(645);
begin
helpptr := 2;
helpline[1] := 646;
helpline[0] := 647
end;
backerror;
curcmd := 81
end;
unsave;
if internal[7] > 0 then
showcmdmod(curcmd, curmod)
end; {:832}
39:
begin {833:}
curtype := 4;
curexp := curmod
end; {:833}
42:
begin {837:}
curexp := curmod;
curtype := 16;
getxnext;
if curcmd <> 54 then begin
num := 0;
denom := 0
end else begin
getxnext;
if curcmd <> 42 then begin
backinput;
curcmd := 54;
curmod := 72;
cursym := 2233;
goto 30
end;
num := curexp;
denom := curmod;
if denom = 0 then begin {838:}
begin
if interaction = 3 then
;
printnl(133);
print(648)
end;
begin
helpptr := 1;
helpline[0] := 649
end;
error
end else {:838}
curexp := makescaled(num, denom);
begin
if aritherror then
cleararith
end;
getxnext
end;
if curcmd >= 30 then
if curcmd < 42 then begin
p := stashcurexp;
scanprimary;
if (abs(num) >= abs(denom)) or (curtype < 14) then
dobinary(p, 71)
else begin
fracmult(num, denom);
freenode(p, 2)
end
end;
goto 30
end; {:837}
33: {834:}
donullary(curmod) {:834};
34, 30, 36, 43:
begin {835:}
c := curmod;
getxnext;
scanprimary;
dounary(c);
goto 30
end; {:835}
37:
begin {839:}
c := curmod;
getxnext;
scanexpression;
if curcmd <> 69 then begin
missingerr(347);
print(581);
printcmdmod(37, c);
begin
helpptr := 1;
helpline[0] := 582
end;
backerror
end;
p := stashcurexp;
getxnext;
scanprimary;
dobinary(p, c);
goto 30
end; {:839}
35:
begin {840:}
getxnext;
scansuffix;
oldsetting := selector;
selector := 5;
showtokenlist(curexp, -30000, 100000, 0);
flushtokenlist(curexp);
curexp := makestring;
selector := oldsetting;
curtype := 4;
goto 30
end; {:840}
40:
begin {841:}
q := curmod;
if myvarflag = 77 then begin
getxnext;
if curcmd = 77 then begin
curexp := getavail;
mem[curexp].hh.lh := q + 2241;
curtype := 20;
goto 30
end;
backinput
end;
curtype := 16;
curexp := internal[q]
end; {:841}
38:
makeexpcopy(curmod);
41:
begin {844:}
begin
prehead := avail;
if prehead = (-30000) then
prehead := getavail
else begin
avail := mem[prehead].hh.rh;
mem[prehead].hh.rh := -30000
end {dynused:=dynused+1;}
end;
tail := prehead;
posthead := -30000;
tt := 1;
while true do begin
t := curtok;
mem[tail].hh.rh := t;
if tt <> 0 then begin {850:}
begin
p := mem[prehead].hh.rh;
q := mem[p].hh.lh;
tt := 0;
if (eqtb[q].lh mod 83) = 41 then begin
q := eqtb[q].rh;
if q = (-30000) then
goto 32;
while true do begin
p := mem[p].hh.rh;
if p = (-30000) then begin
tt := mem[q].hh.b0;
goto 32
end;
if mem[q].hh.b0 <> 21 then
goto 32;
q := mem[mem[q + 1].hh.lh].hh.rh;
if p >= himemmin then begin
repeat
q := mem[q].hh.rh
until mem[q + 2].hh.lh >= mem[p].hh.lh;
if mem[q + 2].hh.lh > mem[p].hh.lh then
goto 32
end
end
end;
32: {:850}
end;
if tt >= 22 then begin {845:}
mem[tail].hh.rh := -30000;
if tt > 22 then begin
posthead := getavail;
tail := posthead;
mem[tail].hh.rh := t;
tt := 0;
macroref := mem[q + 1].int;
mem[macroref].hh.lh := mem[macroref].hh.lh + 1
end else begin {853:}
p := getavail;
mem[prehead].hh.lh := mem[prehead].hh.rh;
mem[prehead].hh.rh := p;
mem[p].hh.lh := t;
macrocall(mem[q + 1].int, prehead, -30000);
getxnext;
goto 20
end {:853}
end {:845}
end;
getxnext;
tail := t;
if curcmd = 63 then begin {846:}
getxnext;
scanexpression;
if curcmd <> 64 then begin {847:}
backinput;
backexpr;
curcmd := 63;
curmod := 0;
cursym := 2232
end else begin {:847}
if curtype <> 16 then
badsubscript;
curcmd := 42;
curmod := curexp;
cursym := 0
end
end {:846};
if curcmd > 42 then
goto 31;
if curcmd < 40 then
goto 31
end;
31: {852:}
if posthead <> (-30000) then begin {854:}
backinput;
p := getavail;
q := mem[posthead].hh.rh;
mem[prehead].hh.lh := mem[prehead].hh.rh;
mem[prehead].hh.rh := posthead;
mem[posthead].hh.lh := q;
mem[posthead].hh.rh := p;
mem[p].hh.lh := mem[q].hh.rh;
mem[q].hh.rh := -30000;
macrocall(macroref, prehead, -30000);
mem[macroref].hh.lh := mem[macroref].hh.lh - 1;
getxnext;
goto 20
end {:854};
q := mem[prehead].hh.rh;
begin
mem[prehead].hh.rh := avail;
avail := prehead
end
{dynused:=dynused-1;};
if curcmd = myvarflag then begin
curtype := 20;
curexp := q;
goto 30
end;
p := findvariable(q);
if p <> (-30000) then
makeexpcopy(p)
else begin
obliterated(q);
helpline[2] := 661;
helpline[1] := 662;
helpline[0] := 663;
putgetflusherror(0)
end;
flushnodelist(q);
goto 30 {:852}
end
end
else
begin {:844}
badexp(633);
goto 20
end;
getxnext;
30:
if curcmd = 63 then
if curtype >= 16 then begin {859:}
p := stashcurexp;
getxnext;
scanexpression;
if curcmd <> 79 then begin {847:}
begin
backinput;
backexpr;
curcmd := 63;
curmod := 0;
cursym := 2232
end {:847};
unstashcurexp(p)
end else begin
q := stashcurexp;
getxnext;
scanexpression;
if curcmd <> 64 then begin
missingerr(93);
begin
helpptr := 3;
helpline[2] := 665;
helpline[1] := 666;
helpline[0] := 563
end;
backerror
end;
r := stashcurexp;
makeexpcopy(q);
dobinary(r, 70);
dobinary(p, 71);
dobinary(q, 69);
getxnext
end
end {:859}
end; {:823} {860:}
procedure scansuffix;
label
30;
var
h, t: halfword;
p: halfword;
begin
h := getavail;
t := h;
while true do begin
if curcmd = 63 then begin {861:}
getxnext;
scanexpression;
if curtype <> 16 then
badsubscript;
if curcmd <> 64 then begin
missingerr(93);
begin
helpptr := 3;
helpline[2] := 667;
helpline[1] := 666;
helpline[0] := 563
end;
backerror
end;
curcmd := 42;
curmod := curexp
end {:861};
if curcmd = 42 then
p := newnumtok(curmod)
else if (curcmd = 41) or (curcmd = 40) then begin
p := getavail;
mem[p].hh.lh := cursym
end else
goto 30;
mem[t].hh.rh := p;
t := p;
getxnext
end;
30:
curexp := mem[h].hh.rh;
begin
mem[h].hh.rh := avail;
avail := h
end {dynused:=dynused-1;};
curtype := 20
end; {:860} {862:}
procedure scansecondary;
label
20, 22;
var
p, q, r: halfword;
c, d: halfword;
macname: halfword;
begin
20:
if (curcmd < 30) or (curcmd > 43) then
badexp(668);
scanprimary;
22:
if curcmd <= 55 then
if curcmd >= 52 then begin
p := stashcurexp;
c := curmod;
d := curcmd;
if d = 53 then begin
macname := cursym;
mem[c].hh.lh := mem[c].hh.lh + 1
end;
getxnext;
scanprimary;
if d <> 53 then
dobinary(p, c)
else begin
backinput;
binarymac(p, c, macname);
mem[c].hh.lh := mem[c].hh.lh - 1;
getxnext;
goto 20
end;
goto 22
end
end; {:862}
{864:}
procedure scantertiary;
label
20, 22;
var
p: halfword;
c, d: halfword;
macname: halfword;
begin
20:
if (curcmd < 30) or (curcmd > 43) then
badexp(669);
scansecondary;
if curtype = 8 then
materializepen;
22:
if curcmd <= 45 then
if curcmd >= 43 then begin
p := stashcurexp;
c := curmod;
d := curcmd;
if d = 44 then begin
macname := cursym;
mem[c].hh.lh := mem[c].hh.lh + 1
end;
getxnext;
scansecondary;
if d <> 44 then
dobinary(p, c)
else begin
backinput;
binarymac(p, c, macname);
mem[c].hh.lh := mem[c].hh.lh - 1;
getxnext;
goto 20
end;
goto 22
end
end; {:864}
{868:}
procedure scanexpression;
label
20, 30, 22, 25, 26, 10;
var
p, q, r, pp, qq: halfword;
c, d: halfword;
myvarflag: 0..82;
macname: halfword;
cyclehit: boolean;
x, y: scaled;
t: 0..4;
begin
myvarflag := varflag;
20:
if (curcmd < 30) or (curcmd > 43) then
badexp(672);
scantertiary;
22:
if curcmd <= 51 then
if curcmd >= 46 then
if (curcmd <> 51) or (myvarflag <> 77) then begin
p := stashcurexp;
c := curmod;
d := curcmd;
if d = 49 then begin
macname := cursym;
mem[c].hh.lh := mem[c].hh.lh + 1
end;
if (d < 48) or ((d = 48) and ((mem[p].hh.b0 = 14) or (mem[p].hh.b0 = 9))) then begin {869:}
cyclehit := false; {870:}
begin
unstashcurexp(p);
if curtype = 14 then
p := newknot
else if curtype = 9 then
p := curexp
else
goto 10;
q := p;
while mem[q].hh.rh <> p do
q := mem[q].hh.rh;
if mem[p].hh.b0 <> 0 then begin
r := copyknot(p);
mem[q].hh.rh := r;
q := r
end;
mem[p].hh.b0 := 4;
mem[q].hh.b1 := 4
end {:870};
25: {874:}
if curcmd = 46 then begin {879:}
t := scandirection;
if t <> 4 then begin
mem[q].hh.b1 := t;
mem[q + 5].int := curexp;
if mem[q].hh.b0 = 4 then begin
mem[q].hh.b0 := t;
mem[q + 3].int := curexp
end
end
end {:879};
d := curcmd;
if d = 47 then begin {881:}
getxnext;
if curcmd = 58 then begin {882:}
getxnext;
y := curcmd;
if curcmd = 59 then
getxnext;
scanprimary; {883:}
if (curtype <> 16) or (curexp < 49152) then begin
disperr(-30000, 690);
begin
helpptr := 1;
helpline[0] := 691
end;
putgetflusherror(65536)
end {:883};
if y = 59 then
curexp := -curexp;
mem[q + 6].int := curexp;
if curcmd = 52 then begin
getxnext;
y := curcmd;
if curcmd = 59 then
getxnext;
scanprimary; {883:}
if (curtype <> 16) or (curexp < 49152) then begin
disperr(-30000, 690);
begin
helpptr := 1;
helpline[0] := 691
end;
putgetflusherror(65536)
end {:883};
if y = 59 then
curexp := -curexp
end;
y := curexp
end else if curcmd = 57 then begin {:882} {884:}
mem[q].hh.b1 := 1;
t := 1;
getxnext;
scanprimary;
knownpair;
mem[q + 5].int := curx;
mem[q + 6].int := cury;
if curcmd <> 52 then begin
x := mem[q + 5].int;
y := mem[q + 6].int
end else begin
getxnext;
scanprimary;
knownpair;
x := curx;
y := cury
end
end else begin {:884}
mem[q + 6].int := 65536;
y := 65536;
backinput;
goto 30
end;
if curcmd <> 47 then begin
missingerr(279);
begin
helpptr := 1;
helpline[0] := 689
end;
backerror
end;
30: {:881}
end else if d <> 48 then
goto 26;
getxnext;
if curcmd = 46 then begin {880:}
t := scandirection;
if mem[q].hh.b1 <> 1 then
x := curexp
else
t := 1
end else if mem[q].hh.b1 <> 1 then begin {:880}
t := 4;
x := 0
end {:874};
if curcmd = 36 then begin {886:}
cyclehit := true;
getxnext;
pp := p;
qq := p;
if d = 48 then
if p = q then begin
d := 47;
mem[q + 6].int := 65536;
y := 65536
end
end else begin {:886}
scantertiary; {885:}
begin
if curtype <> 9 then
pp := newknot
else
pp := curexp;
qq := pp;
while mem[qq].hh.rh <> pp do
qq := mem[qq].hh.rh;
if mem[pp].hh.b0 <> 0 then begin
r := copyknot(pp);
mem[qq].hh.rh := r;
qq := r
end;
mem[pp].hh.b0 := 4;
mem[qq].hh.b1 := 4
end {:885}
end; {887:}
begin
if d = 48 then
if (mem[q + 1].int <> mem[pp + 1].int) or (mem[q + 2].int <> mem[pp + 2].int) then begin
begin
if interaction = 3 then
;
printnl(133);
print(692)
end;
begin
helpptr := 3;
helpline[2] := 693;
helpline[1] := 694;
helpline[0] := 695
end;
putgeterror;
d := 47;
mem[q + 6].int := 65536;
y := 65536
end;
{889:}
if mem[pp].hh.b1 = 4 then
if (t = 3) or (t = 2) then begin
mem[pp].hh.b1 := t;
mem[pp + 5].int := x
end {:889};
if d = 48 then begin {890:}
if mem[q].hh.b0 = 4 then
if mem[q].hh.b1 = 4 then begin
mem[q].hh.b0 := 3;
mem[q + 3].int := 65536
end;
if mem[pp].hh.b1 = 4 then
if t = 4 then begin
mem[pp].hh.b1 := 3;
mem[pp + 5].int := 65536
end;
mem[q].hh.b1 := mem[pp].hh.b1;
mem[q].hh.rh := mem[pp].hh.rh;
mem[q + 5].int := mem[pp + 5].int;
mem[q + 6].int := mem[pp + 6].int;
freenode(pp, 7);
if qq = pp then
qq := q
end else begin {:890} {888:}
if mem[q].hh.b1 = 4 then
if (mem[q].hh.b0 = 3) or (mem[q].hh.b0 = 2) then begin
mem[q].hh.b1 := mem[q].hh.b0;
mem[q + 5].int := mem[q + 3].int
end {:888};
mem[q].hh.rh := pp;
mem[pp + 4].int := y;
if t <> 4 then begin
mem[pp + 3].int := x;
mem[pp].hh.b0 := t
end
end;
q := qq
end {:887};
if curcmd >= 46 then
if curcmd <= 48 then
if not cyclehit then
goto 25;
26: {891:}
if cyclehit then begin
if d = 48 then
p := q
end else begin
mem[p].hh.b0 := 0;
if mem[p].hh.b1 = 4 then begin
mem[p].hh.b1 := 3;
mem[p + 5].int := 65536
end;
mem[q].hh.b1 := 0;
if mem[q].hh.b0 = 4 then begin
mem[q].hh.b0 := 3;
mem[q + 3].int := 65536
end;
mem[q].hh.rh := p
end;
makechoices(p);
curtype := 9;
curexp := p {:891}
end else begin {:869}
getxnext;
scantertiary;
if d <> 49 then
dobinary(p, c)
else begin
backinput;
binarymac(p, c, macname);
mem[c].hh.lh := mem[c].hh.lh - 1;
getxnext;
goto 20
end
end;
goto 22
end;
10:
end; {:868} {892:}
procedure getboolean;
begin
getxnext;
scanexpression;
if curtype <> 2 then begin
disperr(-30000, 696);
begin
helpptr := 2;
helpline[1] := 697;
helpline[0] := 698
end;
putgetflusherror(31);
curtype := 2
end
end; {:892} {224:}
procedure printcapsule;
begin
printchar(40);
printexp(gpointer, 0);
printchar(41)
end;
procedure tokenrecycle;
begin
recyclevalue(gpointer)
end; {:224} {1205:}
procedure closefilesandtermina;
var
k: integer;
lh: integer;
p: halfword;
x: scaled;
{if internal[12]>0 then[1208:]if jobname>0 then begin writeln(
logfile,' ');
writeln(logfile,'Here is how much of METAFONT''s memory',' you used:');
write(logfile,' ',maxstrptr-initstrptr:1,' string');
if maxstrptr<>initstrptr+1 then write(logfile,'s');
writeln(logfile,' out of ',maxstrings-initstrptr:1);
writeln(logfile,' ',maxpoolptr-initpoolptr:1,
' string characters out of ',poolsize-initpoolptr:1);
writeln(logfile,' ',lomemmax+30000+memend-himemmin+2:1,
' words of memory out of ',memend+30001:1);
writeln(logfile,' ',stcount:1,' symbolic tokens out of ',2100:1);
writeln(logfile,' ',maxinstack:1,'i,',intptr:1,'n,',maxroundingptr:1,
'r,',maxparamstack:1,'p,',maxbufstack+1:1,'b stack positions out of ',
stacksize:1,'i,',maxinternal:1,'n,',maxwiggle:1,'r,',150:1,'p,',bufsize:
1,'b');end[:1208];}
begin
{1206:}
if (gfprevptr > 0) or (internal[33] > 0) then begin {1207:}
rover := -29977;
mem[rover].hh.rh := 32767;
lomemmax := himemmin - 1;
if (lomemmax - rover) > 32767 then
lomemmax := 32767 + rover;
mem[rover].hh.lh := lomemmax - rover;
mem[rover + 1].hh.lh := rover;
mem[rover + 1].hh.rh := rover;
mem[lomemmax].hh.rh := -30000;
mem[lomemmax].hh.lh := -30000 {:1207}; {1124:}
mem[29999].hh.rh := -29981;
for k := bc to ec do
if charexists[k] then
tfmwidth[k] := sortin(tfmwidth[k]);
nw := skimp(255) + 1;
dimenhead[1] := mem[29999].hh.rh;
if perturbation >= 4096 then
tfmwarning(20) {:1124};
fixdesignsize;
fixchecksum;
if internal[33] > 0 then begin {1126:}
mem[29999].hh.rh := -29981;
for k := bc to ec do
if charexists[k] then
if tfmheight[k] = 0 then
tfmheight[k] := -29985
else
tfmheight[k] := sortin(tfmheight[k]);
nh := skimp(15) + 1;
dimenhead[2] := mem[29999].hh.rh;
if perturbation >= 4096 then
tfmwarning(21);
mem[29999].hh.rh := -29981;
for k := bc to ec do
if charexists[k] then
if tfmdepth[k] = 0 then
tfmdepth[k] := -29985
else
tfmdepth[k] := sortin(tfmdepth[k]);
nd := skimp(15) + 1;
dimenhead[3] := mem[29999].hh.rh;
if perturbation >= 4096 then
tfmwarning(22);
mem[29999].hh.rh := -29981;
for k := bc to ec do
if charexists[k] then
if tfmitalcorr[k] = 0 then
tfmitalcorr[k] := -29985
else
tfmitalcorr[k] := sortin(tfmitalcorr[k]);
ni := skimp(63) + 1;
dimenhead[4] := mem[29999].hh.rh;
if perturbation >= 4096 then
tfmwarning(23) {:1126}; {1134:}
if jobname = 0 then
openlogfile;
packjobname(901);
while not bopenout(tfmfile, nameoffile) do
promptfilename(902, 901);
metricfilename := bmakenamestring(tfmfile); {1135:}
k := headersize;
while headerbyte[k] < 0 do
k := k - 1;
lh := (k + 3) div 4;
if bc > ec then
bc := 1;
bwrite2bytes(tfmfile, (((((((((6 + lh) + ((ec - bc) + 1)) + nw) + nh) + nd) + ni) + nl) + nk) + ne) + np);
bwrite2bytes(tfmfile, lh);
bwrite2bytes(tfmfile, bc);
bwrite2bytes(tfmfile, ec);
bwrite2bytes(tfmfile, nw);
bwrite2bytes(tfmfile, nh);
bwrite2bytes(tfmfile, nd);
bwrite2bytes(tfmfile, ni);
bwrite2bytes(tfmfile, nl);
bwrite2bytes(tfmfile, nk);
bwrite2bytes(tfmfile, ne);
bwrite2bytes(tfmfile, np);
for k := 1 to 4 * lh do begin
if headerbyte[k] < 0 then
headerbyte[k] := 0;
bwritebyte(tfmfile, headerbyte[k])
end {:1135}; {1137:}
for k := bc to ec do
if not charexists[k] then
bwrite4bytes(tfmfile, 0)
else begin
bwritebyte(tfmfile, mem[tfmwidth[k]].hh.lh);
bwritebyte(tfmfile, (mem[tfmheight[k]].hh.lh * 16) + mem[tfmdepth[k]].hh.lh);
bwritebyte(tfmfile, (mem[tfmitalcorr[k]].hh.lh * 4) + chartag[k]);
bwritebyte(tfmfile, charremainder[k])
end {:1137}; {1138:}
tfmchanged := 0;
for k := 1 to 4 do begin
bwrite4bytes(tfmfile, 0);
p := dimenhead[k];
while p <> (-29981) do begin
bwrite4bytes(tfmfile, dimenout(mem[p + 1].int));
p := mem[p].hh.rh
end
end {:1138}; {1139:}
for k := 0 to nl - 1 do
tfmqqqq(ligkern[k]);
for k := 0 to nk - 1 do
bwrite4bytes(tfmfile, dimenout(kern[k])) {:1139};
{1140:}
for k := 0 to ne - 1 do
tfmqqqq(exten[k]) {:1140}; {1141:}
for k := 1 to np do
if k = 1 then
if abs(param[1]) < 134217728 then
bwrite4bytes(tfmfile, param[1] * 16)
else begin
tfmchanged := tfmchanged + 1;
if param[1] > 0 then
bwrite4bytes(tfmfile, 2147483647)
else
bwrite4bytes(tfmfile, -2147483647)
end
else
bwrite4bytes(tfmfile, dimenout(param[k]));
if tfmchanged > 0 then begin
if tfmchanged = 1 then
printnl(904)
else begin
printnl(40);
printint(tfmchanged);
print(905)
end;
print(906)
end {:1141};
{if internal[12]>0 then[1136:]begin writeln(logfile,' ');
writeln(logfile,'(You used ',nw:1,'w,',nh:1,'h,',nd:1,'d,',ni:1,'i,',nl:
1,'l,',nk:1,'k,',ne:1,'e,',np:1,'p metric file positions');
writeln(logfile,' out of ','256w,16h,16d,64i,',ligtablesize:1,
'l,256k,256e,',maxfontdimen:1,'p)');end[:1136];}
printnl(903);
print(metricfilename);
bclose(tfmfile) {:1134}
end;
if gfprevptr > 0 then begin {1182:}
begin
gfbuf[gfptr] := 248;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(gfprevptr);
gfprevptr := (gfoffset + gfptr) - 5;
gffour(internal[26] * 16);
for k := 1 to 4 do begin
gfbuf[gfptr] := headerbyte[k];
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(internal[27]);
gffour(internal[28]);
gffour(gfminm);
gffour(gfmaxm);
gffour(gfminn);
gffour(gfmaxn);
for k := 0 to 255 do
if charexists[k] then begin
x := gfdx[k] div 65536;
if (((gfdy[k] = 0) and (x >= 0)) and (x < 256)) and (gfdx[k] = (x * 65536)) then begin
begin
gfbuf[gfptr] := 246;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := k;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := x;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end
end else begin
begin
gfbuf[gfptr] := 245;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
begin
gfbuf[gfptr] := k;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(gfdx[k]);
gffour(gfdy[k])
end;
x := mem[tfmwidth[k] + 1].int;
if abs(x) > maxtfmdimen then
if x > 0 then
x := 16777215
else
x := -16777215
else
x := makescaled(x * 16, internal[26]);
gffour(x);
gffour(charptr[k])
end;
begin
gfbuf[gfptr] := 249;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
gffour(gfprevptr);
begin
gfbuf[gfptr] := 131;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
k := 4 + ((gfbufsize - gfptr) mod 4);
while k > 0 do begin
begin
gfbuf[gfptr] := 223;
gfptr := gfptr + 1;
if gfptr = gflimit then
gfswap
end;
k := k - 1
end; {1156:}
if gflimit = halfbuf then
bwritebuf(gffile, gfbuf, halfbuf, gfbufsize - 1);
if gfptr > 0 then
bwritebuf(gffile, gfbuf, 0, gfptr - 1) {:1156};
printnl(917);
print(outputfilename);
print(425);
printint(totalchars);
print(918);
if totalchars <> 1 then
printchar(115);
print(919);
printint(gfoffset + gfptr);
print(920);
bclose(gffile)
end {:1182}
end {:1206};
if jobname > 0 then begin
writeln(logfile);
aclose(logfile);
selector := selector - 2;
if selector = 1 then begin
printnl(929);
print(logname);
printchar(46)
end
end;
println;
if (editnamestart <> 0) and (interaction > 0) then
calledit(strpool[editnamestart], editnamelength, editline)
end; {:1205} {1209:}
procedure finalcleanup;
label
10;
var
c: smallnumber;
begin
c := curmod;
if jobname = 0 then
openlogfile;
while condptr <> (-30000) do begin
printnl(930);
printcmdmod(2, curif);
if ifline <> 0 then begin
print(931);
printint(ifline)
end;
print(932);
ifline := mem[condptr + 1].int;
curif := mem[condptr].hh.b1;
condptr := mem[condptr].hh.rh
end;
if history <> 0 then
if (history = 1) or (interaction < 3) then
if selector = 3 then begin
selector := 1;
printnl(933);
selector := 3
end;
if c = 1 then begin {storebasefile;goto 10;}
printnl(934);
goto 10
end;
10:
end; {:1209} {1210:}
{procedure initprim;begin[192:]primitive(280,40,1);
primitive(281,40,2);primitive(282,40,3);primitive(283,40,4);
primitive(284,40,5);primitive(285,40,6);primitive(286,40,7);
primitive(287,40,8);primitive(288,40,9);primitive(289,40,10);
primitive(290,40,11);primitive(291,40,12);primitive(292,40,13);
primitive(293,40,14);primitive(294,40,15);primitive(295,40,16);
primitive(296,40,17);primitive(297,40,18);primitive(298,40,19);
primitive(299,40,20);primitive(300,40,21);primitive(301,40,22);
primitive(302,40,23);primitive(303,40,24);primitive(304,40,25);
primitive(305,40,26);primitive(306,40,27);primitive(307,40,28);
primitive(308,40,29);primitive(309,40,30);primitive(310,40,31);
primitive(311,40,32);primitive(312,40,33);primitive(313,40,34);
primitive(314,40,35);primitive(315,40,36);primitive(316,40,37);
primitive(317,40,38);primitive(318,40,39);primitive(319,40,40);
[:192][211:]primitive(279,47,0);primitive(91,63,0);
eqtb[2232]:=eqtb[cursym];primitive(93,64,0);primitive(125,65,0);
primitive(123,46,0);primitive(58,78,0);eqtb[2234]:=eqtb[cursym];
primitive(329,77,0);primitive(44,79,0);primitive(59,80,0);
eqtb[2235]:=eqtb[cursym];primitive(92,7,0);primitive(330,18,0);
primitive(331,72,0);primitive(332,59,0);primitive(333,32,0);
bgloc:=cursym;primitive(334,57,0);primitive(335,19,0);
primitive(336,60,0);primitive(337,27,0);primitive(338,11,0);
primitive(323,81,0);eqtb[2239]:=eqtb[cursym];egloc:=cursym;
primitive(339,26,0);primitive(340,6,0);primitive(341,9,0);
primitive(342,70,0);primitive(343,73,0);primitive(344,13,0);
primitive(345,14,0);primitive(346,15,0);primitive(347,69,0);
primitive(348,28,0);primitive(349,24,0);primitive(350,12,0);
primitive(351,8,0);primitive(352,17,0);primitive(353,74,0);
primitive(354,35,0);primitive(355,58,0);primitive(356,71,0);
primitive(357,75,0);[:211][683:]primitive(520,16,1);primitive(521,16,2);
primitive(522,16,53);primitive(523,16,44);primitive(524,16,49);
primitive(324,16,0);eqtb[2237]:=eqtb[cursym];primitive(525,4,2242);
primitive(526,4,2392);primitive(527,4,1);primitive(325,4,0);
eqtb[2236]:=eqtb[cursym];[:683][688:]primitive(528,61,0);
primitive(529,61,1);primitive(64,61,2);primitive(530,61,3);
[:688][695:]primitive(541,56,2242);primitive(542,56,2392);
primitive(543,56,2542);primitive(544,56,1);primitive(545,56,2);
primitive(546,56,3);[:695][709:]primitive(556,3,0);primitive(482,3,1);
[:709][740:]primitive(583,1,1);primitive(322,2,2);
eqtb[2238]:=eqtb[cursym];primitive(584,2,3);primitive(585,2,4);
[:740][893:]primitive(218,33,30);primitive(219,33,31);
primitive(220,33,32);primitive(221,33,33);primitive(222,33,34);
primitive(223,33,35);primitive(224,33,36);primitive(225,33,37);
primitive(226,34,38);primitive(227,34,39);primitive(228,34,40);
primitive(229,34,41);primitive(230,34,42);primitive(231,34,43);
primitive(232,34,44);primitive(233,34,45);primitive(234,34,46);
primitive(235,34,47);primitive(236,34,48);primitive(237,34,49);
primitive(238,34,50);primitive(239,34,51);primitive(240,34,52);
primitive(241,34,53);primitive(242,34,54);primitive(243,34,55);
primitive(244,34,56);primitive(245,34,57);primitive(246,34,58);
primitive(247,34,59);primitive(248,34,60);primitive(249,34,61);
primitive(250,34,62);primitive(251,34,63);primitive(252,34,64);
primitive(253,34,65);primitive(254,34,66);primitive(255,34,67);
primitive(256,36,68);primitive(43,43,69);primitive(45,43,70);
primitive(42,55,71);primitive(47,54,72);eqtb[2233]:=eqtb[cursym];
primitive(257,45,73);primitive(181,45,74);primitive(259,52,76);
primitive(258,45,75);primitive(60,50,77);primitive(260,50,78);
primitive(62,50,79);primitive(261,50,80);primitive(61,51,81);
primitive(262,50,82);primitive(272,37,94);primitive(273,37,95);
primitive(274,37,96);primitive(275,37,97);primitive(276,37,98);
primitive(277,37,99);primitive(278,37,100);primitive(38,48,83);
primitive(263,55,84);primitive(264,55,85);primitive(265,55,86);
primitive(266,55,87);primitive(267,55,88);primitive(268,55,89);
primitive(269,55,90);primitive(270,55,91);primitive(271,45,92);
[:893][1013:]primitive(211,30,15);primitive(197,30,4);
primitive(195,30,2);primitive(202,30,9);primitive(199,30,6);
primitive(204,30,11);primitive(206,30,13);primitive(207,30,14);
[:1013][1018:]primitive(776,82,0);primitive(777,82,1);
[:1018][1024:]primitive(143,23,0);primitive(144,23,1);
primitive(145,23,2);primitive(783,23,3);
[:1024][1027:]primitive(784,21,0);primitive(785,21,1);
[:1027][1037:]primitive(799,22,0);primitive(800,22,1);
primitive(801,22,2);primitive(802,22,3);primitive(803,22,4);
[:1037][1052:]primitive(820,68,1);primitive(821,68,0);
primitive(822,68,2);primitive(823,66,6);primitive(824,66,16);
primitive(825,67,0);primitive(826,67,1);
[:1052][1079:]primitive(856,25,0);primitive(857,25,1);
primitive(858,25,2);[:1079][1101:]primitive(868,20,0);
primitive(869,20,1);primitive(870,20,2);primitive(871,20,3);
primitive(872,20,4);[:1101][1109:]primitive(889,76,0);
primitive(890,76,128);[:1109][1176:]primitive(912,29,4);
primitive(913,29,16);[:1176];end;procedure inittab;var k:integer;
begin[176:]rover:=-29977;mem[rover].hh.rh:=32767;mem[rover].hh.lh:=1000;
mem[rover+1].hh.lh:=rover;mem[rover+1].hh.rh:=rover;
lomemmax:=rover+1000;mem[lomemmax].hh.rh:=-30000;
mem[lomemmax].hh.lh:=-30000;
for k:=29998 to 30000 do mem[k]:=mem[lomemmax];avail:=-30000;
memend:=30000;himemmin:=29998;varused:=23;dynused:=-1;
[:176][193:]intname[1]:=280;intname[2]:=281;intname[3]:=282;
intname[4]:=283;intname[5]:=284;intname[6]:=285;intname[7]:=286;
intname[8]:=287;intname[9]:=288;intname[10]:=289;intname[11]:=290;
intname[12]:=291;intname[13]:=292;intname[14]:=293;intname[15]:=294;
intname[16]:=295;intname[17]:=296;intname[18]:=297;intname[19]:=298;
intname[20]:=299;intname[21]:=300;intname[22]:=301;intname[23]:=302;
intname[24]:=303;intname[25]:=304;intname[26]:=305;intname[27]:=306;
intname[28]:=307;intname[29]:=308;intname[30]:=309;intname[31]:=310;
intname[32]:=311;intname[33]:=312;intname[34]:=313;intname[35]:=314;
intname[36]:=315;intname[37]:=316;intname[38]:=317;intname[39]:=318;
intname[40]:=319;[:193][203:]hashused:=2229;stcount:=0;
hash[2240].rh:=321;hash[2238].rh:=322;hash[2239].rh:=323;
hash[2237].rh:=324;hash[2236].rh:=325;hash[2235].rh:=59;
hash[2234].rh:=58;hash[2233].rh:=47;hash[2232].rh:=91;hash[2231].rh:=41;
hash[2229].rh:=326;eqtb[2231].lh:=62;
[:203][229:]mem[-29981].hh.lh:=2242;mem[-29981].hh.rh:=-30000;
[:229][324:]mem[30000].hh.lh:=32767;
[:324][475:]mem[-29997].hh.lh:=-30000;mem[-29997].hh.rh:=-30000;
mem[-29996].hh.lh:=1;mem[-29996].hh.rh:=-30000;
for k:=-29995 to-29989 do mem[k]:=mem[-29996];mem[-29988].int:=0;
mem[-30000].hh.rh:=-30000;mem[-30000].hh.lh:=-30000;mem[-29999].int:=0;
mem[-29998].int:=0;[:475][587:]serialno:=0;mem[-29987].hh.rh:=-29987;
mem[-29986].hh.lh:=-29987;mem[-29987].hh.lh:=-30000;
mem[-29986].hh.rh:=-30000;[:587][702:]mem[-29979].hh.b1:=0;
mem[-29979].hh.rh:=2240;eqtb[2240].rh:=-29979;eqtb[2240].lh:=41;
[:702][759:]eqtb[2230].lh:=88;hash[2230].rh:=600;
[:759][911:]mem[-29983].hh.b1:=11;
[:911][1116:]mem[-29980].int:=1073741824;
[:1116][1127:]mem[-29984].int:=0;mem[-29985].hh.lh:=0;
[:1127][1185:]baseident:=921;[:1185]end;}
{:1210}
{1212:}
{procedure debughelp;label 888,10;var k,l,m,n:integer;
begin while true do begin;printnl(935);flush(output);read(input,m);
if m<0 then goto 10 else if m=0 then begin goto 888;
888:m:=0;
['BREAKPOINT']
end else begin read(input,n);case m of[1213:]1:printword(mem[n]);
2:printint(mem[n].hh.lh);3:printint(mem[n].hh.rh);
4:begin printint(eqtb[n].lh);printchar(58);printint(eqtb[n].rh);end;
5:printvariablename(n);6:printint(internal[n]);7:doshowdependencies;
9:showtokenlist(n,-30000,100000,0);10:print(n);11:checkmem(n>0);
12:searchmem(n);13:begin read(input,l);printcmdmod(n,l);end;
14:for k:=0 to n do print(buffer[k]);15:panicking:=not panicking;
[:1213]others:print(63)end;end;end;10:end;}
{:1212}
{:1202}
{1204:}
begin
{-----------------------------------}
init_ps(psfile);
{-----------------------------------}
history := 3;
setpaths;
if readyalready = 314159 then
goto 1; {14:}
bad := 0;
if (halferrorline < 30) or (halferrorline > (errorline - 15)) then
bad := 1;
if maxprintline < 60 then
bad := 2;
if (gfbufsize mod 8) <> 0 then
bad := 3;
if (-28900) > 30000 then
bad := 4;
if 1777 > 2100 then
bad := 5;
if (headersize mod 4) <> 0 then
bad := 6; {:14} {154:}
{if memmax<>30000 then bad:=10;}
if memmax < 30000 then
bad := 10;
if ((-128) > 0) or (127 < 127) then
bad := 11;
if ((-32768) > 0) or (32767 < 32767) then
bad := 12;
if ((-128) < (-32768)) or (127 > 32767) then
bad := 13;
if ((-30000) < (-32768)) or (memmax >= 32767) then
bad := 14;
if maxstrings > 32767 then
bad := 15;
if bufsize > 32767 then
bad := 16;
if (255 < 255) or (65535 < 65535) then
bad := 17; {:154} {204:}
if (2241 + maxinternal) > 32767 then
bad := 21; {:204} {214:}
if 2692 > 32767 then
bad := 22; {:214} {310:}
if (15 * 11) > bistacksize then
bad := 31; {:310} {553:}
if (20 + (17 * 45)) > bistacksize then
bad := 32; {:553} {777:}
if 10 > filenamesize then
bad := 41; {:777}
if bad > 0 then begin
writeln(output, 'Ouch---my internal constants have been clobbered!', '---case ', bad: 1);
{if not getstringsstarted then goto 9999;
inittab;initprim;}
goto 9999
end;
initialize;
readyalready := 314159;
1: {55:}
selector := 1;
tally := 0;
termoffset := 0;
fileoffset := 0; {:55} {61:}
write(output, 'This is METAFONT, Version 1.0 for Berkeley UNIX');
{-----------------------------------------------------------------}
writeln(output);
writeln(output,'*** embedded METAFONT to PostScript Compiler ***');
{-----------------------------------------------------------------}
if baseident = 0 then
writeln(output, ' (no base preloaded)')
else begin
print(baseident);
println
end;
flush(output); {:61} {783:}
jobname := 0; {:783}
{792:}
outputfilename := 0; {:792} {1211:} {657:}
begin
begin
inputptr := 0;
maxinstack := 0;
inopen := 0;
maxbufstack := 0;
paramptr := 0;
maxparamstack := 0;
first := 1;
curinput.startfield := 1;
curinput.indexfield := 0;
line := 0;
curinput.namefield := 0;
forceeof := false;
if not initterminal then
goto 9999;
curinput.limitfield := last;
first := last + 1
end; {:657} {660:}
scannerstatus := 0; {:660}
if (baseident = 0) or (buffer[curinput.locfield] = 38) then begin
if baseident <> 0 then
initialize;
if not openbasefile then
goto 9999;
if not loadbasefile then begin
wclose(basefile);
goto 9999
end;
wclose(basefile);
while (curinput.locfield < curinput.limitfield) and (buffer[curinput.locfield] = 32) do
curinput.locfield := curinput.locfield + 1
end;
buffer[curinput.limitfield] := 37;
fixdateandtime;
initrandoms((internal[17] div 65536) + internal[16]); {70:}
if interaction = 0 then
selector := 0
else
selector := 1 {:70};
if curinput.locfield < curinput.limitfield then
if buffer[curinput.locfield] <> 92 then
startinput
end {:1211};
initstrptr := strptr;
initpoolptr := poolptr;
maxstrptr := strptr;
maxpoolptr := poolptr;
history := 0;
if startsym > 0 then begin
cursym := startsym;
backinput
end;
maincontrol;
finalcleanup;
9998:
closefilesandtermina;
9999:
readyalready := 0;
{---------------------------------}
tini_ps(g);
{---------------------------------}
if (history <> 0) and (history <> 1) then
exit(1)
else
exit(0);
end. {:1204}