-- file: PLtoTF3Impl.mesa
-- Pascal-to-Mesa translator output, translated at October 23, 1985 11:00:04 am PDT


DIRECTORY
  PascalBasic,
  PascalWizardFiles,
  PLtoTFPrivate,
  PLtoTFExternals;

PLtoTF3Impl: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, PLtoTFPrivate EXPORTS PLtoTFPrivate = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, PLtoTFPrivate, PLtoTFExternals;
 GetFourBytes: PROCEDURE = 
BEGIN C:PascalInteger;
R:PascalInteger;Q:PascalInteger; DO GetNext[]; IF CurChar#32 THEN EXIT; ENDLOOP;R←0;
CurBytes.B0←0;CurBytes.B1←0;CurBytes.B2←0;CurBytes.B3←0;
IF CurChar=72  THEN R←16  ELSE IF CurChar=79  THEN R←8  ELSE BEGIN BEGIN
IF  INT[CharsOnLine]>0  THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};
PascalWriteLongString[file: @Output, item: "An octal (\"O\") or hex (\"H\") value is needed here"];
ShowErrorContext[]; END;
DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;
IF R>0  THEN BEGIN  Q← 256 /R;DO GetNext[]; IF CurChar#32 THEN EXIT; ENDLOOP;
WHILE(( INT[CurChar]>=48)AND ( INT[CurChar]<=57))OR (( INT[CurChar]>=65)AND ( INT[CurChar]<=70)
)DO--60:--BEGIN IF  INT[CurChar]>=65  THEN CurChar←CurChar-7;
C←(R*CurBytes.B0)+( CurBytes.B1 /Q);
IF C>255  THEN BEGIN CurBytes.B0←0;CurBytes.B1←0;CurBytes.B2←0;
CurBytes.B3←0;
IF R=8  THEN BEGIN BEGIN IF  INT[CharsOnLine]>0  THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};
PascalWriteLongString[file: @Output, item: "Sorry, the maximum octal value is O 37777777777"];
ShowErrorContext[]; END;
DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP;
 END  ELSE BEGIN BEGIN IF  INT[CharsOnLine]>0  THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};
PascalWriteLongString[file: @Output, item: "Sorry, the maximum hex value is H FFFFFFFF"];ShowErrorContext[];
 END;DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;
 END  ELSE IF CurChar>=48+R  THEN BEGIN BEGIN IF  INT[CharsOnLine]>0  THEN
{PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};PascalWriteLongString[file: @Output, item: "Illegal digit"];ShowErrorContext[]; END;
DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP;
 END  ELSE BEGIN CurBytes.B0←C;
CurBytes.B1←(R*( CurBytes.B1 MOD Q))+( CurBytes.B2 /Q);
CurBytes.B2←(R*( CurBytes.B2 MOD Q))+( CurBytes.B3 /Q);
CurBytes.B3←(R*( CurBytes.B3 MOD Q))+CurChar-48;GetNext[]; END; END ENDLOOP ;
--:60-- END; END;--:59----62:-- GetFix: PROCEDURE RETURNS[GetFixResult: FixWord] = 
BEGIN Negative:PascalBoolean;
Acc:PascalInteger;IntPart:PascalInteger;J:PascalInteger[0..7]; DO GetNext[];
 IF CurChar#32 THEN EXIT; ENDLOOP;Negative←FALSE;Acc←0;
IF(CurChar#82)AND (CurChar#68) THEN BEGIN BEGIN IF  INT[CharsOnLine]>0
 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};PascalWriteLongString[file: @Output, item: "An \"R\" or \"D\" value is needed here"];
ShowErrorContext[]; END;
DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END  ELSE BEGIN--63:
DO GetNext[];IF CurChar=45  THEN BEGIN CurChar←32;Negative←TRUE;
 END  ELSE IF CurChar=43  THEN CurChar←32; IF CurChar#32--:63-- THEN EXIT; ENDLOOP;
WHILE( INT[CurChar]>=48)AND ( INT[CurChar]<=57)DO--64:
BEGIN Acc←Acc*10+CurChar-48;
IF Acc>=1024  THEN BEGIN BEGIN BEGIN IF  INT[CharsOnLine]>0  THEN {PascalWriteLongString[file: @Output, item: " "]
; PascalWriteLn[file: @Output]};PascalWriteLongString[file: @Output, item: "Real constants must be less than 1024"];ShowErrorContext[]; END;
DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;Acc←0;
CurChar←32; END  ELSE GetNext[]; END--:64-- ENDLOOP ;IntPart←Acc;Acc←0;
IF CurChar=46  THEN--66:--BEGIN J←0;GetNext[];
WHILE( INT[CurChar]>=48)AND ( INT[CurChar]<=57)DO BEGIN IF  INT[J]<7  THEN BEGIN J←J+1;
FractionDigits↑[J]←2097152*(CurChar-48); END;GetNext[]; END ENDLOOP ;Acc←0;
WHILE  INT[J]>0 DO BEGIN Acc←FractionDigits↑[J]+( Acc /10);J←J-1; END ENDLOOP ;
Acc← (Acc+10)/20; END--:66--;
IF(Acc>=1048576)AND (IntPart=1023) THEN BEGIN BEGIN IF  INT[CharsOnLine]>0
 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};PascalWriteLongString[file: @Output, item: "Real constants must be less than 1024"];
ShowErrorContext[]; END;
DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP;
 END  ELSE Acc←IntPart*1048576+Acc; END;
IF Negative  THEN GetFixResult←-Acc  ELSE GetFixResult←Acc; END;--:62----75:
 SortIn: PROCEDURE[H: Pointer,D: FixWord] RETURNS[SortInResult: Pointer] = 
BEGIN P:Pointer;
 IF(D=0)AND (H#1) THEN SortInResult←0  ELSE BEGIN P←H;
WHILE D>=Memory↑[Link↑[P]]DO P←Link↑[P] ENDLOOP ;
IF(D=Memory↑[P])AND (P#H) THEN SortInResult←P  ELSE IF MemPtr=1032  THEN BEGIN
BEGIN IF  INT[CharsOnLine]>0  THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};
PascalWriteLongString[file: @Output, item: "Memory overflow: more than 1028 widths, etc"];ShowErrorContext[];
 END;{PascalWriteLongString[file: @Output, item: "Congratulations! It's hard to make this error."]; PascalWriteLn[file: @Output]};
SortInResult←P; END  ELSE BEGIN MemPtr←MemPtr+1;Memory↑[MemPtr]←D;
Link↑[MemPtr]←Link↑[P];Link↑[P]←MemPtr;Memory↑[H]←Memory↑[H]+1;
SortInResult←MemPtr; END; END; END;--:75----77:-- MinCover: PROCEDURE[H: Pointer,
D: FixWord] RETURNS[MinCoverResult: PascalInteger] = 
BEGIN P:Pointer;L:FixWord;M:PascalInteger; M←0;
P←Link↑[H];NextD←Memory↑[0];WHILE P#0 DO BEGIN M←M+1;L←Memory↑[P];
WHILE Memory↑[Link↑[P]]<=L+D DO P←Link↑[P] ENDLOOP ;P←Link↑[P];
IF Memory↑[P]-L<NextD  THEN NextD←Memory↑[P]-L; END ENDLOOP ;MinCoverResult←M; END;
--:77----78:-- Shorten: PROCEDURE[H: Pointer,M: PascalInteger] RETURNS[ShortenResult: FixWord] = 
BEGIN D:FixWord;
K:PascalInteger; IF Memory↑[H]>M  THEN BEGIN K←MinCover[H,0];D←NextD;
DO D←D+D;K←MinCover[H,D]; IF K<=M THEN EXIT; ENDLOOP;D← PascalDIVPower2[D ,1];K←MinCover[H,D];
WHILE K>M DO BEGIN D←NextD;K←MinCover[H,D]; END ENDLOOP ;ShortenResult←D;
 END  ELSE ShortenResult←0; END;--:78----80:-- SetIndices: PROCEDURE[H: Pointer,
D: FixWord] = 
BEGIN P:Pointer;Q:Pointer;M:Byte;L:FixWord; Q←H;
P←Link↑[Q];M←0;WHILE P#0 DO BEGIN M←M+1;L←Memory↑[P];Index↑[P]←M;
WHILE Memory↑[Link↑[P]]<=L+D DO BEGIN P←Link↑[P];Index↑[P]←M; END ENDLOOP ;
Link↑[Q]←P;Memory↑[P]← PascalDIVPower2[(L+Memory↑[P]),1];Q←P;P←Link↑[P]; END ENDLOOP ;
Memory↑[H]←M; END;--:80----83:-- JunkError: PROCEDURE
 = 
BEGIN BEGIN IF  INT[CharsOnLine]>0  THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};
PascalWriteLongString[file: @Output, item: "There's junk here that is not in parentheses"];
ShowErrorContext[]; END;
DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;--:83----86:
 ReadFourBytes: PROCEDURE[L: HeaderIndex] = 
BEGIN GetFourBytes[];
HeaderBytes↑[L]←CurBytes.B0;HeaderBytes↑[L+1]←CurBytes.B1;
HeaderBytes↑[L+2]←CurBytes.B2;HeaderBytes↑[L+3]←CurBytes.B3; END;

END.