-- file: PLtoTF2Impl.mesa -- Pascal-to-Mesa translator output, translated at September 23, 1986 1:41:45 pm PDT DIRECTORY PascalBasic, PascalWizardFiles, PLtoTFPrivate, PLtoTFExternals; PLtoTF2Impl: PROGRAM IMPORTS PascalWizardFiles, PLtoTFPrivate EXPORTS PLtoTFPrivate = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, PLtoTFPrivate, PLtoTFExternals; SkipToEndOfItem: PROCEDURE = BEGIN L:PascalInteger; L_Level; WHILE Level>=L DO BEGIN WHILE Loc=Limit DO FillBuffer[] ENDLOOP ;Loc_Loc+1; IF Buffer^[Loc]=') THEN Level_Level-1 ELSE IF Buffer^[Loc]='( THEN Level _Level+1; END ENDLOOP ; IF InputHasEnded THEN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "File ended unexpectedly: No closing \")\""];ShowErrorContext[]; END; CurChar_32; END;--:33----35:-- FinishTheProperty: PROCEDURE = BEGIN WHILE CurChar=32 DO GetNext[] ENDLOOP ; IF CurChar#41 THEN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "Junk after property value will be ignored"];ShowErrorContext[]; END;SkipToEndOfItem[]; END;--:35----42:-- Lookup: PROCEDURE = BEGIN K:PascalInteger[0..20]; J:PascalInteger[0..500];NotFound:PascalBoolean;--43:--CurHash_CurName^[1]; FOR i:INT IN [ INT[2 ].. INT[NameLength ]] DO K _ i; CurHash_ (CurHash+CurHash+CurName^[K])MOD 101--:43-- ENDLOOP;NotFound_TRUE; WHILE NotFound DO BEGIN IF CurHash=0 THEN CurHash_100 ELSE CurHash _CurHash-1; IF Hash^[CurHash]=0 THEN NotFound_FALSE ELSE BEGIN J_Start^[Hash^ [CurHash]]; IF Start^[Hash^[CurHash]+1]=J+NameLength THEN BEGIN NotFound_FALSE; FOR i:INT IN [ INT[1 ].. INT[NameLength ]] DO K _ i; IF Dictionary^[J+K-1]#CurName^[K] THEN NotFound_TRUE ENDLOOP; END; END; END ENDLOOP ;NamePtr_Hash^[CurHash]; END;--:42----45: EnterName: PROCEDURE[V: Byte] = BEGIN K:PascalInteger[0..20]; FOR i:INT IN [ INT[1 ].. INT[NameLength ]] DO K _ i; CurName^[K]_CurName^[K+20-NameLength] ENDLOOP;Lookup[];Hash^[CurHash]_StartPtr;Equiv^[StartPtr]_V; FOR i:INT IN [ INT[1 ].. INT[NameLength ]] DO K _ i; Dictionary^[DictPtr]_CurName^[K]; DictPtr_DictPtr+1; ENDLOOP;StartPtr_StartPtr+1; Start^[StartPtr]_DictPtr; END;--:45----49:-- GetName: PROCEDURE = BEGIN Loc_Loc+1;Level_Level+1;CurChar_32; WHILE CurChar=32 DO GetNext[] ENDLOOP ; IF( INT[CurChar]>41)OR ( INT[CurChar]<40) THEN Loc_Loc-1;NameLength_0; GetLetterOrDigit[]; WHILE CurChar#32 DO BEGIN IF NameLength=20 THEN CurName^[1]_88 ELSE NameLength_NameLength+1;CurName^[NameLength]_CurChar; GetLetterOrDigit[]; END ENDLOOP ;Lookup[]; IF NamePtr=0 THEN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "Sorry, I don't know that property name"];ShowErrorContext[]; END; CurCode_Equiv^[NamePtr]; END;--:49----51:-- GetByte: PROCEDURE RETURNS[GetByteResult: Byte] = BEGIN Acc:PascalInteger;T:AsciiCode; DO GetNext[]; IF CurChar#32 THEN EXIT; ENDLOOP; T_CurChar;Acc_0;DO GetNext[]; IF CurChar#32 THEN EXIT; ENDLOOP;IF T=67 THEN--52: IF( INT[CurChar]>=33)AND ( INT[CurChar]<=126)AND (( INT[CurChar]<40)OR ( INT[CurChar]>41)) THEN Acc_Xord^[Buffer^[Loc]] ELSE BEGIN BEGIN IF INT[CharsOnLine]>0 THEN { PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};PascalWriteLongString[file: @Output, item: "\"C\" value must be standard ASCII and not a paren"]; ShowErrorContext[]; END; DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END--:52 ELSE IF T=68 THEN--53: BEGIN WHILE( INT[CurChar]>=48)AND ( INT[CurChar]<=57)DO BEGIN Acc_Acc*10+CurChar -48; IF Acc>255 THEN BEGIN BEGIN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "This value shouldn't exceed 255"];ShowErrorContext[]; END; DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;Acc_0; CurChar_32; END ELSE GetNext[]; END ENDLOOP ; BEGIN IF( INT[CurChar]>41)OR ( INT[CurChar]<40) THEN Loc_Loc-1; END; END--:53 ELSE IF T=79 THEN--54: BEGIN WHILE( INT[CurChar]>=48)AND ( INT[CurChar]<=55)DO BEGIN Acc_Acc*8+CurChar -48; IF Acc>255 THEN BEGIN BEGIN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "This value shouldn't exceed '377"];ShowErrorContext[]; END; DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;Acc_0; CurChar_32; END ELSE GetNext[]; END ENDLOOP ; BEGIN IF( INT[CurChar]>41)OR ( INT[CurChar]<40) THEN Loc_Loc-1; END; END--:54 ELSE IF T=72 THEN--55: BEGIN WHILE(( INT[CurChar]>=48)AND ( INT[CurChar]<=57))OR (( INT[CurChar]>=65)AND ( INT[CurChar]<=70))DO BEGIN IF INT[CurChar]>=65 THEN CurChar_CurChar-7; Acc_Acc*16+CurChar-48; IF Acc>255 THEN BEGIN BEGIN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "This value shouldn't exceed \"FF"];ShowErrorContext[]; END; DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;Acc_0; CurChar_32; END ELSE GetNext[]; END ENDLOOP ; BEGIN IF( INT[CurChar]>41)OR ( INT[CurChar]<40) THEN Loc_Loc-1; END; END--:55 ELSE IF T=70 THEN--56: BEGIN IF CurChar=66 THEN Acc_2 ELSE IF CurChar=76 THEN Acc_4 ELSE IF CurChar#77 THEN Acc_18;GetNext[]; IF CurChar=73 THEN Acc_Acc+1 ELSE IF CurChar#82 THEN Acc_18; GetNext[]; IF CurChar=67 THEN Acc_Acc+6 ELSE IF CurChar=69 THEN Acc_Acc+12 ELSE IF CurChar#82 THEN Acc_18; IF Acc>=18 THEN BEGIN BEGIN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "Illegal face code, I changed it to MRR"];ShowErrorContext[]; END; DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;Acc_0; END; END--:56-- ELSE BEGIN BEGIN IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; PascalWriteLongString[file: @Output, item: "You need \"C\" or \"D\" or \"O\" or \"H\" or \"F\" here"]; ShowErrorContext[]; END; DO GetNext []; IF(CurChar=40)OR (CurChar=41) THEN EXIT; ENDLOOP; END;CurChar_32; GetByteResult_Acc; END;--:51----59:-- END.