-- file: TexScan5Impl.mesa
-- Pascal-to-Mesa translator output, translated at September 27, 1985 10:21:37 am PDT


DIRECTORY
  PascalBasic,
  PascalWizardFiles,
  TexSysdep,
  TexTypes,
  TexInteraction,
  TexBuildPage,
  TexMemory,
  TexSymbols,
  TexScan,
  TexOps,
  TexRest,
  TexSysdepInline;

TexScan5Impl: PROGRAM IMPORTS PascalBasic, TexSysdep, TexTypes, TexInteraction, TexMemory, TexSymbols, TexScan, TexOps, TexRest, TexSysdepInline EXPORTS TexScan = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, TexSysdep, TexTypes, TexInteraction, TexBuildPage, TexMemory, TexSymbols, TexScan, TexOps, TexRest, TexSysdepInline;

 Expand: PROCEDURE = 
BEGIN T:Halfword;P, Q, R:Halfword;J:PascalInteger[0..BufSize];
CvBackup:PascalInteger;CvlBackup, RadixBackup:SmallNumber;
BackupBackup:Halfword;SaveScannerStatus:SmallNumber;
 CvBackup←CurVal;CvlBackup←CurValLevel;RadixBackup←Radix;
BackupBackup←Mem[64987]↑.Hh.Rh;IF  INT[CurCmd]<110  THEN--367:
BEGIN IF Eqtb↑[4803].Int>1  THEN ShowCurCmdChr[];
SELECT CurCmd FROM 109 =>--386:
BEGIN IF CurMark↑[CurChr]#0  THEN BeginTokenList[CurMark↑[CurChr],14
]; END--:386--;101 =>--368:--BEGIN GetToken[];T←CurTok;GetToken[];
IF  INT[CurCmd]>99  THEN Expand [] ELSE BackInput[];CurTok←T;BackInput[];
 END--:368--;102 =>--369:--BEGIN SaveScannerStatus←ScannerStatus;
ScannerStatus←0;GetToken[];ScannerStatus←SaveScannerStatus;
T←CurTok;BackInput[];IF  INT[T]>=4096  THEN BEGIN P←GetAvail[];
Mem[P]↑.Hh.Lh←6863;Mem[P]↑.Hh.Rh←CurInput.LocField;
CurInput.StartField←P;CurInput.LocField←P; END; END--:369--;106 =>--372:
BEGIN R←GetAvail[];P←R;DO GetXToken[];
IF CurCs=0  THEN BEGIN Q←GetAvail[];Mem[P]↑.Hh.Rh←Q;
Mem[Q]↑.Hh.Lh←CurTok;P←Q; END; IF CurCs#0 THEN EXIT; ENDLOOP;IF CurCmd#66  THEN--373:
BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[486]; END;
PrintEsc[367];Print[487];BEGIN HelpPtr←2;HelpLine↑[1]←488;
HelpLine↑[0]←489; END;BackError[]; END--:373--;--374:--J←First;
P←Mem[R]↑.Hh.Rh;
WHILE P#0 DO BEGIN IF  INT[J]>=MaxBufStack  THEN BEGIN MaxBufStack←J+1;
IF MaxBufStack=BufSize  THEN Overflow[128,BufSize]; END;
Buffer↑[J]← PascalMODPower2Mask[Mem[P]↑.Hh.Lh ,255];J←J+1;P←Mem[P]↑.Hh.Rh; END ENDLOOP ;
IF  INT[J]>First+1  THEN BEGIN NoNewControlSequence←FALSE;
CurCs←IdLookup[First,J-First];NoNewControlSequence←TRUE;
 END  ELSE IF J=First  THEN CurCs←257  ELSE CurCs←129+Buffer↑[First]--:374
-- --;FlushList[R];
IF Eqtb↑[CurCs].Hh.B0=100  THEN BEGIN Eqtb↑[CurCs]←Eqtb↑[2765]; END;
CurTok← INT[CurCs]+4096;BackInput[]; END--:372--;107 =>ConvToks[];
108 =>InsTheToks[];104 =>Conditional[];105 =>--510:
IF  INT[CurChr]>IfLimit  THEN IF IfLimit=1  THEN InsertRelax [] ELSE BEGIN
BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[636]; END;
PrintCmdChr[105,CurChr];BEGIN HelpPtr←1;HelpLine↑[0]←637; END;
Error[]; END  ELSE BEGIN WHILE CurChr#2 DO PassText[] ENDLOOP ;--496:
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--:496--;
 END--:510--;103 =>--378:
IF  INT[CurChr]>0  THEN ForceEof←TRUE  ELSE IF NameInProgress  THEN
InsertRelax [] ELSE StartInput--:378--[]; ENDCASE =>--370:
BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[480]; END;
BEGIN HelpPtr←5;HelpLine↑[4]←481;HelpLine↑[3]←482;HelpLine↑[2]←483;
HelpLine↑[1]←484;HelpLine↑[0]←485; END;Error[]; END--:370--; END--:367
 ELSE IF  INT[CurCmd]<114  THEN MacroCall [] ELSE--375:--BEGIN CurTok←6860;
BackInput[]; END--:375--;CurVal←CvBackup;CurValLevel←CvlBackup;
Radix←RadixBackup;Mem[64987]↑.Hh.Rh←BackupBackup; END;--:366----380:
 TheToks: PROCEDURE RETURNS[TheToksResult: Halfword] = 
BEGIN OldSetting:PascalInteger[0..21];P, Q, R:Halfword;
 GetXToken[];ScanSomethingInternal[5,FALSE];
IF  INT[CurValLevel]>=4  THEN--466:--BEGIN P←64997;Mem[P]↑.Hh.Rh←0;
IF CurValLevel=4  THEN BEGIN Q←GetAvail[];Mem[P]↑.Hh.Rh←Q;
Mem[Q]↑.Hh.Lh←4096+CurVal;P←Q;
 END  ELSE IF CurVal#0  THEN BEGIN R←Mem[CurVal]↑.Hh.Rh;
WHILE R#0 DO BEGIN BEGIN BEGIN Q←Avail;
IF Q=0  THEN Q←GetAvail [] ELSE BEGIN Avail←Mem[Q]↑.Hh.Rh;Mem[Q]↑.Hh.Rh←0;
DynUsed←DynUsed+1; END; END;Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←Mem[R]↑.Hh.Lh;
P←Q; END;R←Mem[R]↑.Hh.Rh; END ENDLOOP ; END;TheToksResult←P; END--:466
 ELSE BEGIN OldSetting←Selector;Selector←21;
SELECT CurValLevel FROM 0 =>PrintInt[CurVal];
1 =>BEGIN PrintScaled[CurVal];Print[265]; END;
2 =>BEGIN PrintSpec[CurVal,265];DeleteGlueRef[CurVal]; END;
3 =>BEGIN PrintSpec[CurVal,209];DeleteGlueRef[CurVal]; END; ENDCASE;
Selector←OldSetting;TheToksResult←StrToks[]; END; END;--:465----467:
  InsTheToks: PROCEDURE = 
BEGIN Mem[64988]↑.Hh.Rh←TheToks[];
BeginTokenList[Mem[64997]↑.Hh.Rh,4]; END;--:467----470:
 
 ConvToks: PROCEDURE = 
BEGIN OldSetting:PascalInteger[0..21];C:PascalInteger[0..5];
SaveScannerStatus:SmallNumber; C←CurChr;--471:
SELECT C FROM 0,1 =>ScanInt[];2,3 =>BEGIN SaveScannerStatus←ScannerStatus;
ScannerStatus←0;GetToken[];ScannerStatus←SaveScannerStatus; END;
4 =>ScanFontIdent[];5 =>IF JobName=0  THEN OpenLogFile[]; ENDCASE--:471--;
OldSetting←Selector;Selector←21;--472:--SELECT C FROM 0 =>PrintInt[CurVal];
1 =>PrintRomanInt[CurVal];
2 =>IF CurCs#0  THEN SprintCs[CurCs] ELSE PrintChar[CurChr];
3 =>PrintMeaning[];4 =>BEGIN Print[FontName↑[CurVal]];
IF FontSize↑[CurVal]#FontDsize↑[CurVal] THEN BEGIN Print[601];
PrintScaled[FontSize↑[CurVal]];Print[265]; END; END;5 =>Print[JobName];
 ENDCASE--:472--;Selector←OldSetting;Mem[64988]↑.Hh.Rh←StrToks[];
BeginTokenList[Mem[64997]↑.Hh.Rh,4]; END;--:470----473:
 ScanToks: PROCEDURE[MacroDef,Xpand: PascalBoolean] RETURNS[ScanToksResult: Halfword] = 
BEGIN 
 T:Halfword;S:Halfword;P:Halfword;Q:Halfword;Unbalance:Halfword;
HashBrace:Halfword;
 IF MacroDef  THEN ScannerStatus←2  ELSE ScannerStatus←5;
WarningIndex←CurCs;DefRef←GetAvail[];Mem[DefRef]↑.Hh.Lh←0;
P←DefRef;HashBrace←0;T←3120;{IF MacroDef  THEN--474:
BEGIN {{WHILE TRUE DO BEGIN GetToken[];IF  INT[CurTok]<768  THEN  GOTO Label31;
IF CurCmd=6  THEN--476:--BEGIN S← INT[3328]+CurChr;GetToken[];
IF CurCmd=1  THEN BEGIN HashBrace←CurTok;BEGIN Q←GetAvail[];
Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←CurTok;P←Q; END;BEGIN Q←GetAvail[];
Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←3584;P←Q; END; GOTO Label30; END;
IF T=3129  THEN BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[134];
Print[604]; END;BEGIN HelpPtr←1;HelpLine↑[0]←605; END;Error[];
 END  ELSE BEGIN T←T+1;
IF CurTok#T  THEN BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[134];
Print[606]; END;BEGIN HelpPtr←2;HelpLine↑[1]←607;HelpLine↑[0]←608;
 END;BackError[]; END;CurTok←S; END; END--:476--;BEGIN Q←GetAvail[];
Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←CurTok;P←Q; END; END ENDLOOP ;
EXITS Label31 => NULL};BEGIN Q←GetAvail[];Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←3584;P←Q; END;
IF CurCmd=2  THEN--475:--BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[134];
Print[518]; END;AlignState←AlignState+1;BEGIN HelpPtr←2;
HelpLine↑[1]←602;HelpLine↑[0]←603; END;Error[]; GOTO Label40; END--:475--;
EXITS Label30 => NULL}; END--:474-- ELSE ScanLeftBrace[];--477:--Unbalance←1;
WHILE TRUE DO BEGIN IF Xpand  THEN--478:
BEGIN {WHILE TRUE DO BEGIN GetNext[];IF CurCmd#108  THEN  GOTO Label32;
Q←TheToks[];
IF Mem[64997]↑.Hh.Rh#0  THEN BEGIN Mem[P]↑.Hh.Rh←Mem[64997]↑.Hh.Rh;P←Q;
 END; END ENDLOOP ;EXITS Label32 => NULL};XToken []; END--:478-- ELSE GetToken[];
IF  INT[CurTok]<768  THEN IF  INT[CurCmd]<2  THEN Unbalance←Unbalance+1  ELSE BEGIN
Unbalance← INT[Unbalance]-1;IF Unbalance=0  THEN  GOTO Label40;
 END  ELSE IF CurCmd=6  THEN IF MacroDef  THEN--479:--BEGIN S←CurTok;
IF Xpand  THEN GetXToken [] ELSE GetToken[];
IF CurCmd#6  THEN IF( INT[CurTok]<=3120)OR ( INT[CurTok]>T) THEN BEGIN BEGIN IF
Interaction=3  THEN NULL;PrintNl[134];Print[609]; END;
SprintCs[WarningIndex];BEGIN HelpPtr←3;HelpLine↑[2]←610;
HelpLine↑[1]←611;HelpLine↑[0]←612; END;BackError[];CurTok←S;
 END  ELSE CurTok← INT[1232]+CurChr; END--:479--;BEGIN Q←GetAvail[];
Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←CurTok;P←Q; END; END--:477-- ENDLOOP ;
EXITS Label40 => NULL};ScannerStatus←0;IF HashBrace#0  THEN BEGIN Q←GetAvail[];
Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←HashBrace;P←Q; END;ScanToksResult←P; END;
--:473----482:-- ReadToks: PROCEDURE[N: PascalInteger,R: Halfword] = 
BEGIN 
 P:Halfword;Q:Halfword;S:PascalInteger;M:SmallNumber;
 ScannerStatus←2;WarningIndex←R;DefRef←GetAvail[];
Mem[DefRef]↑.Hh.Lh←0;P←DefRef;BEGIN Q←GetAvail[];Mem[P]↑.Hh.Rh←Q;
Mem[Q]↑.Hh.Lh←3584;P←Q; END;IF(N<0)OR (N>15) THEN M←16  ELSE M←N;
S←AlignState;AlignState←1000000;DO--483:--BeginFileReading[];
CurInput.NameField←M+1;IF ReadOpen↑[M]=2  THEN--484:
IF  INT[Interaction]>1  THEN IF N<0  THEN BEGIN Print[210];TermInput[];
 END  ELSE BEGIN PrintLn[];SprintCs[R];BEGIN Print[61];TermInput[]; END;
N←-1; END  ELSE FatalError[613]--:484-- ELSE IF ReadOpen↑[M]=1  THEN--485:
IF InputLn[@ReadFile↑[M],FALSE] THEN ReadOpen↑[M]←0  ELSE BEGIN AClose[
@ReadFile↑[M]];ReadOpen↑[M]←2; END--:485-- ELSE--486:
BEGIN IF  NOT InputLn[@ReadFile↑[M],TRUE] THEN BEGIN AClose[@ReadFile↑[M]]
;ReadOpen↑[M]←2;IF AlignState#1000000  THEN BEGIN Runaway[];
BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[614]; END;PrintEsc[395];
BEGIN HelpPtr←1;HelpLine↑[0]←615; END;AlignState←1000000;Error[]; END;
 END; END--:486--;CurInput.LimitField←Last;
IF(Eqtb↑[4815].Int<0)OR (Eqtb↑[4815].Int>127) THEN CurInput.LimitField←
 INT[CurInput.LimitField]-1  ELSE Buffer↑[CurInput.LimitField]←Eqtb↑[4815].
Int;First←CurInput.LimitField+1;
CurInput.LocField←CurInput.StartField;CurInput.StateField←33;
{WHILE TRUE DO BEGIN GetToken[];IF CurTok=0  THEN  GOTO Label30;
BEGIN Q←GetAvail[];Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←CurTok;P←Q; END; END ENDLOOP ;
EXITS Label30 => NULL};EndFileReading--:483--[]; IF AlignState=1000000 THEN EXIT; ENDLOOP;CurVal←DefRef;
ScannerStatus←0;AlignState←S; END;--:482----494:-- 
 PassText: PROCEDURE = 
BEGIN  L:PascalInteger;SaveScannerStatus:SmallNumber;
 SaveScannerStatus←ScannerStatus;ScannerStatus←1;L←0;
SkipLine←Line;{WHILE TRUE DO BEGIN GetNext[];
IF CurCmd=105  THEN BEGIN IF L=0  THEN  GOTO Label30;IF CurChr=2  THEN L←L-1;
 END  ELSE IF CurCmd=104  THEN L←L+1; END ENDLOOP ;
EXITS Label30 => NULL};ScannerStatus←SaveScannerStatus; END;--:494----497:
 ChangeIfLimit: PROCEDURE[L: SmallNumber,P: Halfword] = 
BEGIN 
 Q:Halfword;
 {IF P=CondPtr  THEN IfLimit←L  ELSE BEGIN Q←CondPtr;
WHILE TRUE DO BEGIN IF Q=0  THEN Confusion[616];
IF Mem[Q]↑.Hh.Rh=P  THEN BEGIN Mem[Q]↑.Hh.B0←L; GOTO Label10; END;
Q←Mem[Q]↑.Hh.Rh; END ENDLOOP ; END;EXITS Label10 => NULL}; END;--:497----498:-- 

 Conditional: PROCEDURE = 
BEGIN  B:PascalBoolean;R:PascalInteger[60..62];M, N:PascalInteger;P, Q:Halfword;
SaveScannerStatus:SmallNumber;SaveCondPtr:Halfword;
ThisIf:SmallNumber;--495:--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;CurIf←CurChr;IfLimit←1;
IfLine←Line; END--:495--;SaveCondPtr←CondPtr;ThisIf←CurChr;--501:
{{SELECT ThisIf FROM 0,1 =>--506:--BEGIN BEGIN GetXToken[];
IF CurCmd=0  THEN IF CurChr=257  THEN BEGIN CurCmd←13;
CurChr← INT[CurTok]-4097; END; END;
IF( INT[CurCmd]>13)OR ( INT[CurChr]>127) THEN BEGIN M←0;N←256;
 END  ELSE BEGIN M←CurCmd;N←CurChr; END;BEGIN GetXToken[];
IF CurCmd=0  THEN IF CurChr=257  THEN BEGIN CurCmd←13;
CurChr← INT[CurTok]-4097; END; END;
IF( INT[CurCmd]>13)OR ( INT[CurChr]>127) THEN BEGIN CurCmd←0;CurChr←256; END;
IF ThisIf=0  THEN B←(N=CurChr) ELSE B←(M=CurCmd); END--:506--;2,3 =>--503:
BEGIN IF ThisIf=2  THEN ScanInt [] ELSE ScanDimen[FALSE,FALSE,FALSE];
N←CurVal;--406:--DO GetXToken[]; IF CurCmd#10--:406-- THEN EXIT; ENDLOOP;
IF( INT[CurTok]>=3132)AND ( INT[CurTok]<=3134) THEN R← INT[CurTok]-3072  ELSE BEGIN BEGIN
IF Interaction=3  THEN NULL;PrintNl[134];Print[640]; END;
PrintCmdChr[104,ThisIf];BEGIN HelpPtr←1;HelpLine↑[0]←641; END;
BackError[];R←61; END;
IF ThisIf=2  THEN ScanInt [] ELSE ScanDimen[FALSE,FALSE,FALSE];
SELECT R FROM 60 =>B←(N<CurVal);61 =>B←(N=CurVal);62 =>B←(N>CurVal); ENDCASE;
 END--:503--;4 =>--504:--BEGIN ScanInt[];B←PascalODD[CurVal]; END--:504--;
5 =>B←(ABS[CurList.ModeField]=1);6 =>B←(ABS[CurList.ModeField]=101);
7 =>B←(ABS[CurList.ModeField]=201);8 =>B←( INT[CurList.ModeField]<0);
9,10,11 =>--505:--BEGIN ScanEightBitInt[];P←Eqtb↑[3822+CurVal].Hh.Rh;
IF ThisIf=9  THEN B←(P=0) ELSE IF P=0  THEN B←FALSE  ELSE IF ThisIf=10
 THEN B←(Mem[P]↑.Hh.B0=0) ELSE B←(Mem[P]↑.Hh.B0=1); END--:505--;12 =>--507:
BEGIN SaveScannerStatus←ScannerStatus;ScannerStatus←0;GetNext[];
N←CurCs;P←CurCmd;Q←CurChr;GetNext[];
IF CurCmd#P  THEN B←FALSE  ELSE IF  INT[CurCmd]<110  THEN B←(CurChr=Q) ELSE--
-- 508:--BEGIN P←Mem[CurChr]↑.Hh.Rh;Q←Mem[Eqtb↑[N].Hh.Rh]↑.Hh.Rh;
WHILE(P#0)AND (Q#0)DO IF Mem[P]↑.Hh.Lh#Mem[Q]↑.Hh.Lh  THEN P←0  ELSE
BEGIN P←Mem[P]↑.Hh.Rh;Q←Mem[Q]↑.Hh.Rh; END ENDLOOP ;B←((P=0)AND (Q=0)); END--:508--;
ScannerStatus←SaveScannerStatus; END--:507--;
13 =>BEGIN ScanFourBitInt[];B←(ReadOpen↑[CurVal]=2); END;14 =>B←TRUE;
15 =>B←FALSE;16 =>--509:--BEGIN ScanInt[];N←CurVal;
IF Eqtb↑[4803].Int>1  THEN BEGIN BeginDiagnostic[];Print[642];PrintInt[N];
PrintChar[125];EndDiagnostic[FALSE]; END;WHILE N#0 DO BEGIN PassText[];
IF CondPtr=SaveCondPtr  THEN IF CurChr=4  THEN N←N-1  ELSE  GOTO Label50
 ELSE IF CurChr=2  THEN--496:--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--:496--; END ENDLOOP ;ChangeIfLimit[4,SaveCondPtr]; GOTO Label10;
 END--:509--; ENDCASE--:501--;IF Eqtb↑[4803].Int>1  THEN--502:
BEGIN BeginDiagnostic[];IF B  THEN Print[638] ELSE Print[639];
EndDiagnostic[FALSE]; END--:502--;
IF B  THEN BEGIN ChangeIfLimit[3,SaveCondPtr]; GOTO Label10; END;--500:
WHILE TRUE DO BEGIN PassText[];
IF CondPtr=SaveCondPtr  THEN BEGIN IF CurChr#4  THEN  GOTO Label50;
BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[636]; END;PrintEsc[634];
BEGIN HelpPtr←1;HelpLine↑[0]←637; END;Error[];
 END  ELSE IF CurChr=2  THEN--496:--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--:496--; END--:500-- ENDLOOP ;EXITS Label50 => NULL};IF CurChr=2  THEN--496:
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--:496
 ELSE IfLimit←2;EXITS Label10 => NULL}; END;--:498----515:-- BeginName: PROCEDURE
 = 
BEGIN AreaDelimiter←0;ExtDelimiter←0; END;--:515----516:

END.