-- file: TexInteractionImpl.mesa -- Pascal-to-Mesa translator output, translated at September 27, 1985 10:21:37 am PDT DIRECTORY PascalBasic, PascalWizardFiles, TexTypes, TexInteraction, TexScan, TexSymbols, TexRest, TexSysdep; TexInteractionImpl: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, TexTypes, TexScan, TexSymbols, TexRest, TexSysdep EXPORTS TexInteraction = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, TexTypes, TexInteraction, TexScan, TexSymbols, TexRest, TexSysdep; --:13----20: Xord: LONG POINTER TO ARRAY PascalChar OF AsciiCode _ PascalStaticZone.NEW[ARRAY PascalChar OF AsciiCode]; Xchr: LONG POINTER TO ARRAY AsciiCode OF PascalChar _ PascalStaticZone.NEW[ARRAY AsciiCode OF PascalChar]; --:20----26: NameOfFile: LONG POINTER TO PACKED ARRAY PascalInteger[1..127] OF PascalChar _ PascalStaticZone.NEW[PACKED ARRAY PascalInteger[1..127] OF PascalChar]; NameLength: PascalInteger[0..FileNameSize]; --:26----30: Buffer: LONG POINTER TO ARRAY PascalInteger[0..7500] OF AsciiCode _ PascalStaticZone.NEW[ARRAY PascalInteger[0..7500] OF AsciiCode]; First: PascalInteger[0..BufSize]; Last: PascalInteger[0..BufSize]; MaxBufStack: PascalInteger[0..BufSize]; --:30----32:-- TermIn: AlphaFile; TermOut: AlphaFile; --:32----39: StrPool: LONG POINTER TO PACKED ARRAY PoolPointer OF AsciiCode _ PascalStaticZone.NEW[PACKED ARRAY PoolPointer OF AsciiCode]; StrStart: LONG POINTER TO ARRAY StrNumber OF PoolPointer _ PascalStaticZone.NEW[ARRAY StrNumber OF PoolPointer]; PoolPtr: PoolPointer; StrPtr: StrNumber; --:39----50:-- PoolFile: AlphaFile; --:50----54:-- LogFile: AlphaFile; Selector: PascalInteger[0..21]; Dig: LONG POINTER TO ARRAY PascalInteger[0..22] OF PascalInteger[0..15] _ PascalStaticZone.NEW[ARRAY PascalInteger[0..22] OF PascalInteger[0..15]]; Tally: PascalInteger; TermOffset: PascalInteger[0..MaxPrintLine]; FileOffset: PascalInteger[0..MaxPrintLine]; TrickBuf: LONG POINTER TO ARRAY PascalInteger[0..64] OF AsciiCode _ PascalStaticZone.NEW[ARRAY PascalInteger[0..64] OF AsciiCode]; TrickCount: PascalInteger; FirstCount: PascalInteger; --:54----73:-- Interaction: PascalInteger[0..3]; --:73----76: DeletionsAllowed: PascalBoolean; ErrorCount: PascalInteger[-1..100]; --:76----79: HelpLine: LONG POINTER TO ARRAY PascalInteger[0..5] OF StrNumber _ PascalStaticZone.NEW[ARRAY PascalInteger[0..5] OF StrNumber]; HelpPtr: PascalInteger[0..6]; --:79----96:-- Interrupt: PascalInteger; OkToInterrupt: PascalBoolean; --:96----104: ArithError: PascalBoolean; Remainder: Scaled; --:104----115:-- TempPtr: Halfword; --:513----514:-- TexArea: StrNumber; TexFontArea: StrNumber; PrintLn: PROCEDURE = BEGIN SELECT Selector FROM 19 =>BEGIN PascalWriteLn[file: @TermOut];PascalWriteLn[file: @LogFile]; TermOffset_0;FileOffset_0; END;18 =>BEGIN PascalWriteLn[file: @LogFile]; FileOffset_0; END;17 =>BEGIN PascalWriteLn[file: @TermOut];TermOffset_0; END; 16,20,21 => NULL; ENDCASE =>PascalWriteLn[file: @WriteFile^[Selector]]; END;--:57----58: PrintChar: PROCEDURE[S: AsciiCode] = BEGIN {IF--244: S=Eqtb^[4816].Int--:244-- THEN IF INT[Selector]<20 THEN BEGIN PrintLn[]; GOTO Label10; END;SELECT Selector FROM 19 =>BEGIN PascalWriteChar[file: @TermOut, item: Xchr^[S]]; PascalWriteChar[file: @LogFile, item: Xchr^[S]];TermOffset_TermOffset+1; FileOffset_FileOffset+1; IF TermOffset=MaxPrintLine THEN BEGIN PascalWriteLn[file: @TermOut]; TermOffset_0; END; IF FileOffset=MaxPrintLine THEN BEGIN PascalWriteLn[file: @LogFile]; FileOffset_0; END; END;18 =>BEGIN PascalWriteChar[file: @LogFile, item: Xchr^[S]]; FileOffset_FileOffset+1;IF FileOffset=MaxPrintLine THEN PrintLn[]; END;17 =>BEGIN PascalWriteChar[file: @TermOut, item: Xchr^[S]];TermOffset_TermOffset+1; IF TermOffset=MaxPrintLine THEN PrintLn[]; END;16 => NULL; 20 =>IF TallyBEGIN IF INT[PoolPtr]PascalWriteChar[file: @WriteFile^[Selector], item: Xchr^[S]];Tally_Tally+1;EXITS Label10 => NULL}; END; --:58----59:-- Print: PROCEDURE[S: PascalInteger] = BEGIN J:PoolPointer; {IF S>=StrPtr THEN S_131 ELSE IF S<128 THEN IF S<0 THEN S_131 ELSE IF(--244:--S=Eqtb^[4816].Int--:244 ) THEN IF INT[Selector]<20 THEN BEGIN PrintLn[]; GOTO Label10; END;J_StrStart^[S]; WHILE INT[J] NULL}; END;--:59----60:-- SlowPrint: PROCEDURE[S: PascalInteger] = BEGIN J:PoolPointer; {IF S>=StrPtr THEN S_131 ELSE IF S<128 THEN IF S<0 THEN S_131 ELSE IF(--244:--S=Eqtb^[4816].Int--:244 ) THEN IF INT[Selector]<20 THEN BEGIN PrintLn[]; GOTO Label10; END;J_StrStart^[S]; WHILE INT[J] NULL}; END; --:60----62:-- PrintNl: PROCEDURE[S: StrNumber] = BEGIN IF(( INT[TermOffset]>0)AND (PascalODD[Selector]))OR (( INT[FileOffset]>0)AND ( INT[Selector]>=18)) THEN PrintLn[];Print[S]; END;--:62----63: PrintEsc: PROCEDURE[S: StrNumber] = BEGIN C:PascalInteger;--243: C_Eqtb^[4812].Int--:243--;IF C>=0 THEN IF C<128 THEN Print[C];Print[S]; END;--:63----64:-- PrintDigs: PROCEDURE[K: EightBits] = BEGIN WHILE INT[K]>0 DO BEGIN K_K-1; IF INT[Dig^[K]]<10 THEN PrintChar[48+Dig^[K]] ELSE PrintChar[55+Dig^[K]]; END ENDLOOP ; END;--:64----65:-- PrintInt: PROCEDURE[N: PascalInteger] = BEGIN K:PascalInteger[0..23];M:PascalInteger; K_0;IF N<0 THEN BEGIN PrintChar[45]; IF N>-100000000 THEN N_-N ELSE BEGIN M_-1-N;N_ M /10; M_( M MOD 10)+1;K_1;IF M<10 THEN Dig^[0]_M ELSE BEGIN Dig^[0]_0;N_N+1; END; END; END;DO Dig^[K]_ N MOD 10;N_ N /10;K_K+1; IF N=0 THEN EXIT; ENDLOOP; PrintDigs[K]; END;--:65----262:----:78----81:-- JumpOut: PROCEDURE = BEGIN ERROR Error9998; END;--:81----82:-- Error: PROCEDURE = BEGIN C:AsciiCode;S1, S2, S3, S4:PascalInteger; IF INT[History]<2 THEN History_2; PrintChar[46];ShowContext[]; {IF Interaction=3 THEN BEGIN SetNormalPriority[];--83: WHILE TRUE DO BEGIN DO {--Label22:--ClearForErrorPrompt[];BEGIN Print[136]; TermInput[]; END;IF Last=First THEN GOTO Label10;C_Buffer^[First]; IF INT[C]>=97 THEN C_C-32;--84: SELECT C FROM 48,49,50,51,52,53,54,55,56,57 =>IF DeletionsAllowed THEN--88: BEGIN S1_CurTok;S2_CurCmd;S3_CurChr;S4_AlignState; AlignState_1000000;OkToInterrupt_FALSE; IF( INT[Last]>First+1)AND ( INT[Buffer^[First+1]]>=48)AND ( INT[Buffer^[First+1]]<=57) THEN C_ C*10+Buffer^[First+1]-48*11 ELSE C_C-48;WHILE INT[C]>0 DO BEGIN GetToken[]; C_C-1; END ENDLOOP ;CurTok_S1;CurCmd_S2;CurChr_S3;AlignState_S4; OkToInterrupt_TRUE;BEGIN HelpPtr_2;HelpLine^[1]_151; HelpLine^[0]_152; END;ShowContext[]; GOTO Label22; END--:88--;68 =>BEGIN DebugHelp[]; GOTO Label22; END;69 =>IF INT[BasePtr]>0 THEN BEGIN PrintNl[137]; Print[InputStack^[BasePtr].NameField];Print[138];PrintInt[Line]; Interaction_2;JumpOut[]; END;72 =>--89: BEGIN IF UseErrHelp THEN BEGIN GiveErrHelp[];UseErrHelp_FALSE; END ELSE BEGIN IF HelpPtr=0 THEN BEGIN HelpPtr_2;HelpLine^[1]_153; HelpLine^[0]_154; END;DO HelpPtr_HelpPtr-1; Print[HelpLine^[HelpPtr]];PrintLn[]; IF HelpPtr=0 THEN EXIT; ENDLOOP; END; BEGIN HelpPtr_4;HelpLine^[3]_155;HelpLine^[2]_154;HelpLine^[1]_156; HelpLine^[0]_157; END; GOTO Label22; END--:89--;73 =>--87:--BEGIN BeginFileReading[]; IF INT[Last]>First+1 THEN BEGIN CurInput.LocField_First+1; Buffer^[First]_32; END ELSE BEGIN BEGIN Print[150];TermInput[]; END; CurInput.LocField_First; END;First_Last; CurInput.LimitField_Last-1; GOTO Label10; END--:87--;81,82,83 =>--86: BEGIN ErrorCount_0;Interaction_0+C-81;Print[145]; SELECT C FROM 81 =>BEGIN PrintEsc[146];Selector_Selector-1; END; 82 =>PrintEsc[147];83 =>PrintEsc[148]; ENDCASE;Print[149];PrintLn[]; PascalTextBREAK[file: @TermOut]; GOTO Label10; END--:86--;88 =>BEGIN Interaction_2;JumpOut[]; END; ENDCASE => NULL;--85:--BEGIN Print[139];PrintNl[140];PrintNl[141]; IF INT[BasePtr]>0 THEN Print[142];IF DeletionsAllowed THEN PrintNl[143]; PrintNl[144]; END--:85----:84--;EXIT; EXITS Label22 => NULL} ENDLOOP; END--:83-- ENDLOOP ; END;ErrorCount_ErrorCount+1; IF ErrorCount=100 THEN BEGIN PrintNl[135];History_3;JumpOut[]; END; --90:--IF INT[Interaction]>0 THEN Selector_Selector-1; IF UseErrHelp THEN BEGIN PrintLn[];GiveErrHelp[]; END ELSE WHILE INT[HelpPtr]>0 DO BEGIN HelpPtr_HelpPtr-1; PrintNl[HelpLine^[HelpPtr]]; END ENDLOOP ;PrintLn[]; IF INT[Interaction]>0 THEN Selector_Selector+1;PrintLn--:90--[]; EXITS Label10 => NULL};SetBackgroundPriority[]; END;--:82----93: FatalError: PROCEDURE[S: StrNumber] = BEGIN NormalizeSelector[]; BEGIN IF Interaction=3 THEN NULL;PrintNl[134];Print[159]; END; BEGIN HelpPtr_1;HelpLine^[0]_S; END; BEGIN IF Interaction=3 THEN Interaction_2;Error[]; IF INT[Interaction]>0 THEN DebugHelp[];History_3;JumpOut[]; END; END;--:93----94: Overflow: PROCEDURE[S: StrNumber,N: PascalInteger] = BEGIN NormalizeSelector[]; BEGIN IF Interaction=3 THEN NULL;PrintNl[134];Print[160]; END;Print[S]; PrintChar[61];PrintInt[N];PrintChar[93];BEGIN HelpPtr_2; HelpLine^[1]_161;HelpLine^[0]_162; END; BEGIN IF Interaction=3 THEN Interaction_2;Error[]; IF INT[Interaction]>0 THEN DebugHelp[];History_3;JumpOut[]; END; END;--:94----95: Confusion: PROCEDURE[S: StrNumber] = BEGIN NormalizeSelector[]; IF INT[History]<2 THEN BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[134]; Print[163]; END;Print[S];PrintChar[41];BEGIN HelpPtr_1; HelpLine^[0]_164; END; END ELSE BEGIN BEGIN IF Interaction=3 THEN NULL; PrintNl[134];Print[165]; END;BEGIN HelpPtr_2;HelpLine^[1]_166; HelpLine^[0]_167; END; END;BEGIN IF Interaction=3 THEN Interaction_2; Error[];IF INT[Interaction]>0 THEN DebugHelp[];History_3;JumpOut[]; END; END;--:95 --:28----31: 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;--:31----37:----:37----43:-- MakeString: PROCEDURE RETURNS[MakeStringResult: StrNumber] = BEGIN IF StrPtr=MaxStrings THEN Overflow[130,MaxStrings-InitStrPtr] ;StrPtr_StrPtr+1;StrStart^[StrPtr]_PoolPtr;MakeStringResult_StrPtr-1; END;--:43----45:-- StrEqBuf: PROCEDURE[S: StrNumber,K: PascalInteger] RETURNS[StrEqBufResult: PascalBoolean] = BEGIN J:PoolPointer;Result:PascalBoolean; J_StrStart^[S]; {WHILE INT[J] NULL};StrEqBufResult_Result; END;--:45----46: StrEqStr: PROCEDURE[S,T: StrNumber] RETURNS[StrEqStrResult: PascalBoolean] = BEGIN J, K:PoolPointer;Result:PascalBoolean; Result_FALSE; {IF( INT[StrStart^[S+1]]-StrStart^[S])#( INT[StrStart^[T+1]]-StrStart^[T]) THEN GOTO Label45;J_StrStart^[S];K_StrStart^[T]; WHILE INT[J] NULL};StrEqStrResult_Result; END;--:46----47: PrintTwo: PROCEDURE[N: PascalInteger] = BEGIN N_ ABS[N]MOD 100; PrintChar[48+( N /10)];PrintChar[48+( N MOD 10)]; END;--:66----67: PrintHex: PROCEDURE[N: PascalInteger] = BEGIN K:PascalInteger[0..22]; K_0;PrintChar[34]; DO Dig^[K]_ PascalMODPower2Mask[N ,15];N_ PascalDIVPower2[N ,4];K_K+1; IF N=0 THEN EXIT; ENDLOOP;PrintDigs[K]; END; --:67----68:-- PrintAscii: PROCEDURE[C: PascalInteger] = BEGIN IF(C>=0)AND (C<=127) THEN Print[C] ELSE BEGIN PrintChar[91]; IF C<0 THEN PrintInt[C] ELSE PrintHex[C];PrintChar[93]; END; END;--:68 --69:-- PrintRomanInt: PROCEDURE[N: PascalInteger] = BEGIN J, K:PoolPointer; U, V:NonnegativeInteger; J_StrStart^[132];V_1000; {WHILE TRUE DO BEGIN WHILE N>=V DO BEGIN PrintChar[StrPool^[J]];N_N-V; END ENDLOOP ;IF N<=0 THEN GOTO Label10;K_J+2;U_V /(StrPool^[ INT[K]-1]-48); IF StrPool^[ INT[K]-1]=50 THEN BEGIN K_K+2;U_U /(StrPool^[ INT[K]-1]-48); END; IF N+U>=V THEN BEGIN PrintChar[StrPool^[K]];N_N+U; END ELSE BEGIN J_J+2;V_V /(StrPool^[ INT[J]-1]-48); END; END ENDLOOP ;EXITS Label10 => NULL}; END;--:69 --70:-- PrintCurrentString: PROCEDURE = BEGIN J:PoolPointer; J_StrStart^[StrPtr]; WHILE INT[J]0 DO BEGIN K_K-1;A_ (A+Dig^[K]*131072)/10; END ENDLOOP ; RoundDecimalsResult_ PascalDIVPower2[(A+1),1]; END;--:102----103: PrintScaled: PROCEDURE[S: Scaled] = BEGIN Delta:Scaled; IF S<0 THEN BEGIN PrintChar[45];S_-S; END;PrintInt[ PascalDIVPower2[S ,16]]; PrintChar[46];S_10*( PascalMODPower2Mask[S ,65535])+5;Delta_10; DO IF Delta>65536 THEN S_S+32768-( PascalDIVPower2[Delta ,1]); PrintChar[48+( PascalDIVPower2[S ,16])];S_10*( PascalMODPower2Mask[S ,65535]);Delta_Delta*10; IF S<=Delta THEN EXIT; ENDLOOP; END;--:103----105:-- NxPlusY: PROCEDURE[N: PascalInteger, X,Y: Scaled] RETURNS[NxPlusYResult: Scaled] = BEGIN IF N<0 THEN BEGIN X_-X;N_-N; END; IF N=0 THEN NxPlusYResult_Y ELSE IF(( X<=(1073741823-Y)/N)AND ( -X<=( 1073741823+Y)/N)) THEN NxPlusYResult_N*X+Y ELSE BEGIN ArithError_TRUE; NxPlusYResult_0; END; END;--:105----106:-- XOverN: PROCEDURE[X: Scaled, N: PascalInteger] RETURNS[XOverNResult: Scaled] = BEGIN Negative:PascalBoolean; Negative_FALSE; IF N=0 THEN BEGIN ArithError_TRUE;XOverNResult_0;Remainder_X; END ELSE BEGIN IF N<0 THEN BEGIN X_-X;N_-N;Negative_TRUE; END; IF X>=0 THEN BEGIN XOverNResult_ X /N;Remainder_ X MOD N; END ELSE BEGIN XOverNResult_-( (-X)/N);Remainder_-( (-X)MOD N); END; END; IF Negative THEN Remainder_-Remainder; END;--:106----107: XnOverD: PROCEDURE[X: Scaled,N,D: PascalInteger] RETURNS[XnOverDResult: Scaled] = BEGIN Positive:PascalBoolean; T, U, V:NonnegativeInteger; IF X>=0 THEN Positive_TRUE ELSE BEGIN X_-X;Positive_FALSE; END; T_( PascalMODPower2Mask[X ,32767])*N;U_( PascalDIVPower2[X ,15])*N+( PascalDIVPower2[T ,15]); V_( U MOD D)*32768+( PascalMODPower2Mask[T ,32767]); IF U /D>=32768 THEN ArithError_TRUE ELSE U_32768*( U /D)+( V /D);IF Positive THEN BEGIN XnOverDResult_U;Remainder_ V MOD D; END ELSE BEGIN XnOverDResult_-U;Remainder_-( V MOD D); END; END;--:107----108: Badness: PROCEDURE[T,S: Scaled] RETURNS[BadnessResult: Halfword] = BEGIN R:PascalInteger; IF T=0 THEN BadnessResult_0 ELSE IF S<=0 THEN BadnessResult_10000 ELSE BEGIN IF T<=7230584 THEN R_ (T*297)/S ELSE IF S>=1663497 THEN R_T /( S /297) ELSE R_T; IF R>1290 THEN BadnessResult_10000 ELSE BadnessResult_ PascalDIVPower2[(R*R*R+131072),18]; END; END;--:108----114:-- PrintWord: PROCEDURE[W: MemoryWord] = BEGIN PrintInt[W.Int];PrintChar[32];PrintScaled[W.Int]; PrintChar[32];PrintScaled[PascalROUND[PascalFLOAT[65536]*W.Gr]];PrintLn[]; PrintInt[W.Hh.Lh];PrintChar[61];PrintInt[W.Hh.B0];PrintChar[58]; PrintInt[W.Hh.B1];PrintChar[59];PrintInt[W.Hh.Rh];PrintChar[32]; PrintInt[W.Qqqq.B0];PrintChar[58];PrintInt[W.Qqqq.B1];PrintChar[58]; PrintInt[W.Qqqq.B2];PrintChar[58];PrintInt[W.Qqqq.B3]; END;--:114 --:363----365:-- GetToken: PROCEDURE = BEGIN NoNewControlSequence_FALSE; GetNext[];NoNewControlSequence_TRUE; IF CurCs=0 THEN CurTok_ INT[(CurCmd*256)]+CurChr ELSE CurTok_ INT[4096]+CurCs; END;--:365----366:----389:-- END.