-- file: MFInputImpl1.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:02 pm PST
DIRECTORY
PascalBasic,
PascalWizardFiles,
MFTypes,
MFProcArray,
MFExternals,
MFInteraction,
MFMath,
MFMemory,
MFSymbols,
MFInput,
MFParsing;
MFInputImpl1: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, MFProcArray, MFExternals, MFInteraction, MFMath, MFMemory, MFSymbols, MFParsing EXPORTS MFInput = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFExternals, MFInteraction, MFMath, MFMemory, MFSymbols, MFInput, MFParsing;
--:591----623:--
CurCmd: EightBits;
CurMod: PascalInteger;
CurSym: Halfword;
--:623----627:
InputStack: LONG POINTER TO ARRAY PascalInteger[0..30] OF InStateRecord ← PascalStaticZone.NEW[ARRAY PascalInteger[0..30] OF InStateRecord];
InputPtr: PascalInteger[0..StackSize];
MaxInStack: PascalInteger[0..StackSize];
CurInput: InStateRecord;
--:627----630:--
InOpen: PascalInteger[0..6];
InputFile: LONG POINTER TO ARRAY PascalInteger[1..6] OF AlphaFile ← PascalStaticZone.NEW[ARRAY PascalInteger[1..6] OF AlphaFile];
Line: PascalInteger;
LineStack: LONG POINTER TO ARRAY PascalInteger[1..6] OF PascalInteger ← PascalStaticZone.NEW[ARRAY PascalInteger[1..6] OF PascalInteger];
--:630----632:
ParamStack: LONG POINTER TO ARRAY PascalInteger[0..150] OF Halfword ← PascalStaticZone.NEW[ARRAY PascalInteger[0..150] OF Halfword];
ParamPtr: PascalInteger[0..150];
MaxParamStack: PascalInteger;
--:632----633:--
FilePtr: PascalInteger[0..StackSize];
--:633----658:
ScannerStatus: PascalInteger[0..6];
WarningInfo: PascalInteger;
--:658----679:--
ForceEof: PascalBoolean;
--:698----737:--
CondPtr: Halfword;
IfLimit: PascalInteger[0..4];
CurIf: SmallNumber;
IfLine: PascalInteger;
--:737----751:
LoopPtr: Halfword;
--:27----30:
InputLn: PROCEDURE[ F: LONG POINTER TO AlphaFile,BypassEoln: PascalBoolean] RETURNS[InputLnResult: PascalBoolean]
=
BEGIN LastNonblank:PascalInteger[0..BufSize];
IF BypassEoln THEN IF NOT PascalTextEOF[file: @F↑] THEN PascalTextGET[file: @F↑];Last←First;
IF PascalTextEOF[file: @F↑] THEN InputLnResult←FALSE ELSE BEGIN LastNonblank←First;
WHILE NOT PascalTextEOLN[file: @F↑]DO BEGIN IF INT[Last]>=MaxBufStack THEN BEGIN
MaxBufStack←Last+1;
IF MaxBufStack=BufSize THEN Overflow[128,BufSize]; END;
Buffer↑[Last]←Xord↑[PascalTextElement[file: @F↑]];PascalTextGET[file: @F↑];Last←Last+1;
IF Buffer↑[Last-1]#32 THEN LastNonblank←Last; END ENDLOOP ;Last←LastNonblank;
InputLnResult←TRUE; END; END;--:30----36:-- BeginTokenList: PROCEDURE[P: Halfword,T: Quarterword]
=
BEGIN BEGIN IF INT[InputPtr]>MaxInStack THEN BEGIN MaxInStack←InputPtr
;IF InputPtr=StackSize THEN Overflow[481,StackSize]; END;
InputStack↑[InputPtr]←CurInput;InputPtr←InputPtr+1; END;
CurInput.StartField←P;CurInput.IndexField←T;
CurInput.LimitField←ParamPtr;CurInput.LocField←P; END;--:648----649:
EndTokenList: PROCEDURE =
BEGIN P:Halfword;
{IF INT[CurInput.IndexField]>=10 THEN IF INT[CurInput.IndexField]<=11
THEN BEGIN FlushTokenList[CurInput.StartField]; GOTO Label30;
END ELSE DeleteMacRef[CurInput.StartField];
WHILE INT[ParamPtr]>CurInput.LimitField DO BEGIN ParamPtr←ParamPtr-1;
P←ParamStack↑[ParamPtr];
IF P#0 THEN IF Mem[P]↑.Hh.Rh=1 THEN BEGIN RecycleValue[P];
FreeNode[P,2]; END ELSE FlushTokenList[P]; END ENDLOOP ;
EXITS Label30 => NULL};BEGIN InputPtr←InputPtr-1;CurInput←InputStack↑[InputPtr]; END;
BEGIN IF Interrupt#0 THEN PauseForInstructions[]; END; END;--:649----650:
CurTok: PROCEDURE RETURNS[CurTokResult: Halfword]
=
BEGIN P:Halfword;SaveType:SmallNumber;SaveExp:PascalInteger;
IF CurSym=0 THEN IF CurCmd=38 THEN BEGIN SaveType←CurType;
SaveExp←CurExp;MakeExpCopy[CurMod];P←StashCurExp[];
Mem[P]↑.Hh.Rh←0;CurType←SaveType;CurExp←SaveExp;
END ELSE BEGIN P←GetNode[2];Mem[ INT[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=0 THEN P←GetAvail [] ELSE BEGIN Avail←Mem[P]↑.Hh.Rh;Mem[P]↑.Hh.Rh←0;
DynUsed←DynUsed+1; END; END;Mem[P]↑.Hh.Lh←CurSym; END;CurTokResult←P; END;
--:650----651:-- BackInput: PROCEDURE =
BEGIN P:Halfword; P←CurTok[];
WHILE( INT[CurInput.IndexField]>6)AND (CurInput.LocField=0)DO
EndTokenList[] ENDLOOP ;BeginTokenList[P,10]; END;--:651----652:
BackError: PROCEDURE =
BEGIN OkToInterrupt←FALSE;BackInput[];
OkToInterrupt←TRUE;Error[]; END; InsError: PROCEDURE
=
BEGIN OkToInterrupt←FALSE;BackInput[];CurInput.IndexField←11;
OkToInterrupt←TRUE;Error[]; END;--:652----653:
BeginFileReading: PROCEDURE =
BEGIN IF InOpen=6 THEN Overflow[482,6];
IF First=BufSize THEN Overflow[128,BufSize];InOpen←InOpen+1;
BEGIN IF INT[InputPtr]>MaxInStack THEN BEGIN MaxInStack←InputPtr;
IF InputPtr=StackSize THEN Overflow[481,StackSize]; END;
InputStack↑[InputPtr]←CurInput;InputPtr←InputPtr+1; END;
CurInput.IndexField←InOpen;LineStack↑[CurInput.IndexField]←Line;
CurInput.StartField←First;CurInput.NameField←0; END;--:653----654:
EndFileReading: PROCEDURE =
BEGIN First←CurInput.StartField;
Line←LineStack↑[CurInput.IndexField];
IF CurInput.IndexField#InOpen THEN Confusion[483];
IF INT[CurInput.NameField]>2 THEN AClose[@InputFile↑[CurInput.IndexField]
];BEGIN InputPtr←InputPtr-1;CurInput←InputStack↑[InputPtr]; END;
InOpen←InOpen-1; END;--:654----655:--
ClearForErrorPrompt: PROCEDURE =
BEGIN WHILE( INT[CurInput.IndexField]<=6)AND (CurInput.NameField=0)AND (
INT[InputPtr]>0)AND (CurInput.LocField=CurInput.LimitField)DO
EndFileReading[] ENDLOOP ;PrintLn[]; END;--:655----660:
CheckOuterValidity: PROCEDURE RETURNS[CheckOuterValidityResult: PascalBoolean] =
BEGIN P:Halfword;
IF ScannerStatus=0 THEN CheckOuterValidityResult←TRUE ELSE BEGIN
DeletionsAllowed←FALSE;--661:--IF CurSym#0 THEN BEGIN P←GetAvail[];
Mem[P]↑.Hh.Lh←CurSym;BeginTokenList[P,10]; END--:661--;
IF INT[ScannerStatus]>1 THEN--662:--BEGIN Runaway[];
IF CurSym=0 THEN BEGIN IF Interaction=3 THEN NULL;PrintNl[133];Print[489];
END ELSE BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[133];Print[490]; END;
END;Print[491];BEGIN HelpPtr←4;HelpLine↑[3]←492;HelpLine↑[2]←493;
HelpLine↑[1]←494;HelpLine↑[0]←495; END;SELECT ScannerStatus FROM--663:
2 =>BEGIN Print[496];HelpLine↑[3]←497;CurSym←2235; END;
3 =>BEGIN Print[498];HelpLine↑[3]←499;
IF WarningInfo=0 THEN CurSym←2239 ELSE BEGIN CurSym←2231;
Eqtb↑[2231].Rh←WarningInfo; END; END;4,5 =>BEGIN Print[500];
IF ScannerStatus=5 THEN Print[Hash↑[WarningInfo].Rh] ELSE
PrintVariableName[WarningInfo];CurSym←2237; END;6 =>BEGIN Print[501];
Print[Hash↑[WarningInfo].Rh];Print[502];HelpLine↑[3]←503;CurSym←2236;
END;--:663-- ENDCASE;InsError[]; END--:662-- ELSE BEGIN BEGIN IF Interaction=3 THEN NULL;
PrintNl[133];Print[484]; END;PrintInt[WarningInfo];BEGIN HelpPtr←3;
HelpLine↑[2]←485;HelpLine↑[1]←486;HelpLine↑[0]←487; END;
IF CurSym=0 THEN HelpLine↑[2]←488;CurSym←2238;InsError[]; END;
DeletionsAllowed←TRUE;CheckOuterValidityResult←FALSE; END; END;--:660----665:
--:665----666:--
GetNext: PROCEDURE =
BEGIN K:PascalInteger[0..BufSize];KPlusOne:Halfword;
C:AsciiCode;Class:AsciiCode;N, F:PascalInteger; DO {--Label20:--CurSym←0;
{IF( INT[CurInput.IndexField]<=6) THEN--668:
BEGIN DO {--Label25:--C←Buffer↑[CurInput.LocField];
CurInput.LocField← INT[CurInput.LocField]+1;Class←CharClass↑[C];
{{{{SELECT Class FROM 0 => GOTO Label85;
1 =>BEGIN Class←CharClass↑[Buffer↑[CurInput.LocField]];
IF INT[Class]>1 THEN GOTO Label25 ELSE IF INT[Class]<1 THEN BEGIN N←0; GOTO Label86; END; END;
2 => GOTO Label25;3 =>BEGIN--678:--IF INT[CurInput.NameField]>2 THEN--680:
BEGIN Line←FileGetPos[@InputFile↑[CurInput.IndexField]];
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;PascalTextBREAK[file: @TermOut];
EndFileReading[];IF CheckOuterValidity [] THEN GOTO Label20 ELSE GOTO Label20; END;
Buffer↑[CurInput.LimitField]←37;First← INT[CurInput.LimitField]+1;
CurInput.LocField←CurInput.StartField; END--:680
ELSE BEGIN IF INT[InputPtr]>0 THEN BEGIN EndFileReading[]; GOTO Label20; END;
IF INT[Selector]<2 THEN OpenLogFile[];
IF INT[Interaction]>1 THEN BEGIN IF CurInput.LimitField=CurInput.
StartField THEN PrintNl[518];PrintLn[];First←CurInput.StartField;
BEGIN Print[42];TermInput[]; END;CurInput.LimitField←Last;
Buffer↑[CurInput.LimitField]←37;First← INT[CurInput.LimitField]+1;
CurInput.LocField←CurInput.StartField; END ELSE FatalError[519];
END--:678--;BEGIN IF Interrupt#0 THEN PauseForInstructions[]; END; GOTO Label25;
END;4 =>--670:
BEGIN IF Buffer↑[CurInput.LocField]=34 THEN CurMod←157 ELSE BEGIN K←
CurInput.LocField;Buffer↑[ INT[CurInput.LimitField]+1]←34;
DO CurInput.LocField← INT[CurInput.LocField]+1;
IF Buffer↑[CurInput.LocField]=34 THEN EXIT; ENDLOOP;
IF INT[CurInput.LocField]>CurInput.LimitField THEN--671:
BEGIN CurInput.LocField←CurInput.LimitField;
BEGIN IF Interaction=3 THEN NULL;PrintNl[133];Print[511]; END;
BEGIN HelpPtr←3;HelpLine↑[2]←512;HelpLine↑[1]←513;HelpLine↑[0]←514;
END;DeletionsAllowed←FALSE;Error[];DeletionsAllowed←TRUE; GOTO Label20;
END--:671--;KPlusOne←K+1;
IF CurInput.LocField=KPlusOne THEN CurMod←Buffer↑[K] ELSE BEGIN
BEGIN IF INT[PoolPtr]+CurInput.LocField-K>MaxPoolPtr THEN BEGIN IF
INT[PoolPtr]+CurInput.LocField-K>PoolSize THEN Overflow[129,
PoolSize-InitPoolPtr];MaxPoolPtr← INT[PoolPtr]+CurInput.LocField-K; END; END;
DO BEGIN StrPool↑[PoolPtr]←Buffer↑[K];PoolPtr←PoolPtr+1; END;
K←K+1; IF K=CurInput.LocField THEN EXIT; ENDLOOP;CurMod←MakeString[]; END; END;
CurInput.LocField← INT[CurInput.LocField]+1;CurCmd←39; GOTO Label10; END--:670
;5,6,7,8 =>BEGIN K← INT[CurInput.LocField]-1; GOTO Label40; END;20 =>--669:
BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[133];Print[508]; END;
BEGIN HelpPtr←2;HelpLine↑[1]←509;HelpLine↑[0]←510; END;
DeletionsAllowed←FALSE;Error[];DeletionsAllowed←TRUE; GOTO Label20; END--:669
; ENDCASE => NULL;K← INT[CurInput.LocField]-1;
WHILE CharClass↑[Buffer↑[CurInput.LocField]]=Class DO CurInput.
LocField← INT[CurInput.LocField]+1 ENDLOOP ; GOTO Label40;EXITS Label85 => NULL};--672:--N←C-48;
WHILE CharClass↑[Buffer↑[CurInput.LocField]]=0 DO BEGIN IF N<4096 THEN
N←10*N+Buffer↑[CurInput.LocField]-48;
CurInput.LocField← INT[CurInput.LocField]+1; END ENDLOOP ;
{IF Buffer↑[CurInput.LocField]=46 THEN IF CharClass↑[Buffer↑[ INT[CurInput.
LocField]+1]]=0 THEN GOTO Label30;F←0; GOTO Label87;
EXITS Label30 => NULL};CurInput.LocField← INT[CurInput.LocField]+1--:672--;EXITS Label86 => NULL};--673:--K←0;
DO IF INT[K]<17 THEN BEGIN Dig↑[K]←Buffer↑[CurInput.LocField]-48;K←K+1;
END;CurInput.LocField← INT[CurInput.LocField]+1;
IF CharClass↑[Buffer↑[CurInput.LocField]]#0 THEN EXIT; ENDLOOP;F←RoundDecimals[K];
IF F=65536 THEN BEGIN N←N+1;F←0; END--:673--;EXITS Label87 => NULL};--674:
IF N<4096 THEN CurMod←N*65536+F ELSE BEGIN BEGIN IF Interaction=3 THEN
NULL;PrintNl[133];Print[515]; END;BEGIN HelpPtr←2;HelpLine↑[1]←516;
HelpLine↑[0]←517; END;DeletionsAllowed←FALSE;Error[];
DeletionsAllowed←TRUE;CurMod←268435455; END;CurCmd←42; GOTO Label10--:674
;EXITS Label40 => NULL};CurSym←IdLookup[K, INT[CurInput.LocField]-K];EXIT; EXITS Label25 => NULL} ENDLOOP; END--:668-- ELSE--675:
IF INT[CurInput.LocField]>=HiMemMin THEN BEGIN CurSym←Mem[CurInput.
LocField]↑.Hh.Lh;CurInput.LocField←Mem[CurInput.LocField]↑.Hh.Rh;
IF INT[CurSym]>=2242 THEN IF INT[CurSym]>=2392 THEN--676:
BEGIN IF INT[CurSym]>=2542 THEN CurSym← INT[CurSym]-150;
BeginTokenList[ParamStack↑[ INT[CurInput.LimitField]+CurSym-(2392)],9];
GOTO Label20; END--:676-- ELSE BEGIN CurCmd←38;
CurMod←ParamStack↑[ INT[CurInput.LimitField]+CurSym-(2242)];CurSym←0;
GOTO Label10; END; END ELSE IF INT[CurInput.LocField]>0 THEN--677:
BEGIN IF Mem[CurInput.LocField]↑.Hh.B1=12 THEN BEGIN CurMod←Mem[
INT[CurInput.LocField]+1]↑.Int;
IF Mem[CurInput.LocField]↑.Hh.B0=16 THEN CurCmd←42 ELSE BEGIN CurCmd
←39;
BEGIN IF INT[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 Label10; END--:677
ELSE BEGIN EndTokenList[]; GOTO Label20; END--:675--;--667:
CurCmd←Eqtb↑[CurSym].Lh;CurMod←Eqtb↑[CurSym].Rh;
IF INT[CurCmd]>=83 THEN IF CheckOuterValidity [] THEN CurCmd←CurCmd-83
ELSE GOTO Label20--:667--;EXITS Label10 => NULL};EXIT; EXITS Label20 => NULL} ENDLOOP; END;--:666----681:--
FirmUpTheLine: PROCEDURE =
BEGIN K:PascalInteger[0..BufSize]; CurInput.LimitField←Last;
IF Internal↑[31]>0 THEN IF INT[Interaction]>1 THEN BEGIN PrintLn[];
IF INT[CurInput.StartField]<CurInput.LimitField THEN FOR i:INT IN [ INT[CurInput.
StartField ].. INT[ INT[CurInput.LimitField]-1 ]] DO K ← i; Print[Buffer↑[K]] ENDLOOP;
First←CurInput.LimitField;BEGIN Print[520];TermInput[]; END;
IF INT[Last]>First THEN BEGIN FOR i:INT IN [ INT[First ].. INT[Last-1 ]] DO K ← i; Buffer↑[ INT[K]+CurInput.
StartField-First]←Buffer↑[K] ENDLOOP;
CurInput.LimitField← INT[CurInput.StartField]+Last-First; END; END; END;
--:681----684:-- ScanToks: PROCEDURE[Terminator: CommandCode,
SubstList,TailEnd: Halfword,SuffixCount: SmallNumber] RETURNS[ScanToksResult: Halfword]
=
BEGIN P:Halfword;Q:Halfword;Balance:PascalInteger; P←49999;
Balance←1;Mem[49999]↑.Hh.Rh←0;{WHILE TRUE DO BEGIN GetNext[];
IF INT[CurSym]>0 THEN BEGIN--685:--BEGIN Q←SubstList;
{WHILE Q#0 DO BEGIN IF Mem[Q]↑.Hh.Lh=CurSym THEN BEGIN CurSym←Mem[ INT[Q]+1]↑
.Int;CurCmd←7; GOTO Label40; END;Q←Mem[Q]↑.Hh.Rh; END ENDLOOP ;EXITS Label40 => NULL}; END--:685--;
IF CurCmd=Terminator THEN--686:
IF CurMod>0 THEN Balance←Balance+1 ELSE BEGIN Balance←Balance-1;
IF Balance=0 THEN GOTO Label30; END--:686-- ELSE IF CurCmd=61 THEN--689:
BEGIN IF CurMod=0 THEN GetNext [] ELSE IF CurMod<=SuffixCount THEN
CurSym←2391+CurMod; END--:689--; END;Mem[P]↑.Hh.Rh←CurTok[];
P←Mem[P]↑.Hh.Rh; END ENDLOOP ;EXITS Label30 => NULL};Mem[P]↑.Hh.Rh←TailEnd;
FlushNodeList[SubstList];ScanToksResult←Mem[49999]↑.Hh.Rh; END;--:684----690:
GetSymbol: PROCEDURE =
BEGIN DO {--Label20:--GetNext[];
IF(CurSym=0)OR ( INT[CurSym]>2229) THEN BEGIN BEGIN IF Interaction=3 THEN NULL;
PrintNl[133];Print[532]; END;BEGIN HelpPtr←3;HelpLine↑[2]←533;
HelpLine↑[1]←534;HelpLine↑[0]←535; END;
IF INT[CurSym]>0 THEN HelpLine↑[2]←536 ELSE IF CurCmd=39 THEN BEGIN IF
INT[StrRef↑[CurMod]]<127 THEN IF INT[StrRef↑[CurMod]]>1 THEN StrRef↑[CurMod]←
StrRef↑[CurMod]-1 ELSE FlushString[CurMod]; END;CurSym←2229;
InsError[]; GOTO Label20; END;EXIT; EXITS Label20 => NULL} ENDLOOP; END;--:690----691:--
END.