-- file: MFEdgesImpl3.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, MFMoves, MFEdges, MFContours; MFEdgesImpl3: PROGRAM IMPORTS PascalBasic, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFMoves, MFEdges, MFContours EXPORTS MFEdges = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFMoves, MFEdges, MFContours; BeginEdgeTracing: PROCEDURE = BEGIN PrintDiagnostic[409,157,TRUE];Print[410];PrintInt[CurWt]; PrintChar[41];TraceX_-4096; END; TraceACorner: PROCEDURE = BEGIN IF INT[FileOffset]>MaxPrintLine-13 THEN PrintNl[157]; PrintChar[40];PrintInt[TraceX];PrintChar[44];PrintInt[TraceYy]; PrintChar[41];TraceY_TraceYy; END; EndEdgeTracing: PROCEDURE = BEGIN IF TraceX=-4096 THEN PrintNl[411] ELSE BEGIN TraceACorner[]; PrintChar[46]; END;EndDiagnostic[TRUE]; END;--:372----373: TraceNewEdge: PROCEDURE[R: Halfword,N: PascalInteger] = BEGIN D:PascalInteger;W:PascalInteger[-3..3]; M, N0, N1:PascalInteger; D_Mem[R]^.Hh.Lh;W_( PascalMODPower2Mask[D ,7])-4; M_( PascalDIVPower2[D ,3])-Mem[ INT[CurEdges]+3]^.Hh.Lh;IF W=CurWt THEN BEGIN N0_N+1; N1_N; END ELSE BEGIN N0_N;N1_N+1; END; IF M#TraceX THEN BEGIN IF TraceX=-4096 THEN BEGIN PrintNl[157]; TraceYy_N0; END ELSE IF TraceYy#N0 THEN PrintChar[63] ELSE TraceACorner[]; TraceX_M;TraceACorner[]; END ELSE BEGIN IF N0#TraceYy THEN PrintChar[33]; IF((N0TraceYy))OR ((N0>N1)AND (TraceY0 THEN TraceNewEdge[R,N];IF Y1<65536 THEN GOTO Label30; P_Mem[P]^.Hh.Rh;Y0_Y0+65536;N_N+1; END ENDLOOP ;EXITS Label30 => NULL}; END--:375-- ELSE--376: BEGIN Base_ INT[8]*Mem[ INT[CurEdges]+3]^.Hh.Lh+4+CurWt; IF M0<=M1 THEN EdgePrep[M0,M1,N1,N0] ELSE EdgePrep[M1,M0,N1,N0]; N0_N0-1;--377:--N_ INT[Mem[ INT[CurEdges]+5]^.Hh.Lh]-4096;P_Mem[ INT[CurEdges]+5]^.Hh.Rh; IF N#N0 THEN IF N0 THEN TraceNewEdge[R,N];IF Y1>=0 THEN GOTO Label31; P_Mem[P]^.Hh.Lh;Y0_Y0+65536;N_N-1; END ENDLOOP ;EXITS Label31 => NULL}; END--:376--; Mem[ INT[CurEdges]+5]^.Hh.Rh_P;Mem[ INT[CurEdges]+5]^.Hh.Lh_N+4096; END; END;--:374 --378:-- MoveToEdges: PROCEDURE[M0,N0,M1,N1: PascalInteger] = BEGIN Delta:PascalInteger[0..MoveSize];K:PascalInteger[0..MoveSize];P, R:Halfword;Dx:PascalInteger; EdgeAndWeight:PascalInteger;J:PascalInteger;N:PascalInteger;Sum:PascalInteger; Delta_N1-N0;Sum_Move^[0]; FOR i:INT IN [ INT[1 ].. INT[Delta ]] DO K _ i; Sum_Sum+ABS[Move^[K]] ENDLOOP; IF Sum#M1-M0 THEN Confusion[48];--380:--{{{{{SELECT Octant FROM 1 =>BEGIN Dx_8; EdgePrep[M0,M1,N0,N1]; GOTO Label60; END;5 =>BEGIN Dx_8;EdgePrep[N0,N1,M0,M1]; GOTO Label62; END;6 =>BEGIN Dx_-8;EdgePrep[-N1,-N0,M0,M1];N0_-N0; GOTO Label62; END; 2 =>BEGIN Dx_-8;EdgePrep[-M1,-M0,N0,N1];M0_-M0; GOTO Label60; END; 4 =>BEGIN Dx_-8;EdgePrep[-M1,-M0,-N1,-N0];M0_-M0; GOTO Label61; END; 8 =>BEGIN Dx_-8;EdgePrep[-N1,-N0,-M1,-M0];N0_-N0; GOTO Label63; END; 7 =>BEGIN Dx_8;EdgePrep[N0,N1,-M1,-M0]; GOTO Label63; END;3 =>BEGIN Dx_8; EdgePrep[M0,M1,-N1,-N0]; GOTO Label61; END; ENDCASE;--:380--EXITS Label60 => NULL};--381:----377: N_ INT[Mem[ INT[CurEdges]+5]^.Hh.Lh]-4096;P_Mem[ INT[CurEdges]+5]^.Hh.Rh; IF N#N0 THEN IF N0 THEN BEGIN K_0; EdgeAndWeight_8*(M0+Mem[ INT[CurEdges]+3]^.Hh.Lh)+4-CurWt; DO EdgeAndWeight_EdgeAndWeight+Dx*Move^[K];BEGIN R_Avail; IF R=0 THEN R_GetAvail [] ELSE BEGIN Avail_Mem[R]^.Hh.Rh;Mem[R]^.Hh.Rh_0; DynUsed_DynUsed+1; END; END;Mem[R]^.Hh.Rh_Mem[ INT[P]+1]^.Hh.Lh; Mem[R]^.Hh.Lh_EdgeAndWeight; IF Internal^[10]>0 THEN TraceNewEdge[R,N];Mem[ INT[P]+1]^.Hh.Lh_R; P_Mem[P]^.Hh.Rh;K_K+1;N_N+1; IF K=Delta THEN EXIT; ENDLOOP; END; GOTO Label30--:381--;EXITS Label61 => NULL};--382: N0_-N0-1;--377:--N_ INT[Mem[ INT[CurEdges]+5]^.Hh.Lh]-4096; P_Mem[ INT[CurEdges]+5]^.Hh.Rh;IF N#N0 THEN IF N0 THEN BEGIN K_0; EdgeAndWeight_8*(M0+Mem[ INT[CurEdges]+3]^.Hh.Lh)+4+CurWt; DO EdgeAndWeight_EdgeAndWeight+Dx*Move^[K];BEGIN R_Avail; IF R=0 THEN R_GetAvail [] ELSE BEGIN Avail_Mem[R]^.Hh.Rh;Mem[R]^.Hh.Rh_0; DynUsed_DynUsed+1; END; END;Mem[R]^.Hh.Rh_Mem[ INT[P]+1]^.Hh.Lh; Mem[R]^.Hh.Lh_EdgeAndWeight; IF Internal^[10]>0 THEN TraceNewEdge[R,N];Mem[ INT[P]+1]^.Hh.Lh_R; P_Mem[P]^.Hh.Lh;K_K+1;N_N-1; IF K=Delta THEN EXIT; ENDLOOP; END; GOTO Label30--:382--;EXITS Label62 => NULL};--383: EdgeAndWeight_8*(N0+Mem[ INT[CurEdges]+3]^.Hh.Lh)+4-CurWt;N0_M0;K_0; --377:--N_ INT[Mem[ INT[CurEdges]+5]^.Hh.Lh]-4096;P_Mem[ INT[CurEdges]+5]^.Hh.Rh; IF N#N0 THEN IF N0 DO BEGIN BEGIN R_Avail; IF R=0 THEN R_GetAvail [] ELSE BEGIN Avail_Mem[R]^.Hh.Rh;Mem[R]^.Hh.Rh_0; DynUsed_DynUsed+1; END; END;Mem[R]^.Hh.Rh_Mem[ INT[P]+1]^.Hh.Lh; Mem[R]^.Hh.Lh_EdgeAndWeight; IF Internal^[10]>0 THEN TraceNewEdge[R,N];Mem[ INT[P]+1]^.Hh.Lh_R; P_Mem[P]^.Hh.Rh;J_J-1;N_N+1; END ENDLOOP ;EdgeAndWeight_EdgeAndWeight+Dx; K_K+1; IF INT[K]>Delta THEN EXIT; ENDLOOP; GOTO Label30--:383--;EXITS Label63 => NULL};--384: EdgeAndWeight_8*(N0+Mem[ INT[CurEdges]+3]^.Hh.Lh)+4+CurWt;N0_-M0-1;K_0; --377:--N_ INT[Mem[ INT[CurEdges]+5]^.Hh.Lh]-4096;P_Mem[ INT[CurEdges]+5]^.Hh.Rh; IF N#N0 THEN IF N0 DO BEGIN BEGIN R_Avail; IF R=0 THEN R_GetAvail [] ELSE BEGIN Avail_Mem[R]^.Hh.Rh;Mem[R]^.Hh.Rh_0; DynUsed_DynUsed+1; END; END;Mem[R]^.Hh.Rh_Mem[ INT[P]+1]^.Hh.Lh; Mem[R]^.Hh.Lh_EdgeAndWeight; IF Internal^[10]>0 THEN TraceNewEdge[R,N];Mem[ INT[P]+1]^.Hh.Lh_R; P_Mem[P]^.Hh.Lh;J_J-1;N_N-1; END ENDLOOP ;EdgeAndWeight_EdgeAndWeight+Dx; K_K+1; IF INT[K]>Delta THEN EXIT; ENDLOOP; GOTO Label30--:384--;EXITS Label30 => NULL};Mem[ INT[CurEdges]+5]^.Hh.Lh_N+4096; Mem[ INT[CurEdges]+5]^.Hh.Rh_P; END;--:378----387:-- END.