-- file: MFOpsImpl2.mesa -- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:02 pm PST DIRECTORY PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFPaths, MFOctants, MFEnvelopes, MFTime, MFEquations, MFParsing, MFOps; MFOpsImpl2: PROGRAM IMPORTS MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFPaths, MFOctants, MFEnvelopes, MFTime, MFEquations, MFParsing, MFOps EXPORTS MFOps = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFPaths, MFOctants, MFEnvelopes, MFTime, MFEquations, MFParsing, MFOps; Bilin1: PROCEDURE[P: Halfword, T: Scaled,Q: Halfword,U,Delta: Scaled] = BEGIN R:Halfword; IF T#65536 THEN DepMult[P,T,TRUE]; IF U#0 THEN IF Mem[Q]^.Hh.B0=16 THEN Delta_Delta+TakeScaled[Mem[ INT[Q]+1]^. Int,U] ELSE BEGIN--968: IF Mem[P]^.Hh.B0#18 THEN BEGIN IF Mem[P]^.Hh.B0=16 THEN NewDep[P, ConstDependency[Mem[ INT[P]+1]^.Int]] ELSE Mem[ INT[P]+1]^.Hh.Rh_PTimesV[Mem[ INT[P]+1]^. Hh.Rh,65536,17,18,TRUE];Mem[P]^.Hh.B0_18; END--:968--; Mem[ INT[P]+1]^.Hh.Rh_PPlusFq[Mem[ INT[P]+1]^.Hh.Rh,U,Mem[ INT[Q]+1]^.Hh.Rh,18,Mem[Q]^.Hh. B0]; END; IF Mem[P]^.Hh.B0=16 THEN Mem[ INT[P]+1]^.Int_Mem[ INT[P]+1]^.Int+Delta ELSE BEGIN R_ Mem[ INT[P]+1]^.Hh.Rh;WHILE Mem[R]^.Hh.Lh#0 DO R_Mem[R]^.Hh.Rh ENDLOOP ; Delta_Mem[ INT[R]+1]^.Int+Delta; IF R#Mem[ INT[P]+1]^.Hh.Rh THEN Mem[ INT[R]+1]^.Int_Delta ELSE BEGIN RecycleValue[P ];Mem[P]^.Hh.B0_16;Mem[ INT[P]+1]^.Int_Delta; END; END; IF FixNeeded THEN FixDependencies[]; END;--:967----970: AddMultDep: PROCEDURE[P: Halfword,V: Scaled,R: Halfword] = BEGIN IF Mem[R]^.Hh.B0=16 THEN Mem[ INT[DepFinal]+1]^.Int_Mem[ INT[DepFinal]+1]^.Int +TakeScaled[Mem[ INT[R]+1]^.Int,V] ELSE BEGIN Mem[ INT[P]+1]^.Hh.Rh_PPlusFq[Mem[ INT[P]+1 ]^.Hh.Rh,V,Mem[ INT[R]+1]^.Hh.Rh,18,Mem[R]^.Hh.B0]; IF FixNeeded THEN FixDependencies[]; END; END;--:970----971: Bilin2: PROCEDURE[P,T: Halfword,V: Scaled,U,Q: Halfword] = BEGIN Vv:Scaled; Vv_Mem[ INT[P]+1]^.Int;Mem[P]^.Hh.B0_18;NewDep[P,ConstDependency[0]]; IF Vv#0 THEN AddMultDep[P,Vv,T];IF V#0 THEN AddMultDep[P,V,U]; IF Q#0 THEN AddMultDep[P,65536,Q]; IF Mem[ INT[P]+1]^.Hh.Rh=DepFinal THEN BEGIN Vv_Mem[ INT[DepFinal]+1]^.Int; RecycleValue[P];Mem[P]^.Hh.B0_16;Mem[ INT[P]+1]^.Int_Vv; END; END;--:971----973: Bilin3: PROCEDURE[P: Halfword,T,V,U,Delta: Scaled] = BEGIN IF T#65536 THEN Delta_Delta+TakeScaled[Mem[ INT[P]+1]^.Int,T] ELSE Delta_Delta+Mem[ INT[P]+1]^.Int; IF U#0 THEN Mem[ INT[P]+1]^.Int_Delta+TakeScaled[V,U] ELSE Mem[ INT[P]+1]^.Int_ Delta; END;--:973-- BigTrans: PROCEDURE[P: Halfword,C: Quarterword] = BEGIN Q, R, Pp, Qq:Halfword;S:SmallNumber; S_BigNodeSize^[Mem[P]^.Hh.B0];Q_Mem[ INT[P]+1]^.Int;R_ INT[Q]+S; {DO R_ INT[R]-2;IF Mem[R]^.Hh.B0#16 THEN--966:--BEGIN SetUpKnownTrans[C]; MakeExpCopy[P];R_Mem[CurExp+1]^.Int; IF CurType=13 THEN BEGIN Bilin1[ INT[R]+10,Tyy, INT[Q]+6,Tyx,0]; Bilin1[ INT[R]+8,Tyy, INT[Q]+4,Tyx,0];Bilin1[ INT[R]+6,Txx, INT[Q]+10,Txy,0]; Bilin1[ INT[R]+4,Txx, INT[Q]+8,Txy,0]; END;Bilin1[ INT[R]+2,Tyy,Q,Tyx,Ty]; Bilin1[R,Txx, INT[Q]+2,Txy,Tx]; GOTO Label10; END--:966--; IF R=Q THEN EXIT; ENDLOOP;--969: SetUpTrans[C];IF CurType=16 THEN--972:--BEGIN MakeExpCopy[P]; R_Mem[CurExp+1]^.Int; IF CurType=13 THEN BEGIN Bilin3[ INT[R]+10,Tyy,Mem[ INT[Q]+7]^.Int,Tyx,0]; Bilin3[ INT[R]+8,Tyy,Mem[ INT[Q]+5]^.Int,Tyx,0];Bilin3[ INT[R]+6,Txx,Mem[ INT[Q]+11]^.Int,Txy,0]; Bilin3[ INT[R]+4,Txx,Mem[ INT[Q]+9]^.Int,Txy,0]; END; Bilin3[ INT[R]+2,Tyy,Mem[ INT[Q]+1]^.Int,Tyx,Ty];Bilin3[R,Txx,Mem[ INT[Q]+3]^.Int,Txy,Tx]; END--:972-- ELSE BEGIN Pp_StashCurExp[];Qq_Mem[ INT[Pp]+1]^.Int; MakeExpCopy[P];R_Mem[CurExp+1]^.Int; IF CurType=13 THEN BEGIN Bilin2[ INT[R]+10, INT[Qq]+10,Mem[ INT[Q]+7]^.Int, INT[Qq]+8,0]; Bilin2[ INT[R]+8, INT[Qq]+10,Mem[ INT[Q]+5]^.Int, INT[Qq]+8,0]; Bilin2[ INT[R]+6, INT[Qq]+4,Mem[ INT[Q]+11]^.Int, INT[Qq]+6,0]; Bilin2[ INT[R]+4, INT[Qq]+4,Mem[ INT[Q]+9]^.Int, INT[Qq]+6,0]; END; Bilin2[ INT[R]+2, INT[Qq]+10,Mem[ INT[Q]+1]^.Int, INT[Qq]+8, INT[Qq]+2]; Bilin2[R, INT[Qq]+4,Mem[ INT[Q]+3]^.Int, INT[Qq]+6,Qq];RecycleValue[Pp];FreeNode[Pp,2]; END;--:969--EXITS Label10 => NULL}; END;--:965----975:-- Cat: PROCEDURE[P: Halfword] = BEGIN A, B:StrNumber;K:PoolPointer; A_Mem[ INT[P]+1]^.Int;B_CurExp; BEGIN IF INT[PoolPtr]+(StrStart^[A+1]-StrStart^[A])+( StrStart^[B+1]-StrStart^[B])>MaxPoolPtr THEN BEGIN IF INT[PoolPtr]+( StrStart^[A+1]-StrStart^[A])+(StrStart^[B+1]-StrStart^[B])>PoolSize THEN Overflow[129, PoolSize-InitPoolPtr]; MaxPoolPtr_ INT[PoolPtr]+(StrStart^[A+1]-StrStart^[A])+( StrStart^[B+1]-StrStart^[B]); END; END; FOR i:INT IN [ INT[StrStart^[A]].. INT[StrStart^[A+1]-1 ]] DO K _ i; StrPool^[PoolPtr]_ StrPool^[K];PoolPtr_PoolPtr+1; ENDLOOP; FOR i:INT IN [ INT[StrStart^[B]].. INT[StrStart^[B+1]-1 ]] DO K _ i; StrPool^[PoolPtr]_ StrPool^[K];PoolPtr_PoolPtr+1; ENDLOOP;CurExp_MakeString[]; BEGIN IF INT[StrRef^[B]]<127 THEN IF INT[StrRef^[B]]>1 THEN StrRef^[B]_StrRef^[B] -1 ELSE FlushString[B]; END; END;--:975----976: ChopString: PROCEDURE[P: Halfword] = BEGIN A, B:PascalInteger;L:PascalInteger;K:PascalInteger; S:StrNumber;Reversed:PascalBoolean; A_RoundUnscaled[Mem[ INT[P]+1]^.Int]; B_RoundUnscaled[Mem[ INT[P]+3]^.Int]; IF A<=B THEN Reversed_FALSE ELSE BEGIN Reversed_TRUE;K_A;A_B;B_K; END;S_CurExp;L_(StrStart^[S+1]-StrStart^[S]);IF A<0 THEN BEGIN A_0; IF B<0 THEN B_0; END;IF B>L THEN BEGIN B_L;IF A>L THEN A_L; END; BEGIN IF PoolPtr+B-A>MaxPoolPtr THEN BEGIN IF PoolPtr+B-A>PoolSize THEN Overflow[129,PoolSize-InitPoolPtr];MaxPoolPtr_PoolPtr+B-A; END; END; IF Reversed THEN FOR i:INT DECREASING IN [ INT[StrStart^[S]+A ].. INT[StrStart^[S]+B-1 ]] DO K _ i; StrPool^[PoolPtr]_StrPool^[K];PoolPtr_PoolPtr+1; ENDLOOP ELSE FOR i:INT IN [ INT[StrStart^[S]+A ].. INT[StrStart^[S]+B-1 ]] DO K _ i; StrPool^ [PoolPtr]_StrPool^[K];PoolPtr_PoolPtr+1; ENDLOOP;CurExp_MakeString[]; BEGIN IF INT[StrRef^[S]]<127 THEN IF INT[StrRef^[S]]>1 THEN StrRef^[S]_StrRef^[S] -1 ELSE FlushString[S]; END; END;--:976----977: ChopPath: PROCEDURE[P: Halfword] = BEGIN Q:Halfword;Pp, Qq, Rr, Ss:Halfword; A, B, K, L:Scaled;Reversed:PascalBoolean; L_PathLength[];A_Mem[ INT[P]+1]^.Int; B_Mem[ INT[P]+3]^.Int;IF A<=B THEN Reversed_FALSE ELSE BEGIN Reversed_TRUE; K_A;A_B;B_K; END;--978: IF A<0 THEN IF Mem[CurExp]^.Hh.B0=0 THEN BEGIN A_0;IF B<0 THEN B_0; END ELSE DO A_A+L;B_B+L; IF A>=0 THEN EXIT; ENDLOOP; IF B>L THEN IF Mem[CurExp]^.Hh.B0=0 THEN BEGIN B_L;IF A>L THEN A_L; END ELSE WHILE A>=L DO BEGIN A_A-L;B_B-L; END--:978-- ENDLOOP ;Q_CurExp; WHILE A>=65536 DO BEGIN Q_Mem[Q]^.Hh.Rh;A_A-65536;B_B-65536; END ENDLOOP ; IF B=A THEN--980:--BEGIN IF A>0 THEN BEGIN Qq_Mem[Q]^.Hh.Rh; SplitCubic[Q,A*4096,Mem[ INT[Qq]+1]^.Int,Mem[ INT[Qq]+2]^.Int];Q_Mem[Q]^.Hh.Rh; END; Pp_CopyKnot[Q];Qq_Pp; END--:980-- ELSE--979:--BEGIN Pp_CopyKnot[Q]; Qq_Pp;DO Q_Mem[Q]^.Hh.Rh;Rr_Qq;Qq_CopyKnot[Q];Mem[Rr]^.Hh.Rh_Qq; B_B-65536; IF B<=0 THEN EXIT; ENDLOOP;IF A>0 THEN BEGIN Ss_Pp;Pp_Mem[Pp]^.Hh.Rh; SplitCubic[Ss,A*4096,Mem[ INT[Pp]+1]^.Int,Mem[ INT[Pp]+2]^.Int];Pp_Mem[Ss]^.Hh.Rh; FreeNode[Ss,7];IF Rr=Ss THEN BEGIN B_MakeScaled[B,65536-A];Rr_Pp; END; END; IF B<0 THEN BEGIN SplitCubic[Rr,(B+65536)*4096,Mem[ INT[Qq]+1]^.Int,Mem[ INT[Qq]+2]^. Int];FreeNode[Qq,7];Qq_Mem[Rr]^.Hh.Rh; END; END--:979--;Mem[Pp]^.Hh.B0_0; Mem[Qq]^.Hh.B1_0;Mem[Qq]^.Hh.Rh_Pp;TossKnotList[CurExp]; IF Reversed THEN BEGIN CurExp_Mem[HtapYpoc[Pp]]^.Hh.Rh; TossKnotList[Pp]; END ELSE CurExp_Pp; END;--:977----981: PairValue: PROCEDURE[X,Y: Scaled] = BEGIN P:Halfword; P_GetNode[2]; FlushCurExp[P];CurType_14;Mem[P]^.Hh.B0_14;Mem[P]^.Hh.B1_11; InitBigNode[P];P_Mem[ INT[P]+1]^.Int;Mem[P]^.Hh.B0_16;Mem[ INT[P]+1]^.Int_X; Mem[ INT[P]+2]^.Hh.B0_16;Mem[ INT[P]+3]^.Int_Y; END;--:981----983: SetUpOffset: PROCEDURE[P: Halfword] = BEGIN FindOffset[Mem[ INT[P]+1]^.Int,Mem[ INT[P]+3]^.Int,CurExp]; PairValue[CurX,CurY]; END; SetUpDirectionTime: PROCEDURE[P: Halfword] = BEGIN FlushCurExp[FindDirectionTime[Mem[ INT[P]+1]^.Int,Mem[ INT[P]+3]^.Int, CurExp]]; END;--:983----984:-- END.