-- file: MFEnvelopesImpl1.mesa -- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:01 pm PST DIRECTORY PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFOctants, MFContours, MFEnvelopes, MFParsing; MFEnvelopesImpl1: PROGRAM IMPORTS PascalBasic, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFOctants, MFContours, MFParsing EXPORTS MFEnvelopes = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFOctants, MFContours, MFEnvelopes, MFParsing; --:464----507:--EnvMove: LONG POINTER TO ARRAY PascalInteger[0..5000] OF PascalInteger _ PascalStaticZone.NEW[ARRAY PascalInteger[0..5000] OF PascalInteger]; PrintPen: PROCEDURE[P: Halfword, S: StrNumber,Nuline: PascalBoolean] = BEGIN NothingPrinted:PascalBoolean;K:PascalInteger[1..8]; H:Halfword;M, N:PascalInteger;W, Ww:Halfword; PrintDiagnostic[437,S,Nuline];NothingPrinted_TRUE;PrintLn[]; FOR i:INT IN [ INT[1 ].. INT[8 ]] DO K _ i; Octant_OctantCode^[K];H_ INT[P]+Octant; N_Mem[H]^.Hh.Lh;W_Mem[H]^.Hh.Rh;IF NOT PascalODD[K] THEN W_Mem[W]^.Hh.Lh; FOR i:INT IN [ INT[1 ].. INT[N+1 ]] DO M _ i; IF PascalODD[K] THEN Ww_Mem[W]^.Hh.Rh ELSE Ww_Mem[W]^. Hh.Lh; IF(Mem[ INT[Ww]+1]^.Int#Mem[ INT[W]+1]^.Int)OR (Mem[ INT[Ww]+2]^.Int#Mem[ INT[W]+2]^.Int) THEN--474: BEGIN IF NothingPrinted THEN NothingPrinted_FALSE ELSE PrintNl[439]; Unskew[Mem[ INT[Ww]+1]^.Int,Mem[ INT[Ww]+2]^.Int,Octant];PrintTwo[CurX,CurY]; END--:474--;W_Ww; ENDLOOP; ENDLOOP;IF NothingPrinted THEN BEGIN W_Mem[ INT[P]+1]^.Hh.Rh; PrintTwo[Mem[ INT[W]+1]^.Int+Mem[ INT[W]+2]^.Int,Mem[ INT[W]+2]^.Int]; END;PrintNl[438]; EndDiagnostic[TRUE]; END;--:473----588: TossPen: PROCEDURE[P: Halfword] = BEGIN K:PascalInteger[1..8];W, Ww:Halfword; IF P#3 THEN BEGIN FOR i:INT IN [ INT[1 ].. INT[8 ]] DO K _ i; W_Mem[ INT[P]+K]^.Hh.Rh; DO Ww_Mem[W]^.Hh.Rh;FreeNode[W,3];W_Ww; IF W=Mem[ INT[P]+K]^.Hh.Rh THEN EXIT; ENDLOOP; ENDLOOP; FreeNode[P,10]; END; END;--:487----619:-- EndRound: PROCEDURE[X,Y: Scaled] = BEGIN Y_Y+32768-YCorr^[Octant];X_X+Y-XCorr^[Octant]; M1_FloorUnscaled[X];N1_FloorUnscaled[Y]; IF X-65536*M1>=Y-65536*N1+ZCorr^[Octant] THEN D1_1 ELSE D1_0; END;--:463 --476:-- DupOffset: PROCEDURE[W: Halfword] = BEGIN R:Halfword; R_GetNode[3];Mem[ INT[R]+1]^.Int_Mem[ INT[W]+1]^.Int; Mem[ INT[R]+2]^.Int_Mem[ INT[W]+2]^.Int;Mem[R]^.Hh.Rh_Mem[W]^.Hh.Rh; Mem[Mem[W]^.Hh.Rh]^.Hh.Lh_R;Mem[R]^.Hh.Lh_W;Mem[W]^.Hh.Rh_R; END;--:476 --477:-- MakePen: PROCEDURE[H: Halfword] RETURNS[MakePenResult: Halfword] = BEGIN O, Oo, K:SmallNumber;P:Halfword;Q, R, S, W, Hh:Halfword;N:PascalInteger; Dx, Dy:Scaled;Mc:Scaled;--479:--Q_H;R_Mem[Q]^.Hh.Rh; Mc_ABS[Mem[ INT[H]+1]^.Int];{{IF Q=R THEN BEGIN Hh_H;Mem[H]^.Hh.B1_0; IF Mc0 THEN Octant_1 ELSE IF Dx=0 THEN IF Dy>0 THEN Octant_1 ELSE Octant_2 ELSE BEGIN Dx_-Dx;Octant_2; END;IF Dy<0 THEN BEGIN Dy_-Dy; Octant_Octant+2; END ELSE IF Dy=0 THEN IF INT[Octant]>1 THEN Octant_4; IF DxOo THEN BEGIN IF Hh#0 THEN GOTO Label45; Hh_Q; END;O_Oo;IF(Q=H)AND (Hh#0) THEN GOTO Label30;Q_R;R_S; END ENDLOOP ;EXITS Label30 => NULL}; END--:479 ;IF Mc>=268402688 THEN GOTO Label45;P_GetNode[10];Q_Hh;Mem[ INT[P]+9]^.Int_Mc; Mem[P]^.Hh.Lh_0;IF Mem[Q]^.Hh.Rh#Q THEN Mem[P]^.Hh.Rh_1; FOR i:INT IN [ INT[1 ].. INT[8 ]] DO --481:--K _ i; Octant_OctantCode^[K];N_0;H_ INT[P]+Octant; {WHILE TRUE DO BEGIN R_GetNode[3]; Skew[Mem[ INT[Q]+1]^.Int,Mem[ INT[Q]+2]^.Int,Octant];Mem[ INT[R]+1]^.Int_CurX; Mem[ INT[R]+2]^.Int_CurY;IF N=0 THEN Mem[H]^.Hh.Rh_R ELSE--482: IF PascalODD[K] THEN BEGIN Mem[W]^.Hh.Rh_R;Mem[R]^.Hh.Lh_W; END ELSE BEGIN Mem[W]^.Hh.Lh_R;Mem[R]^.Hh.Rh_W; END--:482--;W_R; IF Mem[Q]^.Hh.B1#Octant THEN GOTO Label31;Q_Mem[Q]^.Hh.Rh;N_N+1; END ENDLOOP ; EXITS Label31 => NULL};--483:--R_Mem[H]^.Hh.Rh;IF PascalODD[K] THEN BEGIN Mem[W]^.Hh.Rh_R; Mem[R]^.Hh.Lh_W; END ELSE BEGIN Mem[W]^.Hh.Lh_R;Mem[R]^.Hh.Rh_W; Mem[H]^.Hh.Rh_W;R_W; END; IF(Mem[ INT[R]+2]^.Int#Mem[ INT[Mem[R]^.Hh.Rh]+2]^.Int)OR (N=0) THEN BEGIN DupOffset[R] ;N_N+1; END;R_Mem[R]^.Hh.Lh; IF Mem[ INT[R]+1]^.Int#Mem[ INT[Mem[R]^.Hh.Lh]+1]^.Int THEN DupOffset[R] ELSE N_N-1--: -- 483--;IF N>=255 THEN Overflow[447,255];Mem[H]^.Hh.Lh_N;--:481-- ENDLOOP; GOTO Label40; EXITS Label45 => NULL};P_3;--478:--IF Mc>=268402688 THEN BEGIN BEGIN IF Interaction=3 THEN NULL; PrintNl[133];Print[441]; END;BEGIN HelpPtr_2;HelpLine^[1]_442; HelpLine^[0]_443; END; END ELSE BEGIN BEGIN IF Interaction=3 THEN NULL; PrintNl[133];Print[444]; END;BEGIN HelpPtr_3;HelpLine^[2]_445; HelpLine^[1]_446;HelpLine^[0]_443; END; END;PutGetError--:478--[]; EXITS Label40 => NULL};IF Internal^[6]>0 THEN PrintPen[P,440,TRUE];MakePenResult_P; END;--:477 --484:----486:-- TrivialKnot: PROCEDURE[X,Y: Scaled] RETURNS[TrivialKnotResult: Halfword] = BEGIN P:Halfword; P_GetNode[7];Mem[P]^.Hh.B0_1;Mem[P]^.Hh.B1_1;Mem[ INT[P]+1]^.Int_X; Mem[ INT[P]+3]^.Int_X;Mem[ INT[P]+5]^.Int_X;Mem[ INT[P]+2]^.Int_Y;Mem[ INT[P]+4]^.Int_Y; Mem[ INT[P]+6]^.Int_Y;TrivialKnotResult_P; END;--:486 MakePath: PROCEDURE[PenHead: Halfword] RETURNS[MakePathResult: Halfword] = BEGIN P:Halfword;K:PascalInteger[1..8]; H:Halfword;M, N:PascalInteger;W, Ww:Halfword; P_49999; FOR i:INT IN [ INT[1 ].. INT[8 ]] DO K _ i; Octant_OctantCode^[K];H_ INT[PenHead]+Octant; N_Mem[H]^.Hh.Lh;W_Mem[H]^.Hh.Rh;IF NOT PascalODD[K] THEN W_Mem[W]^.Hh.Lh; FOR i:INT IN [ INT[1 ].. INT[N+1 ]] DO M _ i; IF PascalODD[K] THEN Ww_Mem[W]^.Hh.Rh ELSE Ww_Mem[W]^. Hh.Lh; IF(Mem[ INT[Ww]+1]^.Int#Mem[ INT[W]+1]^.Int)OR (Mem[ INT[Ww]+2]^.Int#Mem[ INT[W]+2]^.Int) THEN--485: BEGIN Unskew[Mem[ INT[Ww]+1]^.Int,Mem[ INT[Ww]+2]^.Int,Octant]; Mem[P]^.Hh.Rh_TrivialKnot[CurX,CurY];P_Mem[P]^.Hh.Rh; END--:485--;W_Ww; ENDLOOP; ENDLOOP;IF P=49999 THEN BEGIN W_Mem[ INT[PenHead]+1]^.Hh.Rh; P_TrivialKnot[Mem[ INT[W]+1]^.Int+Mem[ INT[W]+2]^.Int,Mem[ INT[W]+2]^.Int]; Mem[49999]^.Hh.Rh_P; END;Mem[P]^.Hh.Rh_Mem[49999]^.Hh.Rh; MakePathResult_Mem[49999]^.Hh.Rh; END;--:484----488: FindOffset: PROCEDURE[X,Y: Scaled,P: Halfword] = BEGIN Octant:PascalInteger[1..8];S:PascalInteger[-1..1];N:PascalInteger;H, W, Ww:Halfword;--489: {IF X>0 THEN Octant_1 ELSE IF X=0 THEN IF Y<=0 THEN IF Y=0 THEN BEGIN CurX_0;CurY_0; GOTO Label10; END ELSE Octant_2 ELSE Octant_1 ELSE BEGIN X_-X; IF Y=0 THEN Octant_4 ELSE Octant_2; END; IF Y<0 THEN BEGIN Octant_Octant+2;Y_-Y; END; IF X>=Y THEN X_X-Y ELSE BEGIN Octant_Octant+4;X_Y-X;Y_Y-X; END--:489--; IF PascalODD[OctantNumber^[Octant]] THEN S_-1 ELSE S_1;H_ INT[P]+Octant; W_Mem[Mem[H]^.Hh.Rh]^.Hh.Rh;Ww_Mem[W]^.Hh.Rh;N_Mem[H]^.Hh.Lh; {WHILE N>1 DO BEGIN IF AbVsCd[X,Mem[ INT[Ww]+2]^.Int-Mem[ INT[W]+2]^.Int,Y,Mem[ INT[Ww]+1]^. Int-Mem[ INT[W]+1]^.Int]#S THEN GOTO Label30;W_Ww;Ww_Mem[W]^.Hh.Rh;N_N-1; END ENDLOOP ; EXITS Label30 => NULL};Unskew[Mem[ INT[W]+1]^.Int,Mem[ INT[W]+2]^.Int,Octant];EXITS Label10 => NULL}; END;--:488----491:----493: END.