-- file: TangleProduce.mesa -- Pascal-to-Mesa translator output, translated at September 23, 1986 11:39:50 am PDT DIRECTORY PascalBasic, PascalWizardFiles, TanglePrivate; TangleProduce: PROGRAM IMPORTS PascalWizardFiles, TanglePrivate EXPORTS TanglePrivate = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, TanglePrivate; FlushBuffer: PROCEDURE = BEGIN K:PascalInteger[0..OutBufSize];B:PascalInteger[0..OutBufSize]; B_BreakPtr; IF(SemiPtr#0)AND ( INT[OutPtr-SemiPtr]<=LineLength) THEN BreakPtr_ SemiPtr;FOR i:INT IN [ INT[1 ].. INT[BreakPtr ]] DO K _ i; PascalWriteChar[file: @PascalFile, item: Xchr^[OutBuf^[K-1]]] ENDLOOP; PascalWriteLn[file: @PascalFile];Line_Line+1; IF Line MOD 100=0 THEN BEGIN PascalWriteLongString[file: @TermOut, item: "."]; IF Line MOD 500=0 THEN PascalWriteInteger[file: @TermOut, item: Line, fieldMinLength: 1];PascalTextBREAK[file: @TermOut]; END; IF INT[BreakPtr]B THEN B_BreakPtr; END; FOR i:INT IN [ INT[BreakPtr ].. INT[OutPtr-1 ]] DO K _ i; OutBuf^[K-BreakPtr]_OutBuf^[K] ENDLOOP; END; OutPtr_OutPtr-BreakPtr;BreakPtr_B-BreakPtr;SemiPtr_0; IF INT[OutPtr]>LineLength THEN BEGIN BEGIN PascalWriteLn[file: @TermOut]; PascalWriteLongString[file: @TermOut, item: "! Long line must be truncated"];Error[]; END; OutPtr_LineLength; END; END;--:97----99:-- AppVal: PROCEDURE[V: PascalInteger] = BEGIN K:PascalInteger[0..OutBufSize]; K_OutBufSize;DO OutBuf^[K]_ V MOD 10; V_ V /10;K_K-1; IF V=0 THEN EXIT; ENDLOOP;DO K_K+1; BEGIN OutBuf^[OutPtr]_OutBuf^[K]+48;OutPtr_OutPtr+1; END; IF K=OutBufSize THEN EXIT; ENDLOOP; END;--:99----101:-- SendOut: PROCEDURE[T: EightBits, V: SixteenBits] = BEGIN K:PascalInteger[0..LineLength];--102: DO {--Label20:--SELECT OutState FROM 1 =>IF T#3 THEN BEGIN BreakPtr_OutPtr; IF T=2 THEN BEGIN OutBuf^[OutPtr]_32;OutPtr_OutPtr+1; END; END; 2 =>BEGIN BEGIN OutBuf^[OutPtr]_44-OutApp;OutPtr_OutPtr+1; END; IF INT[OutPtr]>LineLength THEN FlushBuffer[];BreakPtr_OutPtr; END; 3,4 =>BEGIN--103: IF(OutVal<0)OR ((OutVal=0)AND ( INT[LastSign]<0)) THEN BEGIN OutBuf^[OutPtr] _45;OutPtr_OutPtr+1; END ELSE IF INT[OutSign]>0 THEN BEGIN OutBuf^[OutPtr]_OutSign; OutPtr_OutPtr+1; END;AppVal[ABS[OutVal]]; IF INT[OutPtr]>LineLength THEN FlushBuffer[];--:103--OutState_OutState-2; GOTO Label20; END;5 =>--104:--BEGIN IF(T=3)OR (--105: ((T=2)AND (V=3)AND (((OutContrib^[1]=68)AND (OutContrib^[2]=73)AND ( OutContrib^[3]=86))OR ((OutContrib^[1]=77)AND (OutContrib^[2]=79)AND ( OutContrib^[3]=68))))OR ((T=0)AND ((V=42)OR (V=47)))--:105--) THEN BEGIN--103: IF(OutVal<0)OR ((OutVal=0)AND ( INT[LastSign]<0)) THEN BEGIN OutBuf^[OutPtr] _45;OutPtr_OutPtr+1; END ELSE IF INT[OutSign]>0 THEN BEGIN OutBuf^[OutPtr]_OutSign; OutPtr_OutPtr+1; END;AppVal[ABS[OutVal]]; IF INT[OutPtr]>LineLength THEN FlushBuffer[];--:103--OutSign_43; OutVal_OutApp; END ELSE OutVal_OutVal+OutApp;OutState_3; GOTO Label20; END--:104--;0 =>IF T#3 THEN BreakPtr_OutPtr; ENDCASE => NULL--:102--; IF T#0 THEN FOR i:INT IN [ INT[1 ].. INT[V ]] DO K _ i; OutBuf^[OutPtr]_OutContrib^[K]; OutPtr_OutPtr+1; ENDLOOP ELSE BEGIN OutBuf^[OutPtr]_V; OutPtr_OutPtr+1; END;IF INT[OutPtr]>LineLength THEN FlushBuffer[]; IF(T=0)AND ((V=59)OR (V=125)) THEN BEGIN SemiPtr_OutPtr; BreakPtr_OutPtr; END;IF INT[T]>=2 THEN OutState_1 ELSE OutState_0 ;EXIT; EXITS Label20 => NULL} ENDLOOP; END; --:101----106:-- SendSign: PROCEDURE[V: PascalInteger] = BEGIN SELECT OutState FROM 2,4 =>OutApp_OutApp*V;3 =>BEGIN OutApp_V; OutState_4; END;5 =>BEGIN OutVal_OutVal+OutApp;OutApp_V; OutState_4; END; ENDCASE =>BEGIN BreakPtr_OutPtr;OutApp_V; OutState_2; END ;LastSign_OutApp; END;--:106----107: SendVal: PROCEDURE[V: PascalInteger] = BEGIN {{SELECT OutState FROM 1 =>BEGIN--110: IF(OutPtr=BreakPtr+3)OR ((OutPtr=BreakPtr+4)AND (OutBuf^[BreakPtr]=32 )) THEN IF((OutBuf^[OutPtr-3]=68)AND (OutBuf^[OutPtr-2]=73)AND (OutBuf^ [OutPtr-1]=86))OR ((OutBuf^[OutPtr-3]=77)AND (OutBuf^[OutPtr-2]=79)AND ( OutBuf^[OutPtr-1]=68)) THEN GOTO Label666--:110--;OutSign_32;OutState_3; OutVal_V;BreakPtr_OutPtr;LastSign_1; END;0 =>BEGIN--109: IF(OutPtr=BreakPtr+1)AND ((OutBuf^[BreakPtr]=42)OR ( OutBuf^[BreakPtr]=47)) THEN GOTO Label666--:109--;OutSign_0;OutState_3;OutVal_V; BreakPtr_OutPtr;LastSign_1; END;--108:--2 =>BEGIN OutSign_43; OutState_3;OutVal_OutApp*V; END;3 =>BEGIN OutState_5;OutApp_V; BEGIN PascalWriteLn[file: @TermOut]; PascalWriteLongString[file: @TermOut, item: "! Two numbers occurred without a sign between them"]; Error[]; END; END;4 =>BEGIN OutState_5;OutApp_OutApp*V; END; 5 =>BEGIN OutVal_OutVal+OutApp;OutApp_V;BEGIN PascalWriteLn[file: @TermOut]; PascalWriteLongString[file: @TermOut, item: "! Two numbers occurred without a sign between them"]; Error[]; END; END;--:108-- ENDCASE => GOTO Label666 ; GOTO Label10;EXITS Label666 => NULL};--111: IF V>=0 THEN BEGIN IF OutState=1 THEN BEGIN BreakPtr_OutPtr; BEGIN OutBuf^[OutPtr]_32;OutPtr_OutPtr+1; END; END;AppVal[V]; IF INT[OutPtr]>LineLength THEN FlushBuffer[];OutState_1; END ELSE BEGIN BEGIN OutBuf^[OutPtr]_40;OutPtr_OutPtr+1; END; BEGIN OutBuf^[OutPtr]_45;OutPtr_OutPtr+1; END;AppVal[-V]; BEGIN OutBuf^[OutPtr]_41;OutPtr_OutPtr+1; END; IF INT[OutPtr]>LineLength THEN FlushBuffer[];OutState_0; END--:111--;EXITS Label10 => NULL}; END; END.