-- file: GFTypeImpl1.mesa -- Pascal-to-Mesa translator output, translated at October 18, 1985 11:15:21 am PDT DIRECTORY PascalBasic, PascalWizardFiles, GFTypePrivate; GFTypeImpl1: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, GFTypePrivate EXPORTS GFTypePrivate = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, GFTypePrivate; --3:-- --4:----:4----:36----10: Xord: LONG POINTER TO ARRAY PascalChar OF AsciiCode ← PascalStaticZone.NEW[ARRAY PascalChar OF AsciiCode]; Xchr: LONG POINTER TO ARRAY PascalInteger[0..255] OF PascalChar ← PascalStaticZone.NEW[ARRAY PascalInteger[0..255] OF PascalChar]; --:10----21: GfFile: ByteFile; --:21----23:-- CurLoc: PascalInteger; --:23----25: WantsMnemonics: PascalBoolean; WantsPixels: PascalBoolean; --:25----27: Buffer: LONG POINTER TO ARRAY PascalInteger[0..150] OF AsciiCode ← PascalStaticZone.NEW[ARRAY PascalInteger[0..150] OF AsciiCode]; TermIn: TextFile; TermOut: TextFile; --:27----35:-- M: PascalInteger; N: PascalInteger; PaintSwitch: Pixel; --:35----37: ImageArray: LONG POINTER TO PACKED ARRAY PascalInteger[0..79] OF PACKED ARRAY PascalInteger[0..79] OF Pixel ← PascalStaticZone.NEW[PACKED ARRAY PascalInteger[0..79] OF PACKED ARRAY PascalInteger[0..79] OF Pixel]; --:37----39: MaxSubrow: PascalInteger; MaxSubcol: PascalInteger; --:39----41: MinMStated: PascalInteger; MaxMStated: PascalInteger; MinNStated: PascalInteger; MaxNStated: PascalInteger; MaxMObserved: PascalInteger; MaxNObserved: PascalInteger; MinMOverall: PascalInteger; MaxMOverall: PascalInteger; MinNOverall: PascalInteger; MaxNOverall: PascalInteger; --:41 --46:-- TotalChars: PascalInteger; CharPtr: LONG POINTER TO ARRAY PascalInteger[0..255] OF PascalInteger ← PascalStaticZone.NEW[ARRAY PascalInteger[0..255] OF PascalInteger]; GfPrevPtr: PascalInteger; CharacterCode: PascalInteger; --:46----54:-- BadChar: PascalBoolean; --:54----62:-- DesignSize: PascalInteger; CheckSum: PascalInteger; Hppp: PascalInteger; Vppp: PascalInteger; PostLoc: PascalInteger; PixRatio: PascalReal; --:62----67:-- A: PascalInteger; B: PascalInteger; C: PascalInteger; L: PascalInteger; O: PascalInteger; P: PascalInteger; Q: PascalInteger; R: PascalInteger; --:67----74:-- Output: TextFile; --:73 Initialize: PROCEDURE = BEGIN I:PascalInteger; {PascalWriteLongString[file: @Output, item: "This is GFType 2.2 for Cedar 6.0"]; PascalWriteLn[file: @Output]};--11: FOR i:INT IN [ INT[0 ].. INT[31 ]] DO I ← i; Xchr↑[I]←'? ENDLOOP;Xchr↑[32]←' ;Xchr↑[33]←'!; Xchr↑[34]←'";Xchr↑[35]←'#;Xchr↑[36]←'$;Xchr↑[37]←'%;Xchr↑[38]←'&; Xchr↑[39]←'';Xchr↑[40]←'(;Xchr↑[41]←');Xchr↑[42]←'*;Xchr↑[43]←'+; Xchr↑[44]←',;Xchr↑[45]←'-;Xchr↑[46]←'.;Xchr↑[47]←'/;Xchr↑[48]←'0; Xchr↑[49]←'1;Xchr↑[50]←'2;Xchr↑[51]←'3;Xchr↑[52]←'4;Xchr↑[53]←'5; Xchr↑[54]←'6;Xchr↑[55]←'7;Xchr↑[56]←'8;Xchr↑[57]←'9;Xchr↑[58]←':; Xchr↑[59]←';;Xchr↑[60]←'<;Xchr↑[61]←'=;Xchr↑[62]←'>;Xchr↑[63]←'?; Xchr↑[64]←'@;Xchr↑[65]←'A;Xchr↑[66]←'B;Xchr↑[67]←'C;Xchr↑[68]←'D; Xchr↑[69]←'E;Xchr↑[70]←'F;Xchr↑[71]←'G;Xchr↑[72]←'H;Xchr↑[73]←'I; Xchr↑[74]←'J;Xchr↑[75]←'K;Xchr↑[76]←'L;Xchr↑[77]←'M;Xchr↑[78]←'N; Xchr↑[79]←'O;Xchr↑[80]←'P;Xchr↑[81]←'Q;Xchr↑[82]←'R;Xchr↑[83]←'S; Xchr↑[84]←'T;Xchr↑[85]←'U;Xchr↑[86]←'V;Xchr↑[87]←'W;Xchr↑[88]←'X; Xchr↑[89]←'Y;Xchr↑[90]←'Z;Xchr↑[91]←'[;Xchr↑[92]←'\\;Xchr↑[93]←']; Xchr↑[94]←'↑;Xchr↑[95]←'←;Xchr↑[96]←'`;Xchr↑[97]←'a;Xchr↑[98]←'b; Xchr↑[99]←'c;Xchr↑[100]←'d;Xchr↑[101]←'e;Xchr↑[102]←'f; Xchr↑[103]←'g;Xchr↑[104]←'h;Xchr↑[105]←'i;Xchr↑[106]←'j; Xchr↑[107]←'k;Xchr↑[108]←'l;Xchr↑[109]←'m;Xchr↑[110]←'n; Xchr↑[111]←'o;Xchr↑[112]←'p;Xchr↑[113]←'q;Xchr↑[114]←'r; Xchr↑[115]←'s;Xchr↑[116]←'t;Xchr↑[117]←'u;Xchr↑[118]←'v; Xchr↑[119]←'w;Xchr↑[120]←'x;Xchr↑[121]←'y;Xchr↑[122]←'z; Xchr↑[123]←'{;Xchr↑[124]←'|;Xchr↑[125]←'};Xchr↑[126]←'~; FOR i:INT IN [ INT[127 ].. INT[255 ]] DO I ← i; Xchr↑[I]←'? ENDLOOP;--:11----12: FOR i:INT IN [ INT[0 ].. INT[255 ]] DO I ← i; Xord↑[PascalCHR[I]]←32 ENDLOOP; FOR i:INT IN [ INT[32 ].. INT[126 ]] DO I ← i; Xord↑[Xchr↑[I]]←I ENDLOOP;--:12----26:--WantsMnemonics←TRUE; WantsPixels←TRUE;--:26----47:--FOR i:INT IN [ INT[0 ].. INT[255 ]] DO I ← i; CharPtr↑[I]←-1 ENDLOOP; TotalChars←0;--:47----63:--MinMOverall←Maxint;MaxMOverall←-Maxint; MinNOverall←Maxint;MaxNOverall←-Maxint;--:63-- END;--:3----7: JumpOut: PROCEDURE = BEGIN ERROR Error9999; END;--:7----22:-- InputLn: PROCEDURE = BEGIN K:PascalInteger[0..TerminalLineLength]; PascalTextBREAK[file: @TermOut];TtyReset[@TermIn]; IF PascalTextEOLN[file: @TermIn] THEN PascalReadLn[file: @TermIn];K←0; WHILE ( INT[K]<TerminalLineLength)AND NOT PascalTextEOLN[file: @TermIn]DO BEGIN Buffer↑[K]← Xord↑[PascalTextElement[file: @TermIn]];K←K+1;PascalTextGET[file: @TermIn]; END ENDLOOP ;Buffer↑[K]←32; END;--:29----30: LowerCasify: PROCEDURE[C: AsciiCode] RETURNS[LowerCasifyResult: AsciiCode] = BEGIN IF( INT[C]>=65)AND ( INT[C]<=90) THEN LowerCasifyResult←C+32 ELSE LowerCasifyResult←C; END;--:30----31:-- Dialog: PROCEDURE = BEGIN TtyRewrite[@TermOut]; {PascalWriteLongString[file: @TermOut, item: "This is GFType 2.2 for Cedar 6.0"]; PascalWriteLn[file: @TermOut]};--32: DO {--Label1:--PascalWriteLongString[file: @TermOut, item: "Mnemonic output? (default=yes, ? for help): "]; InputLn[];Buffer↑[0]←LowerCasify[Buffer↑[0]]; IF Buffer↑[0]#63 THEN WantsMnemonics← (Buffer↑[0]=121)OR (Buffer↑[0]=49)OR (Buffer↑[0]=116)OR (Buffer↑[0]=32) ELSE BEGIN PascalWriteLongString[file: @TermOut, item: "Type Y for complete listing,"]; {PascalWriteLongString[file: @TermOut, item: " N for errors/images only."]; PascalWriteLn[file: @TermOut]}; GOTO Label1; END--:32--;--33: DO {--Label2:--PascalWriteLongString[file: @TermOut, item: "Pixel output? (default=yes, ? for help): "];InputLn[]; Buffer↑[0]←LowerCasify[Buffer↑[0]]; IF Buffer↑[0]#63 THEN WantsPixels←(Buffer↑[0]=121)OR (Buffer↑[0]=49)OR ( Buffer↑[0]=116)OR (Buffer↑[0]=32) ELSE BEGIN PascalWriteLongString[file: @TermOut, item: "Type Y to list characters pictorially"]; {PascalWriteLongString[file: @TermOut, item: " with *'s, N to omit this option."]; PascalWriteLn[file: @TermOut]}; GOTO Label2; END--:33--; --34:--PascalWriteLongString[file: @Output, item: "Options selected: Mnemonic output = "]; IF WantsMnemonics THEN PascalWriteLongString[file: @Output, item: "true"] ELSE PascalWriteLongString[file: @Output, item: "false"]; PascalWriteLongString[file: @Output, item: "; pixel output = "]; IF WantsPixels THEN PascalWriteLongString[file: @Output, item: "true"] ELSE PascalWriteLongString[file: @Output, item: "false"];{PascalWriteLongString[file: @Output, item: "."]--:34--; PascalWriteLn[file: @Output]}; EXIT; EXITS Label2 => NULL} ENDLOOP;EXIT; EXITS Label1 => NULL} ENDLOOP; END;--:31----45:-- PrintScaled: PROCEDURE[S: PascalInteger] = BEGIN Delta:PascalInteger; IF S<0 THEN BEGIN PascalWriteLongString[file: @Output, item: "-"];S←-S; END; PascalWriteInteger[file: @Output, item: PascalDIVPower2[S ,16], fieldMinLength: 1]; S←10*( PascalMODPower2Mask[S ,65535])+5;IF S#5 THEN BEGIN Delta←10;PascalWriteLongString[file: @Output, item: "."]; DO IF Delta>65536 THEN S←S+32768-( PascalDIVPower2[Delta ,1]); PascalWriteChar[file: @Output, item: PascalCHR[PascalORD['0]+( PascalDIVPower2[S ,16])]];S←10*( PascalMODPower2Mask[S ,65535]);Delta←Delta*10; IF S<=Delta THEN EXIT; ENDLOOP; END; END;--:45----48: FirstPar: PROCEDURE[O: EightBits] RETURNS[FirstParResult: PascalInteger] = BEGIN SELECT O FROM 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21, 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45, 46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 =>FirstParResult←O-0; 64,71,245,246,239 =>FirstParResult←GetByte[]; 65,72,240 =>FirstParResult←GetTwoBytes[];66,73,241 =>FirstParResult←GetThreeBytes[]; 242,243 =>FirstParResult←SignedQuad[]; 67,68,69,70,244,247,248,249,250,251,252,253,254,255 =>FirstParResult←0; 74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97, 98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115, 116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133, 134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187, 188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205, 206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238 =>FirstParResult←O -74; ENDCASE; END;--:48----49:----:61----66:-- Error9999: ERROR = CODE; GFTypeRun: UnsafeCommandProc = BEGIN --69:-- {ENABLE Error9999 => GOTO Label9999;FileRewrite[@Output,Alfa['t, 'y, 'p, ' , ' , ' , ' , ' , ' , ' ]];Initialize[];Dialog[]; --68:--OpenGfFile[];O←GetByte[]; IF O#247 THEN BEGIN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLongString[file: @Output, item: "Bad GF file: "] ; PascalWriteLongString[file: @Output, item: "First byte isn't start of preamble!"]; PascalWriteLongString[file: @Output, item: "!"]};JumpOut[]; END;O←GetByte[]; IF O#131 THEN BEGIN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLongString[file: @Output, item: "Bad GF file: "] ; PascalWriteLongString[file: @Output, item: "identification byte should be "]; PascalWriteInteger[file: @Output, item: 131, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: " not "]; PascalWriteInteger[file: @Output, item: O, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: "!"]};JumpOut[]; END; O←GetByte[];PascalWriteLongString[file: @Output, item: "'"];WHILE O>0 DO BEGIN O←O-1;PascalWriteChar[file: @Output, item: Xchr↑[GetByte[]]]; END ENDLOOP ;{PascalWriteLongString[file: @Output, item: "'"]; PascalWriteLn[file: @Output]};--:68--DO GfPrevPtr←CurLoc;--70: DO A←CurLoc;O←GetByte[];P←FirstPar[O]; IF PascalEOF[file: @GfFile.baseFile] THEN BEGIN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLongString[file: @Output, item: "Bad GF file: "] ; PascalWriteLongString[file: @Output, item: "the file ended prematurely"]; PascalWriteLongString[file: @Output, item: "!"]};JumpOut[]; END;IF O=243 THEN BEGIN--55: BEGIN IF WantsMnemonics THEN BEGIN PascalWriteLn[file: @Output]; {PascalWriteInteger[file: @Output, item: A, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ": "]; PascalWriteLongString[file: @Output, item: "yyy "]; PascalWriteInteger[file: @Output, item: P, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: " ("]}; END; IF WantsMnemonics THEN BEGIN PrintScaled[P];PascalWriteLongString[file: @Output, item: ")"]; END; END--:55--; O←244; END ELSE IF(O>=239)AND (O<=242) THEN BEGIN--53: BEGIN IF WantsMnemonics THEN BEGIN PascalWriteLn[file: @Output];{PascalWriteInteger[file: @Output, item: A, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ": "]; PascalWriteLongString[file: @Output, item: "xxx '"]}; END;BadChar←FALSE;B←16;IF P<0 THEN BEGIN PascalWriteLn[file: @Output]; {PascalWriteInteger[file: @Output, item: A, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ": "]; PascalWriteLongString[file: @Output, item: "! "]; PascalWriteLongString[file: @Output, item: "string of negative length!"]};PascalWriteLn[file: @Output]; END; WHILE P>0 DO BEGIN Q←GetByte[];IF(Q<32)OR (Q>126) THEN BadChar←TRUE; IF WantsMnemonics THEN BEGIN PascalWriteChar[file: @Output, item: Xchr↑[Q]]; IF B<LineLength THEN B←B+1 ELSE BEGIN PascalWriteLn[file: @Output];B←2; END; END;P←P-1; END ENDLOOP ; IF WantsMnemonics THEN PascalWriteLongString[file: @Output, item: "'"];IF BadChar THEN BEGIN PascalWriteLn[file: @Output]; {PascalWriteInteger[file: @Output, item: A, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ": "]; PascalWriteLongString[file: @Output, item: "! "]; PascalWriteLongString[file: @Output, item: "non-ASCII character in xxx command!"]};PascalWriteLn[file: @Output]; END; END--:53--;O←244; END ELSE IF O=244 THEN IF WantsMnemonics THEN BEGIN PascalWriteLn[file: @Output]; {PascalWriteInteger[file: @Output, item: A, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ": "]; PascalWriteLongString[file: @Output, item: "no op"]}; END; IF O#244 THEN EXIT; ENDLOOP;--:70--IF O#248 THEN BEGIN IF O#67 THEN IF O#68 THEN BEGIN {PascalWriteLongString[file: @Output, item: " "] ; PascalWriteLongString[file: @Output, item: "Bad GF file: "]; PascalWriteLongString[file: @Output, item: "byte "]; PascalWriteInteger[file: @Output, item: CurLoc-1, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: " is not boc ("]; PascalWriteInteger[file: @Output, item: O, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ")"]; PascalWriteLongString[file: @Output, item: "!"]}; JumpOut[]; END;PascalWriteLn[file: @Output];{PascalWriteInteger[file: @Output, item: CurLoc-1, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ": beginning of char "]};--71: A←CurLoc-1;TotalChars←TotalChars+1; IF O=67 THEN BEGIN CharacterCode←SignedQuad[];P←SignedQuad[]; C← PascalMODPower2Mask[CharacterCode ,255];IF C<0 THEN C←C+256; MinMStated←SignedQuad[];MaxMStated←SignedQuad[]; MinNStated←SignedQuad[];MaxNStated←SignedQuad[]; END ELSE BEGIN CharacterCode←GetByte[];P←-1;C←CharacterCode; Q←GetByte[];MaxMStated←GetByte[];MinMStated←MaxMStated-Q; Q←GetByte[];MaxNStated←GetByte[];MinNStated←MaxNStated-Q; END; PascalWriteInteger[file: @Output, item: C, fieldMinLength: 1]; IF CharacterCode#C THEN {PascalWriteLongString[file: @Output, item: " with extension "] ; PascalWriteInteger[file: @Output, item: PascalDIVPower2[(CharacterCode-C),8], fieldMinLength: 1]}; IF WantsMnemonics THEN {PascalWriteLongString[file: @Output, item: ": "]; PascalWriteInteger[file: @Output, item: MinMStated, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: "<=m<="]; PascalWriteInteger[file: @Output, item: MaxMStated , fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: " "]; PascalWriteInteger[file: @Output, item: MinNStated, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: "<=n<="]; PascalWriteInteger[file: @Output, item: MaxNStated, fieldMinLength: 1]; PascalWriteLn[file: @Output]};MaxMObserved←-1; IF CharPtr↑[C]#P THEN BEGIN {PascalWriteInteger[file: @Output, item: A, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ": "]; PascalWriteLongString[file: @Output, item: "! "] ; PascalWriteLongString[file: @Output, item: "previous character pointer should be "]; PascalWriteInteger[file: @Output, item: CharPtr↑[C], fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ", not "]; PascalWriteInteger[file: @Output, item: P, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: "!"]}; PascalWriteLn[file: @Output]; END ELSE IF P>0 THEN IF WantsMnemonics THEN { PascalWriteLongString[file: @Output, item: "(previous character with the same code started at byte "]; PascalWriteInteger[file: @Output, item: P, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ")"]; PascalWriteLn[file: @Output]}; CharPtr↑[C]←GfPrevPtr; IF WantsMnemonics THEN {PascalWriteLongString[file: @Output, item: "(initially n="]; PascalWriteInteger[file: @Output, item: MaxNStated, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ")"]}; IF WantsPixels THEN--38:--BEGIN MaxSubcol←MaxMStated-MinMStated-1; IF MaxSubcol>79 THEN MaxSubcol←79; MaxSubrow←MaxNStated-MinNStated; IF MaxSubrow>79 THEN MaxSubrow←79;N←0; WHILE N<=MaxSubrow DO BEGIN M←0; WHILE M<=MaxSubcol DO BEGIN ImageArray↑[M][N]←0;M←M+1; END ENDLOOP ;N←N+1; END ENDLOOP ; END--:38--;M←0;N←0;PaintSwitch←0;--:71--IF NOT DoChar [] THEN BEGIN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLongString[file: @Output, item: "Bad GF file: "] ; PascalWriteLongString[file: @Output, item: "char ended unexpectedly"]; PascalWriteLongString[file: @Output, item: "!"]};JumpOut[]; END;MaxNObserved←N; IF WantsPixels THEN--40:--BEGIN--42: IF(MaxMObserved>79)OR (MaxNObserved>79) THEN { PascalWriteLongString[file: @Output, item: "(The character is too large to be displayed in full.)"]; PascalWriteLn[file: @Output]}; IF MaxSubcol>MaxMObserved THEN MaxSubcol←MaxMObserved; IF MaxSubrow>MaxNObserved THEN MaxSubrow←MaxNObserved;--:42--IF MaxSubcol>=0 THEN--43: BEGIN {PascalWriteLongString[file: @Output, item: ".<--This pixel's lower left corner is at ("]; PascalWriteInteger[file: @Output, item: MinMStated , fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ","]; PascalWriteInteger[file: @Output, item: MaxNStated+1, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ") in METAFONT coordinates"]; PascalWriteLn[file: @Output]};N←0; WHILE N<=MaxSubrow DO BEGIN M←0;B←0; WHILE M<=MaxSubcol DO BEGIN IF ImageArray↑[M][N]=0 THEN B←B+1 ELSE BEGIN WHILE B>0 DO BEGIN PascalWriteLongString[file: @Output, item: " "];B←B-1; END ENDLOOP ;PascalWriteLongString[file: @Output, item: "*"]; END;M←M+1; END ENDLOOP ;PascalWriteLn[file: @Output];N←N+1; END ENDLOOP ; {PascalWriteLongString[file: @Output, item: ".<--This pixel's upper left corner is at ("]; PascalWriteInteger[file: @Output, item: MinMStated, fieldMinLength: 1] ; PascalWriteLongString[file: @Output, item: ","]; PascalWriteInteger[file: @Output, item: MaxNStated-MaxSubrow, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: ") in METAFONT coordinates"]; PascalWriteLn[file: @Output]}; END--:43 ELSE {PascalWriteLongString[file: @Output, item: "(The character is entirely blank.)"]; PascalWriteLn[file: @Output]}; END--:40--;--72: MaxMObserved←MinMStated+MaxMObserved+1; N←MaxNStated-MaxNObserved; IF MinMStated<MinMOverall THEN MinMOverall←MinMStated; IF MaxMObserved>MaxMOverall THEN MaxMOverall←MaxMObserved; IF N<MinNOverall THEN MinNOverall←N; IF MaxNStated>MaxNOverall THEN MaxNOverall←MaxNStated; IF MaxMObserved>MaxMStated THEN { PascalWriteLongString[file: @Output, item: "The previous character should have had max m >= "]; PascalWriteInteger[file: @Output, item: MaxMObserved, fieldMinLength: 1]; PascalWriteLn[file: @Output]}; IF N<MinNStated THEN { PascalWriteLongString[file: @Output, item: "The previous character should have had min n <= "]; PascalWriteInteger[file: @Output, item: N, fieldMinLength: 1]--:72--; PascalWriteLn[file: @Output]}; END; IF O=248 THEN EXIT; ENDLOOP;--:69--PascalWriteLn[file: @Output];ReadPostamble[]; {PascalWriteLongString[file: @Output, item: "The file had "]; PascalWriteInteger[file: @Output, item: TotalChars, fieldMinLength: 1]; PascalWriteLongString[file: @Output, item: " character"]}; IF TotalChars#1 THEN PascalWriteLongString[file: @Output, item: "s"];PascalWriteLongString[file: @Output, item: " altogether."]; EXITS Label9999 => NULL};FileClose[@Output];ByteFileClose[@GfFile];--:66 END; PascalRegister["GFType", GFTypeRun]; END.