-- file: MFSymbolsImpl1.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:01 pm PST
DIRECTORY
PascalBasic,
PascalWizardFiles,
MFTypes,
MFProcArray,
MFExternals,
MFInteraction,
MFMemory,
MFSymbols,
MFInput,
MFParsing;
MFSymbolsImpl1: PROGRAM IMPORTS PascalBasic, MFProcArray, MFExternals, MFInteraction, MFMemory, MFInput, MFParsing EXPORTS MFSymbols = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFExternals, MFInteraction, MFMemory, MFSymbols, MFInput, MFParsing;
--:178
--190:--Internal: LONG POINTER TO ARRAY PascalInteger[1..100] OF Scaled ← PascalStaticZone.NEW[ARRAY PascalInteger[1..100] OF Scaled];
IntName: LONG POINTER TO ARRAY PascalInteger[1..100] OF StrNumber ← PascalStaticZone.NEW[ARRAY PascalInteger[1..100] OF StrNumber];
IntPtr: PascalInteger[40..MaxInternal];
--:190----196:--
OldSetting: PascalInteger[0..5];
--:196----198:
CharClass: LONG POINTER TO ARRAY AsciiCode OF PascalInteger[0..20] ← PascalStaticZone.NEW[ARRAY AsciiCode OF PascalInteger[0..20]];
--:198----200:--
HashUsed: Halfword;
StCount: PascalInteger;
--:200----201:--Hash: LONG POINTER TO ARRAY PascalInteger[1..2241] OF TwoHalves ← PascalStaticZone.NEW[ARRAY PascalInteger[1..2241] OF TwoHalves];
Eqtb: LONG POINTER TO ARRAY PascalInteger[1..2241] OF TwoHalves ← PascalStaticZone.NEW[ARRAY PascalInteger[1..2241] OF TwoHalves];
--:201----225:--
GPointer: Halfword;
--:225
--230:--BigNodeSize: LONG POINTER TO ARRAY PascalInteger[13..14] OF SmallNumber ← PascalStaticZone.NEW[ARRAY PascalInteger[13..14] OF SmallNumber];
--:230----250:
SavePtr: Halfword;
ShowTokenList: PROCEDURE[P,Q: PascalInteger,L,NullTally: PascalInteger]
=
BEGIN Class, C:SmallNumber;R, V:PascalInteger; Class←3;
Tally←NullTally;{WHILE(P#0)AND (Tally<L)DO BEGIN IF P=Q THEN--645:
BEGIN FirstCount←Tally;
TrickCount←Tally+1+ErrorLine-HalfErrorLine;
IF TrickCount<ErrorLine THEN TrickCount←ErrorLine; END--:645--;--218:
C←9;IF(P<0)OR (P>MemEnd) THEN BEGIN Print[361]; GOTO Label10; END;
IF P<HiMemMin THEN--219:
IF Mem[P]↑.Hh.B1=12 THEN IF Mem[P]↑.Hh.B0=16 THEN--220:
BEGIN 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--:220
ELSE IF Mem[P]↑.Hh.B0#4 THEN Print[364] ELSE BEGIN PrintChar[34];
SlowPrint[Mem[P+1]↑.Int];PrintChar[34];C←4;
END ELSE IF(Mem[P]↑.Hh.B1#11)OR ( INT[Mem[P]↑.Hh.B0]<1)OR ( INT[Mem[P]↑.Hh.B0]>19) THEN
Print[364] ELSE BEGIN GPointer←P;PrintCapsule[];C←8; END--:219
ELSE BEGIN R←Mem[P]↑.Hh.Lh;IF R>=2242 THEN--222:
BEGIN IF R<2392 THEN BEGIN Print[366];R←R-(2242);
END ELSE IF R<2542 THEN BEGIN Print[367];R←R-(2392);
END ELSE BEGIN Print[368];R←R-(2542); END;PrintInt[R];PrintChar[41];
C←8; END--:222-- ELSE IF R<1 THEN IF R=0 THEN--221:
BEGIN IF Class=17 THEN PrintChar[32];Print[365];C←18; END--:221
ELSE Print[362] ELSE BEGIN R←Hash↑[R].Rh;
IF(R<0)OR (R>=StrPtr) THEN Print[363] ELSE--223:
BEGIN C←CharClass↑[StrPool↑[StrStart↑[R]]];
IF C=Class THEN SELECT C FROM 9 =>PrintChar[46];5,6,7,8 => NULL;
ENDCASE =>PrintChar[32];Print[R]; END--:223--; END; END--:218--;Class←C;
P←Mem[P]↑.Hh.Rh; END ENDLOOP ;IF P#0 THEN Print[360];EXITS Label10 => NULL}; END;--:217----664:
Runaway: PROCEDURE =
BEGIN IF INT[ScannerStatus]>2 THEN BEGIN PrintNl[504];
SELECT ScannerStatus FROM 3 =>Print[505];4,5 =>Print[506];6 =>Print[507]; ENDCASE;
PrintLn[];ShowTokenList[Mem[49999]↑.Hh.Rh,0,ErrorLine-10,0]; END; END;
PrintOp: PROCEDURE[C: Quarterword]
=
BEGIN IF INT[C]<=15 THEN PrintType[C] ELSE SELECT C FROM 30 =>Print[220];
31 =>Print[221];32 =>Print[222];33 =>Print[223];34 =>Print[224];35 =>Print[225];
36 =>Print[226];37 =>Print[227];38 =>Print[228];39 =>Print[229];40 =>Print[230];
41 =>Print[231];42 =>Print[232];43 =>Print[233];44 =>Print[234];45 =>Print[235];
46 =>Print[236];47 =>Print[237];48 =>Print[238];49 =>Print[239];50 =>Print[240];
51 =>Print[241];52 =>Print[242];53 =>Print[243];54 =>Print[244];55 =>Print[245];
56 =>Print[246];57 =>Print[247];58 =>Print[248];59 =>Print[249];60 =>Print[250];
61 =>Print[251];62 =>Print[252];63 =>Print[253];64 =>Print[254];65 =>Print[255];
66 =>Print[256];67 =>Print[257];68 =>Print[258];69 =>PrintChar[43];
70 =>PrintChar[45];71 =>PrintChar[42];72 =>PrintChar[47];73 =>Print[259];
74 =>Print[183];75 =>Print[260];76 =>Print[261];77 =>PrintChar[60];
78 =>Print[262];79 =>PrintChar[62];80 =>Print[263];81 =>PrintChar[61];
82 =>Print[264];94 =>Print[265];95 =>Print[266];96 =>Print[267];97 =>Print[268];
98 =>Print[269];99 =>Print[270];100 =>Print[271];83 =>Print[38];84 =>Print[272];
85 =>Print[273];86 =>Print[274];87 =>Print[275];88 =>Print[276];89 =>Print[277];
90 =>Print[278];91 =>Print[279];92 =>Print[280]; ENDCASE =>Print[281]; END;
--:189----194:-- FixDateAndTime: PROCEDURE
=
BEGIN TheTime, TheDay, TheMonth, TheYear:PascalInteger;
ReadTheClock[@TheTime,@TheDay,@TheMonth,@TheYear];
Internal↑[17]←TheTime*65536;Internal↑[16]←TheDay*65536;
Internal↑[15]←TheMonth*65536;Internal↑[14]←TheYear*65536; END;--:194
--205:-- IdLookup: PROCEDURE[J,L: PascalInteger] RETURNS[IdLookupResult: Halfword] =
BEGIN H:PascalInteger;
P:Halfword;K:Halfword; {IF L=1 THEN--206:--BEGIN P←Buffer↑[J]+1;
Hash↑[P].Rh← INT[P]-1; GOTO Label40; END--:206--;--208:--H←Buffer↑[J];
FOR i:INT IN [ INT[J+1 ].. INT[J+L-1 ]] DO K ← i; H←H+H+Buffer↑[K];
WHILE H>=1777 DO H←H-1777 ENDLOOP ;--:208-- ENDLOOP;P←H+129;
WHILE TRUE DO BEGIN IF INT[Hash↑[P].Rh]>0 THEN IF(
StrStart↑[ INT[Hash↑[P].Rh]+1]-StrStart↑[Hash↑[P].Rh])=L THEN IF StrEqBuf[Hash↑[P].Rh,J] THEN GOTO Label40;
IF Hash↑[P].Lh=0 THEN--207:
BEGIN IF INT[Hash↑[P].Rh]>0 THEN BEGIN DO IF(HashUsed=1) THEN Overflow[328
,2100];HashUsed← INT[HashUsed]-1; IF Hash↑[HashUsed].Rh=0 THEN EXIT; ENDLOOP;
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 i:INT IN [ INT[J ].. INT[J+L-1 ]] DO K ← i; StrPool↑[PoolPtr]←Buffer↑[K];
PoolPtr←PoolPtr+1; ENDLOOP;Hash↑[P].Rh←MakeString[];
StrRef↑[Hash↑[P].Rh]←127;StCount←StCount+1; GOTO Label40; END--:207--;
P←Hash↑[P].Lh; END ENDLOOP ;EXITS Label40 => NULL};IdLookupResult←P; END;--:205----210:
Primitive: PROCEDURE[S: StrNumber,C: Halfword,O: Halfword]
=
BEGIN K:PoolPointer;J:SmallNumber;L:SmallNumber; K←StrStart↑[S];
L←StrStart↑[S+1]-K;FOR i:INT IN [ INT[0 ].. INT[L-1 ]] DO J ← i; Buffer↑[J]←StrPool↑[K+J] ENDLOOP;
CurSym←IdLookup[0,L];IF INT[S]>=128 THEN BEGIN FlushString[StrPtr-1];
Hash↑[CurSym].Rh←S; END;Eqtb↑[CurSym].Lh←C;Eqtb↑[CurSym].Rh←O; END;
--:210----215:-- NewNumTok: PROCEDURE[V: Scaled] RETURNS[NewNumTokResult: Halfword] =
BEGIN P:Halfword;
P←GetNode[2];Mem[ INT[P]+1]↑.Int←V;Mem[P]↑.Hh.B0←16;Mem[P]↑.Hh.B1←12;
NewNumTokResult←P; END;--:215----216:--
FlushTokenList: PROCEDURE[P: Halfword] =
BEGIN Q:Halfword;
WHILE P#0 DO BEGIN Q←P;P←Mem[P]↑.Hh.Rh;
IF INT[Q]>=HiMemMin THEN BEGIN Mem[Q]↑.Hh.Rh←Avail;Avail←Q;
DynUsed←DynUsed-1; END ELSE BEGIN SELECT Mem[Q]↑.Hh.B0 FROM 1,2,16 => NULL;
4 =>BEGIN IF INT[StrRef↑[Mem[ INT[Q]+1]↑.Int]]<127 THEN IF INT[StrRef↑[Mem[ INT[Q]+1]↑.Int]]>1
THEN StrRef↑[Mem[ INT[Q]+1]↑.Int]←StrRef↑[Mem[ INT[Q]+1]↑.Int]-1 ELSE FlushString[
Mem[ INT[Q]+1]↑.Int]; END;
3,5,7,12,10,6,9,8,11,14,13,17,18,19 =>BEGIN GPointer←Q;TokenRecycle[];
END; ENDCASE =>Confusion[359];FreeNode[Q,2]; END; END ENDLOOP ; END;--:216----226:
DeleteMacRef: PROCEDURE[P: Halfword]
=
BEGIN IF Mem[P]↑.Hh.Lh=0 THEN FlushTokenList[P] ELSE Mem[P]↑.Hh.Lh← INT[Mem[P
]↑.Hh.Lh]-1; END;--:226----227:----624:-- PrintCmdMod: PROCEDURE[C,M: PascalInteger]
=
BEGIN SELECT C FROM--212:--18 =>Print[331];77 =>Print[330];59 =>Print[333];
72 =>Print[332];32 =>Print[334];78 =>Print[58];79 =>Print[44];57 =>Print[335];
19 =>Print[336];60 =>Print[337];27 =>Print[338];11 =>Print[339];81 =>Print[324];
26 =>Print[340];6 =>Print[341];9 =>Print[342];70 =>Print[343];73 =>Print[344];
13 =>Print[345];46 =>Print[123];63 =>Print[91];14 =>Print[346];15 =>Print[347];
69 =>Print[348];28 =>Print[349];47 =>Print[281];24 =>Print[350];
7 =>PrintChar[92];65 =>Print[125];64 =>Print[93];12 =>Print[351];8 =>Print[352];
80 =>Print[59];17 =>Print[353];74 =>Print[354];35 =>Print[355];58 =>Print[356];
71 =>Print[357];75 =>Print[358];--:212----683:
16 =>IF M<=2 THEN IF M=1 THEN Print[521] ELSE IF M<1 THEN Print[325] ELSE
Print[522] ELSE IF M=53 THEN Print[523] ELSE IF M=44 THEN Print[524] ELSE
Print[525];
4 =>IF M<=1 THEN IF M=1 THEN Print[528] ELSE Print[326] ELSE IF M=2242 THEN
Print[526] ELSE Print[527];--:683----688:--61 =>SELECT M FROM 1 =>Print[530];
2 =>PrintChar[64];3 =>Print[531]; ENDCASE =>Print[529];--:688----695:
56 =>IF M>=2242 THEN IF M=2242 THEN Print[542] ELSE IF M=2392 THEN Print[
543] ELSE Print[544] ELSE IF M<2 THEN Print[545] ELSE IF M=2 THEN Print[546
] ELSE Print[547];--:695----709:--3 =>IF M=0 THEN Print[557] ELSE Print[483];
--:709----740:--1,2 =>SELECT M FROM 1 =>Print[584];2 =>Print[323];3 =>Print[585];
ENDCASE =>Print[586];--:740----893:
33,34,37,55,45,50,36,43,54,48,51,52 =>PrintOp[M];--:893----1013:
30 =>PrintType[M];--:1013----1018:--82 =>IF M=0 THEN Print[777] ELSE Print[778];
--:1018----1024:--23 =>SELECT M FROM 0 =>Print[145];1 =>Print[146];2 =>Print[147];
ENDCASE =>Print[784];--:1024----1027:
21 =>IF M=0 THEN Print[785] ELSE Print[786];--:1027----1037:
22 =>SELECT M FROM 0 =>Print[800];1 =>Print[801];2 =>Print[802];3 =>Print[803];
ENDCASE =>Print[804];--:1037----1042:
31,62 =>BEGIN IF C=31 THEN Print[807] ELSE Print[808];Print[809];
Print[Hash↑[M].Rh]; END;41 =>IF M=0 THEN Print[810] ELSE Print[811];
10 =>Print[812];53,44,49 =>BEGIN PrintCmdMod[16,C];Print[813];PrintLn[];
ShowTokenList[Mem[Mem[M]↑.Hh.Rh]↑.Hh.Rh,0,1000,0]; END;5 =>Print[814];
40 =>Print[IntName↑[M]];--:1042----1052:
68 =>IF M=1 THEN Print[821] ELSE IF M=0 THEN Print[822] ELSE Print[823];
66 =>IF M=6 THEN Print[824] ELSE Print[825];
67 =>IF M=0 THEN Print[826] ELSE Print[827];--:1052----1079:
25 =>IF M<1 THEN Print[857] ELSE IF M=1 THEN Print[858] ELSE Print[859];
--:1079----1101:--20 =>SELECT M FROM 0 =>Print[869];1 =>Print[870];2 =>Print[871];
3 =>Print[872]; ENDCASE =>Print[873];--:1101----1109:
76 =>IF M=0 THEN Print[890] ELSE Print[891];--:1109----1179:
29 =>IF M=16 THEN Print[914] ELSE Print[913];--:1179-- ENDCASE =>Print[469];
END;--:624--
PrintCapsule: PROCEDURE
=
BEGIN PrintChar[40];PrintExp[GPointer,0];PrintChar[41]; END;
TokenRecycle: PROCEDURE =
BEGIN RecycleValue[GPointer]; END;--:224----1204:
END.