-- 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]-LM 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.