-- file: MFInputImpl2.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:02 pm PST
-- Pavel, October 31, 1985 5:07:14 pm PST
DIRECTORY
PascalBasic,
PascalWizardFiles,
MFTypes, MFRest,
MFProcArray,
MFInteraction,
MFMemory,
MFSymbols,
MFInput;
MFInputImpl2: PROGRAM IMPORTS MFRest, MFProcArray, MFInteraction, MFMemory, MFSymbols, MFInput EXPORTS MFInput = PUBLIC
BEGIN OPEN MFRest, PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMemory, MFSymbols, MFInput;
GetClearSymbol: PROCEDURE
=
BEGIN GetSymbol[];ClearSymbol[CurSym,FALSE]; END;--:691----692:
CheckEquals: PROCEDURE
=
BEGIN IF CurCmd#51 THEN IF CurCmd#77 THEN BEGIN MissingErr[61];
BEGIN HelpPtr←5;HelpLine↑[4]←537;HelpLine↑[3]←538;HelpLine↑[2]←539;
HelpLine↑[1]←540;HelpLine↑[0]←541; END;BackError[]; END; END;--:692----693:
MakeOpDef: PROCEDURE =
BEGIN M:CommandCode;P, Q, R:Halfword;
M←CurMod;GetSymbol[];Q←GetNode[2];Mem[Q]↑.Hh.Lh←CurSym;
Mem[ INT[Q]+1]↑.Int←2242;GetClearSymbol[];WarningInfo←CurSym;GetSymbol[];
P←GetNode[2];Mem[P]↑.Hh.Lh←CurSym;Mem[ INT[P]+1]↑.Int←2243;Mem[P]↑.Hh.Rh←Q;
GetNext[];CheckEquals[];ScannerStatus←5;Q←GetAvail[];Mem[Q]↑.Hh.Lh←0;
R←GetAvail[];Mem[Q]↑.Hh.Rh←R;Mem[R]↑.Hh.Lh←0;
Mem[R]↑.Hh.Rh←ScanToks[16,P,0,0];ScannerStatus←0;
Eqtb↑[WarningInfo].Lh←M;Eqtb↑[WarningInfo].Rh←Q;GetXNext[]; END;--:693
--696:----1031:-- CheckDelimiter: PROCEDURE[LDelim,RDelim: Halfword]
=
BEGIN {IF CurCmd=62 THEN IF CurMod=LDelim THEN GOTO Label10;
IF CurSym#RDelim THEN BEGIN MissingErr[Hash↑[RDelim].Rh];
BEGIN HelpPtr←2;HelpLine↑[1]←787;HelpLine↑[0]←788; END;BackError[];
END ELSE BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[133];Print[789]; END;
Print[Hash↑[RDelim].Rh];Print[790];BEGIN HelpPtr←3;HelpLine↑[2]←791;
HelpLine↑[1]←792;HelpLine↑[0]←793; END;Error[]; END;EXITS Label10 => NULL}; END;--:1031----1010:
ScanDeclaredVariable: PROCEDURE RETURNS[ScanDeclaredVariableResult: Halfword] =
BEGIN X:Halfword;
H, T:Halfword;L:Halfword; GetSymbol[];X←CurSym;
IF CurCmd#41 THEN ClearSymbol[X,FALSE];
IF Eqtb↑[X].Rh=0 THEN NewRoot[X];H←GetAvail[];Mem[H]↑.Hh.Lh←X;T←H;
{WHILE TRUE DO BEGIN GetXNext[];IF CurSym=0 THEN GOTO Label30;
IF CurCmd#41 THEN IF CurCmd#40 THEN IF CurCmd=63 THEN--1011:
BEGIN L←CurSym;GetXNext[];IF CurCmd#64 THEN BEGIN BackInput[];
CurSym←L;CurCmd←63; GOTO Label30; END ELSE CurSym←0; END--:1011
ELSE GOTO Label30;Mem[T]↑.Hh.Rh←GetAvail[];T←Mem[T]↑.Hh.Rh;
Mem[T]↑.Hh.Lh←CurSym; END ENDLOOP ;EXITS Label30 => NULL};ScanDeclaredVariableResult←H; END;--:1010
ScanDef: PROCEDURE =
BEGIN M:PascalInteger[1..2];N:PascalInteger[0..3];K:PascalInteger[0..150];C:PascalInteger[0..7];R:Halfword;
Q:Halfword;P:Halfword;Base:Halfword;LDelim, RDelim:Halfword;
M←CurMod;C←0;Mem[49999]↑.Hh.Rh←0;Q←GetAvail[];Mem[Q]↑.Hh.Lh←0;
R←0;--699:--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=0 THEN--700:--BEGIN BEGIN IF Interaction=3 THEN NULL;
PrintNl[133];Print[548]; END;BEGIN HelpPtr←2;HelpLine↑[1]←549;
HelpLine↑[0]←550; END;Error[];WarningInfo←21; END--:700--;
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--:699--;K←N;IF CurCmd=31 THEN--702:--DO LDelim←CurSym;
RDelim←CurMod;GetNext[];
IF(CurCmd=56)AND (CurMod>=2242) THEN Base←CurMod ELSE BEGIN BEGIN IF
Interaction=3 THEN NULL;PrintNl[133];Print[551]; END;BEGIN HelpPtr←1;
HelpLine↑[0]←552; END;BackError[];Base←2242; END;--703:
DO Mem[Q]↑.Hh.Rh←GetAvail[];Q←Mem[Q]↑.Hh.Rh;Mem[Q]↑.Hh.Lh← INT[Base]+K;
GetSymbol[];P←GetNode[2];Mem[ INT[P]+1]↑.Int← INT[Base]+K;Mem[P]↑.Hh.Lh←CurSym;
IF K=150 THEN Overflow[553,150];K←K+1;Mem[P]↑.Hh.Rh←R;R←P;GetNext[];
IF CurCmd#79--:703-- THEN EXIT; ENDLOOP;CheckDelimiter[LDelim,RDelim];GetNext[];
IF CurCmd#31--:702-- THEN EXIT; ENDLOOP;IF CurCmd=56 THEN--704:--BEGIN P←GetNode[2];
IF CurMod<2242 THEN BEGIN C←CurMod;Mem[ INT[P]+1]↑.Int←2242+K;
END ELSE BEGIN Mem[ INT[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[553,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[553,150];Mem[ INT[P]+1]↑.Int←2242+K;
GetSymbol[];Mem[P]↑.Hh.Lh←CurSym;Mem[P]↑.Hh.Rh←R;R←P;GetNext[]; END;
END--:704--;CheckEquals[];P←GetAvail[];Mem[P]↑.Hh.Lh←C;Mem[Q]↑.Hh.Rh←P;
--697:
IF M=1 THEN Mem[P]↑.Hh.Rh←ScanToks[16,R,0,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=21 THEN FlushTokenList[Mem[22]↑.Int]--:697--;
ScannerStatus←0;GetXNext[]; END;--:696----705:--
--719:----721:-- PrintMacroName: PROCEDURE[A,N: Halfword] =
BEGIN P, Q:Halfword;
IF N#0 THEN Print[Hash↑[N].Rh] ELSE BEGIN P←Mem[A]↑.Hh.Lh;
IF P=0 THEN Print[Hash↑[Mem[Mem[Mem[A]↑.Hh.Rh]↑.Hh.Lh]↑.Hh.Lh].Rh] ELSE BEGIN
Q←P;WHILE Mem[Q]↑.Hh.Rh#0 DO Q←Mem[Q]↑.Hh.Rh ENDLOOP ;
Mem[Q]↑.Hh.Rh←Mem[Mem[A]↑.Hh.Rh]↑.Hh.Lh;ShowTokenList[P,0,1000,0];
Mem[Q]↑.Hh.Rh←0; END; END; END;--:721----722:--
END.