-- file: MFFinalizeImpl.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:03 pm PST


DIRECTORY
  PascalBasic,
  PascalWizardFiles,
  MFTypes,
  MFProcArray,
  MFExternals,
  MFInteraction,
  MFMath,
  MFMemory,
  MFSymbols,
  MFInput,
  MFFileNames,
  MFOps,
  MFTFM,
  MFGF,
  MFRest,
  MFOctants;

MFFinalizeImpl: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, MFProcArray, MFExternals, MFInteraction, MFMath, MFMemory, MFSymbols, MFInput, MFFileNames, MFOps, MFTFM, MFGF, MFRest, MFOctants EXPORTS MFRest = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFExternals, MFInteraction, MFMath, MFMemory, MFSymbols, MFInput, MFFileNames, MFOps, MFTFM, MFGF, MFRest, MFOctants;
  CloseFilesAndTerminate: PROCEDURE
 = 
BEGIN K:PascalInteger;Lh:PascalInteger;P:Halfword;
X:Scaled; TfmFinishUpTheFile: PROCEDURE = 
BEGIN--1133:
IF JobName=0  THEN OpenLogFile[];PackJobName[902];
WHILE  NOT BOpenOut[@TfmFile]DO PromptFileName[903,902] ENDLOOP ;
MetricFileName←BMakeNameString[@TfmFile];--1134:--K←HeaderSize;
WHILE  INT[HeaderByte↑[K]]<0 DO K←K-1 ENDLOOP ;Lh← PascalDIVPower2[(K+3),2];IF  INT[Bc]>Ec  THEN Bc←1;
TfmTwo[6+Lh+(Ec-Bc+1)+Nw+Nh+Nd+Ni+Nl+Nk+Ne+Np];TfmTwo[Lh];TfmTwo[Bc];
TfmTwo[Ec];TfmTwo[Nw];TfmTwo[Nh];TfmTwo[Nd];TfmTwo[Ni];TfmTwo[Nl];
TfmTwo[Nk];TfmTwo[Ne];TfmTwo[Np];
FOR i:INT    IN [ INT[1 ].. INT[4*Lh ]] DO  K ← i;  IF  INT[HeaderByte↑[K]]<0  THEN HeaderByte↑[K]←0;
{grossExprHack:EightBits ← HeaderByte↑[K]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};--:1134-- ENDLOOP;--1136:
FOR i:INT    IN [ INT[Bc ].. INT[Ec ]] DO  K ← i; IF  NOT CharExists↑[K] THEN TfmFour[0] ELSE BEGIN 
{grossExprHack:EightBits ← Mem[TfmWidth↑[K]]↑.Hh.Lh; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};
{grossExprHack:EightBits ←  INT[(Mem[TfmHeight↑[K]]↑.Hh.Lh)]*16+Mem[TfmDepth↑[K]]↑.Hh.Lh; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};
{grossExprHack:EightBits ←  INT[(Mem[TfmItalCorr↑[K]]↑.Hh.Lh)]*4+CharTag↑[K]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};
{grossExprHack:EightBits ← CharRemainder↑[K]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]}; END--:1136-- ENDLOOP;--1137:--TfmChanged←0;
FOR i:INT    IN [ INT[1 ].. INT[4 ]] DO  K ← i;  TfmFour[0];P←DimenHead↑[K];
WHILE P#19 DO BEGIN TfmFour[DimenOut[Mem[ INT[P]+1]↑.Int]];P←Mem[P]↑.Hh.Rh;
 END ENDLOOP ;--:1137-- ENDLOOP;--1138:--FOR i:INT    IN [ INT[0 ].. INT[Nl-1 ]] DO  K ← i; TfmQqqq[LigKern↑[K]] ENDLOOP;
FOR i:INT    IN [ INT[0 ].. INT[Nk-1 ]] DO  K ← i; TfmFour[DimenOut[Kern↑[K]]]--:1138-- ENDLOOP;--1139:
FOR i:INT    IN [ INT[0 ].. INT[Ne-1 ]] DO  K ← i; TfmQqqq[Exten↑[K]]--:1139-- ENDLOOP;--1140:
FOR i:INT    IN [ INT[1 ].. INT[Np ]] DO  K ← i; IF K=1  THEN IF ABS[Param↑[1]]<134217728  THEN TfmFour[
Param↑[1]*16] ELSE BEGIN TfmChanged←TfmChanged+1;
IF Param↑[1]>0  THEN TfmFour[2147483647] ELSE TfmFour[-2147483647];
 END  ELSE TfmFour[DimenOut[Param↑[K]]] ENDLOOP;
IF TfmChanged>0  THEN BEGIN IF TfmChanged=1  THEN PrintNl[905] ELSE
BEGIN PrintNl[40];PrintInt[TfmChanged];Print[906]; END;Print[907];
 END--:1140--;IF Internal↑[12]>0  THEN--1135:--BEGIN {PascalWriteLongString[file: @LogFile, item: " "]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: "(You used "]; PascalWriteInteger[file: @LogFile, item: Nw, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "w,"]; PascalWriteInteger[file: @LogFile, item: Nh, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "h,"]; PascalWriteInteger[file: @LogFile, item: Nd, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "d,"]; PascalWriteInteger[file: @LogFile, item: Ni, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "i,"]; PascalWriteInteger[file: @LogFile, item: Nl
, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "l,"]; PascalWriteInteger[file: @LogFile, item: Nk, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "k,"]; PascalWriteInteger[file: @LogFile, item: Ne, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "e,"]; PascalWriteInteger[file: @LogFile, item: Np, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "p metric file positions"]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: "  out of "]; PascalWriteLongString[file: @LogFile, item: "256w,16h,16d,64i,"]; PascalWriteInteger[file: @LogFile, item: LigTableSize, fieldMinLength: 1]
; PascalWriteLongString[file: @LogFile, item: "l,256k,256e,"]; PascalWriteInteger[file: @LogFile, item: MaxFontDimen, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "p)"]; PascalWriteLn[file: @LogFile]}; END--:1135--;PrintNl[904];
Print[MetricFileName];BClose[@TfmFile]--:1133--; END;
 GfFinishUpTheFile: PROCEDURE = 
BEGIN--1181:
BEGIN BEGIN GfBuf↑[GfPtr]←248;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;GfFour[GfPrevPtr];
GfPrevPtr←GfOffset+GfPtr-5;GfFour[Internal↑[26]*16];
FOR i:INT    IN [ INT[1 ].. INT[4 ]] DO  K ← i;  GfBuf↑[GfPtr]←HeaderByte↑[K];GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; ENDLOOP;GfFour[Internal↑[27]];
GfFour[Internal↑[28]];GfFour[GfMinM];GfFour[GfMaxM];
GfFour[GfMinN];GfFour[GfMaxN];
FOR i:INT    IN [ INT[0 ].. INT[255 ]] DO  K ← i; IF CharExists↑[K] THEN BEGIN X← PascalDIVPower2[GfDx↑[K],16];
IF(GfDy↑[K]=0)AND (X>=0)AND (X<256)AND (GfDx↑[K]=X*65536) THEN BEGIN BEGIN
GfBuf↑[GfPtr]←246;GfPtr←GfPtr+1;IF GfPtr=GfLimit  THEN GfSwap[];
 END;BEGIN GfBuf↑[GfPtr]←K;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;BEGIN GfBuf↑[GfPtr]←X;
GfPtr←GfPtr+1;IF GfPtr=GfLimit  THEN GfSwap[]; END;
 END  ELSE BEGIN BEGIN GfBuf↑[GfPtr]←245;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;BEGIN GfBuf↑[GfPtr]←K;
GfPtr←GfPtr+1;IF GfPtr=GfLimit  THEN GfSwap[]; END;GfFour[GfDx↑[K]];
GfFour[GfDy↑[K]]; END;X←Mem[TfmWidth↑[K]+1]↑.Int;
IF ABS[X]>MaxTfmDimen  THEN IF X>0  THEN X←16777215  ELSE X←-16777215
 ELSE X←MakeScaled[X*16,Internal↑[26]];GfFour[X];GfFour[CharPtr↑[K]];
 END ENDLOOP;BEGIN GfBuf↑[GfPtr]←249;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;GfFour[GfPrevPtr];
BEGIN GfBuf↑[GfPtr]←131;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;K←4+( PascalMODPower2Mask[(GfBufSize-GfPtr),3]);
WHILE K>0 DO BEGIN BEGIN GfBuf↑[GfPtr]←223;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;K←K-1; END ENDLOOP ;--1155:
IF GfLimit=HalfBuf  THEN WriteGf[HalfBuf,GfBufSize-1];
IF  INT[GfPtr]>0  THEN WriteGf[0,GfPtr-1]--:1155--;PrintNl[918];
Print[OutputFileName];Print[426];PrintInt[TotalChars];Print[919];
IF TotalChars#1  THEN PrintChar[115];Print[920];
PrintInt[GfOffset+GfPtr];Print[921];BClose[@GfFile]; END--:1181--; END;
 --1205:
 IF Internal↑[12]>0  THEN--1207:
IF  INT[JobName]>0  THEN BEGIN {PascalWriteLongString[file: @LogFile, item: " "]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: "Here is how much of METAFONT's memory"]; PascalWriteLongString[file: @LogFile, item: " you used:"]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: " "]; PascalWriteInteger[file: @LogFile, item: MaxStrPtr-InitStrPtr, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: " string"]};
IF MaxStrPtr#InitStrPtr+1  THEN PascalWriteLongString[file: @LogFile, item: "s"];
{PascalWriteLongString[file: @LogFile, item: " out of "]; PascalWriteInteger[file: @LogFile, item: MaxStrings-InitStrPtr, fieldMinLength: 1]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: " "]; PascalWriteInteger[file: @LogFile, item: MaxPoolPtr-InitPoolPtr, fieldMinLength: 1]
; PascalWriteLongString[file: @LogFile, item: " string characters out of "]; PascalWriteInteger[file: @LogFile, item: PoolSize-InitPoolPtr, fieldMinLength: 1]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: " "]; PascalWriteInteger[file: @LogFile, item:  INT[LoMemMax+0]+MemEnd-HiMemMin+2, fieldMinLength: 1]
; PascalWriteLongString[file: @LogFile, item: " words of memory out of "]; PascalWriteInteger[file: @LogFile, item:  INT[MemEnd]+1, fieldMinLength: 1]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: " "]; PascalWriteInteger[file: @LogFile, item: StCount, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: " symbolic tokens out of "]; PascalWriteInteger[file: @LogFile, item: 2100, fieldMinLength: 1]; PascalWriteLn[file: @LogFile]};
{PascalWriteLongString[file: @LogFile, item: " "]; PascalWriteInteger[file: @LogFile, item: MaxInStack, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "i,"]; PascalWriteInteger[file: @LogFile, item: IntPtr, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "n,"]; PascalWriteInteger[file: @LogFile, item: MaxRoundingPtr
, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "r,"]; PascalWriteInteger[file: @LogFile, item: MaxParamStack, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "p,"]; PascalWriteInteger[file: @LogFile, item: MaxBufStack+1, fieldMinLength: 1]
; PascalWriteLongString[file: @LogFile, item: "b stack positions out of "]; PascalWriteInteger[file: @LogFile, item: StackSize, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "i,"]; PascalWriteInteger[file: @LogFile, item: MaxInternal, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "n,"]
; PascalWriteInteger[file: @LogFile, item: MaxWiggle, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "r,"]; PascalWriteInteger[file: @LogFile, item: 150, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "p,"]; PascalWriteInteger[file: @LogFile, item: BufSize, fieldMinLength: 1]; PascalWriteLongString[file: @LogFile, item: "b"]; PascalWriteLn[file: @LogFile]}; END--:1207--;IF(GfPrevPtr>0)OR (Internal↑[33]>0) THEN BEGIN--1206:--Rover←23;
Mem[Rover]↑.Hh.Rh←65535;LoMemMax← INT[HiMemMin]-1;
IF  INT[LoMemMax]-Rover>65535  THEN LoMemMax← INT[65535]+Rover;
Mem[Rover]↑.Hh.Lh← INT[LoMemMax]-Rover;Mem[ INT[Rover]+1]↑.Hh.Lh←Rover;
Mem[ INT[Rover]+1]↑.Hh.Rh←Rover;Mem[LoMemMax]↑.Hh.Rh←0;
Mem[LoMemMax]↑.Hh.Lh←0--:1206--;--1123:--Mem[49999]↑.Hh.Rh←19;
FOR i:INT    IN [ INT[Bc ].. INT[Ec ]] DO  K ← i; IF CharExists↑[K] THEN TfmWidth↑[K]←SortIn[TfmWidth
↑[K]] ENDLOOP;Nw←Skimp[255]+1;DimenHead↑[1]←Mem[49999]↑.Hh.Rh;
IF Perturbation>=4096  THEN TfmWarning[20]--:1123--;FixDesignSize[];
FixCheckSum[];IF Internal↑[33]>0  THEN BEGIN--1125:--Mem[49999]↑.Hh.Rh←19;
FOR i:INT    IN [ INT[Bc ].. INT[Ec ]] DO  K ← i; IF CharExists↑[K] THEN IF TfmHeight↑[K]=0  THEN
TfmHeight↑[K]←15  ELSE TfmHeight↑[K]←SortIn[TfmHeight↑[K]] ENDLOOP;
Nh←Skimp[15]+1;DimenHead↑[2]←Mem[49999]↑.Hh.Rh;
IF Perturbation>=4096  THEN TfmWarning[21];Mem[49999]↑.Hh.Rh←19;
FOR i:INT    IN [ INT[Bc ].. INT[Ec ]] DO  K ← i; IF CharExists↑[K] THEN IF TfmDepth↑[K]=0  THEN
TfmDepth↑[K]←15  ELSE TfmDepth↑[K]←SortIn[TfmDepth↑[K]] ENDLOOP;
Nd←Skimp[15]+1;DimenHead↑[3]←Mem[49999]↑.Hh.Rh;
IF Perturbation>=4096  THEN TfmWarning[22];Mem[49999]↑.Hh.Rh←19;
FOR i:INT    IN [ INT[Bc ].. INT[Ec ]] DO  K ← i; IF CharExists↑[K] THEN IF TfmItalCorr↑[K]=0  THEN
TfmItalCorr↑[K]←15  ELSE TfmItalCorr↑[K]←SortIn[TfmItalCorr↑[K]] ENDLOOP;
Ni←Skimp[63]+1;DimenHead↑[4]←Mem[49999]↑.Hh.Rh;
IF Perturbation>=4096  THEN TfmWarning[23]--:1125--;
TfmFinishUpTheFile[]; END;IF GfPrevPtr>0  THEN GfFinishUpTheFile[];
 END--:1205--;IF  INT[JobName]>0  THEN BEGIN PascalWriteLn[file: @LogFile];AClose[@LogFile];
Selector←Selector-2;IF Selector=1  THEN BEGIN PrintNl[930];
Print[LogName];PrintChar[46];PrintLn[]; END; END; END;--:1204----1208:
 FinalCleanup: PROCEDURE = 
BEGIN  C:SmallNumber; C←CurMod;
IF JobName=0  THEN OpenLogFile[];
WHILE CondPtr#0 DO BEGIN PrintNl[931];PrintCmdMod[2,CurIf];
IF IfLine#0  THEN BEGIN Print[137];PrintInt[IfLine]; END;Print[932];
IfLine←Mem[ INT[CondPtr]+1]↑.Int;CurIf←Mem[CondPtr]↑.Hh.B1;
CondPtr←Mem[CondPtr]↑.Hh.Rh; END ENDLOOP ;
IF History#0  THEN IF((History=1)OR ( INT[Interaction]<3)) THEN IF Selector=3
 THEN BEGIN Selector←1;PrintNl[933];Selector←3; END;
{IF C=1  THEN BEGIN IF StartLikeInimf  THEN BEGIN StoreBaseFile[];
 GOTO Label10; END  ELSE BEGIN PrintNl[934]; GOTO Label10; END; END;EXITS Label10 => NULL}; END;--:1208

END.