-- file: TFtoPLMain.mesa -- Pascal-to-Mesa translator output, translated at September 14, 1985 3:12:44 pm PDT DIRECTORY PascalBasic, PascalWizardFiles, TFtoPLPrivate, TFtoPLExternals; TFtoPLMain: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, TFtoPLPrivate, TFtoPLExternals EXPORTS = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, TFtoPLPrivate, TFtoPLExternals; --2:-- --3:----:3----:90----6:-- TfmFile: ByteFile; --:6----8: Lf: PascalInteger[0..32767]; Lh: PascalInteger[0..32767]; Bc: PascalInteger[0..32767]; Ec: PascalInteger[0..32767]; Nw: PascalInteger[0..32767]; Nh: PascalInteger[0..32767]; Nd: PascalInteger[0..32767]; Ni: PascalInteger[0..32767]; Nl: PascalInteger[0..32767]; Nk: PascalInteger[0..32767]; Ne: PascalInteger[0..32767]; Np: PascalInteger[0..32767]; --:8----16:-- PlFile: Text; --:16 --19:--Tfm: LONG POINTER TO ARRAY PascalInteger[-1000..20000] OF Byte ← PascalStaticZone.NEW[ARRAY PascalInteger[-1000..20000] OF Byte]; --:19----22: CharBase: PascalInteger; WidthBase: PascalInteger; HeightBase: PascalInteger; DepthBase: PascalInteger; ItalicBase: PascalInteger; LigKernBase: PascalInteger; KernBase: PascalInteger; ExtenBase: PascalInteger; ParamBase: PascalInteger; --:22----25:-- FontType: PascalInteger[0..2]; --:25 --27:--Ascii04: LONG POINTER TO PACKED ARRAY PascalInteger[1..32] OF PascalChar ← PascalStaticZone.NEW[PACKED ARRAY PascalInteger[1..32] OF PascalChar]; Ascii10: LONG POINTER TO PACKED ARRAY PascalInteger[1..32] OF PascalChar ← PascalStaticZone.NEW[PACKED ARRAY PascalInteger[1..32] OF PascalChar]; Ascii14: LONG POINTER TO PACKED ARRAY PascalInteger[1..32] OF PascalChar ← PascalStaticZone.NEW[PACKED ARRAY PascalInteger[1..32] OF PascalChar]; MblString: LONG POINTER TO PACKED ARRAY PascalInteger[1..3] OF PascalChar ← PascalStaticZone.NEW[PACKED ARRAY PascalInteger[1..3] OF PascalChar]; RiString: LONG POINTER TO PACKED ARRAY PascalInteger[1..3] OF PascalChar ← PascalStaticZone.NEW[PACKED ARRAY PascalInteger[1..3] OF PascalChar]; RceString: LONG POINTER TO PACKED ARRAY PascalInteger[1..3] OF PascalChar ← PascalStaticZone.NEW[PACKED ARRAY PascalInteger[1..3] OF PascalChar]; --:27----29: Dig: LONG POINTER TO ARRAY PascalInteger[0..11] OF PascalInteger[0..9] ← PascalStaticZone.NEW[ARRAY PascalInteger[0..11] OF PascalInteger[0..9]]; --:29----32:-- Level: PascalInteger[0..5]; --:32----45: CharsOnLine: PascalInteger[0..8]; Perfect: PascalBoolean; --:45----47:-- I: PascalInteger[0..32767]; C: Byte; R: Byte; K: Index; --:47----63:--LabelTable: LONG POINTER TO ARRAY PascalInteger[0..257] OF RECORD[Cc: Byte, Rr: PascalInteger[0..256]] ← PascalStaticZone.NEW[ARRAY PascalInteger[0..257] OF RECORD[Cc: Byte, Rr: PascalInteger[0..256]]]; LabelPtr: PascalInteger[0..256]; SortPtr: PascalInteger[0..256]; --:63----68:-- Active: PascalBoolean; --:68----91: Output: Text; TFtoPLRun: UnsafeCommandProc = BEGIN TtyRewrite[@Output];Initialize[]; {IF NOT Organize [] THEN GOTO Label9999;DoSimpleThings[];--65:----66: FOR i:INT IN [ INT[Bc ].. INT[Ec ]] DO C ← i; IF( Tfm↑[4*(CharBase+C)+2]MOD 4)=1 THEN BEGIN R←Tfm↑[4 *(CharBase+C)+3];IF INT[R]>=Nl THEN BEGIN BEGIN Perfect←FALSE;{PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; {PascalWriteLongString[file: @Output, item: "Ligature/kern"]; PascalWriteLongString[file: @Output, item: " index for character "]};PrintOctal[C]; {PascalWriteLongString[file: @Output, item: " is too large;"]; PascalWriteLn[file: @Output]};{PascalWriteLongString[file: @Output, item: "so I reset it to zero."]; PascalWriteLn[file: @Output]}; END; Tfm↑[4*(CharBase+C)+2]←4*( Tfm↑[4*(CharBase+C)+2]/4)+0; END ELSE--67: BEGIN SortPtr←LabelPtr; WHILE INT[LabelTable↑[SortPtr].Rr]>R DO BEGIN LabelTable↑[SortPtr+1]← LabelTable↑[SortPtr];SortPtr←SortPtr-1; END ENDLOOP ; LabelTable↑[SortPtr+1].Cc←C;LabelTable↑[SortPtr+1].Rr←R; LabelPtr←LabelPtr+1; END--:67--; END ENDLOOP;LabelTable↑[LabelPtr+1].Rr←256; --:66--IF INT[Nl]>0 THEN BEGIN Left[];PascalWriteLongString[file: @PlFile, item: "LIGTABLE"];OutLn[];--69: Active←FALSE;SortPtr←1;FOR i:INT IN [ INT[0 ].. INT[Nl-1 ]] DO I ← i; --70: WHILE I=LabelTable↑[SortPtr].Rr DO BEGIN IF INT[Level]>1 THEN Right[]; Active←TRUE;Left[];PascalWriteLongString[file: @PlFile, item: "LABEL"]; OutChar[LabelTable↑[SortPtr].Cc];Right[];SortPtr←SortPtr+1; END--:70-- ENDLOOP ; IF NOT Active THEN--71:--BEGIN Left[]; PascalWriteLongString[file: @PlFile, item: "COMMENT THIS PART OF THE PROGRAM IS NEVER USED!"];OutLn[]; Active←TRUE; END--:71--;--72:--BEGIN K←4*(LigKernBase+I); IF INT[Tfm↑[K+2]]>=128 THEN--73: BEGIN IF(( INT[Tfm↑[K+1]]<Bc)OR ( INT[Tfm↑[K+1]]>Ec)OR (Tfm↑[4*(CharBase+Tfm↑[K+1])]=0)) THEN BEGIN Perfect←FALSE;IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; CharsOnLine←0; {PascalWriteLongString[file: @Output, item: "Bad TFM file: "]; PascalWriteLongString[file: @Output, item: "Kern step for"]; PascalWriteLongString[file: @Output, item: " nonexistent character "]}; PrintOctal[Tfm↑[K+1]];{PascalWriteLongString[file: @Output, item: "."]; PascalWriteLn[file: @Output]}; END ELSE BEGIN Left[]; PascalWriteLongString[file: @PlFile, item: "KRN"];OutChar[Tfm↑[K+1]]; IF INT[Tfm↑[K+3]]>=Nk THEN BEGIN BEGIN Perfect←FALSE; IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};CharsOnLine←0; {PascalWriteLongString[file: @Output, item: "Bad TFM file: "]; PascalWriteLongString[file: @Output, item: "Kern index too large."]; PascalWriteLn[file: @Output]}; END; PascalWriteLongString[file: @PlFile, item: " R 0.0"]; END ELSE OutFix[4*(KernBase+Tfm↑[K+3])];Right[]; END; END--:73-- ELSE--74: BEGIN IF(( INT[Tfm↑[K+1]]<Bc)OR ( INT[Tfm↑[K+1]]>Ec)OR (Tfm↑[4*(CharBase+Tfm↑[K+1])]=0)) THEN BEGIN Perfect←FALSE;IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; CharsOnLine←0; {PascalWriteLongString[file: @Output, item: "Bad TFM file: "]; PascalWriteLongString[file: @Output, item: "Ligature step for"]; PascalWriteLongString[file: @Output, item: " nonexistent character "]}; PrintOctal[Tfm↑[K+1]];{PascalWriteLongString[file: @Output, item: "."]; PascalWriteLn[file: @Output]}; END; IF(( INT[Tfm↑[K+3]]<Bc)OR ( INT[Tfm↑[K+3]]>Ec)OR (Tfm↑[4*(CharBase+Tfm↑[K+3])]=0)) THEN BEGIN Perfect←FALSE;IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]}; CharsOnLine←0;{PascalWriteLongString[file: @Output, item: "Bad TFM file: "]; PascalWriteLongString[file: @Output, item: "Ligature step produces the"] ; PascalWriteLongString[file: @Output, item: " nonexistent character "]};PrintOctal[Tfm↑[K+3]];{PascalWriteLongString[file: @Output, item: "."]; PascalWriteLn[file: @Output]}; END ELSE BEGIN Left[];PascalWriteLongString[file: @PlFile, item: "LIG"];OutChar[Tfm↑[K+1]]; OutChar[Tfm↑[K+3]];Right[]; END; END--:74--; IF INT[Tfm↑[K]]>=128 THEN BEGIN IF INT[SortPtr]>0 THEN BEGIN PascalWriteLongString[file: @PlFile, item: "(STOP)"];OutLn[];IF INT[Level]>1 THEN Right[]; END;Active←FALSE; END; END--:72--; ENDLOOP;IF Active THEN BEGIN BEGIN Perfect←FALSE; IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};CharsOnLine←0; {PascalWriteLongString[file: @Output, item: "Bad TFM file: "] ; PascalWriteLongString[file: @Output, item: "No stop bit at the end of ligature/kern program."]; PascalWriteLn[file: @Output]}; END; BEGIN PascalWriteLongString[file: @PlFile, item: "(STOP)"];OutLn[];IF INT[Level]>1 THEN Right[]; END; Tfm↑[4*(KernBase+0)-4]←Tfm↑[4*(KernBase+0)-4]+128; END--:69--;Right[]; END--:65--;--75: IF INT[Ne]>0 THEN FOR i:INT IN [ INT[0 ].. INT[Ne-1 ]] DO C ← i; FOR i:INT IN [ INT[0 ].. INT[3 ]] DO R ← i; K←4*(ExtenBase +C)+R; IF( INT[Tfm↑[K]]>0)OR (R=3) THEN BEGIN IF(( INT[Tfm↑[K]]<Bc)OR ( INT[Tfm↑[K]]>Ec)OR (Tfm↑[4*( CharBase+Tfm↑[K])]=0)) THEN BEGIN BEGIN Perfect←FALSE; IF INT[CharsOnLine]>0 THEN {PascalWriteLongString[file: @Output, item: " "]; PascalWriteLn[file: @Output]};CharsOnLine←0; {PascalWriteLongString[file: @Output, item: "Bad TFM file: "]; PascalWriteLongString[file: @Output, item: "Extensible recipe involves the"] ; PascalWriteLongString[file: @Output, item: " nonexistent character "]};PrintOctal[Tfm↑[K]];{PascalWriteLongString[file: @Output, item: "."]; PascalWriteLn[file: @Output]}; END; IF INT[R]<3 THEN Tfm↑[K]←0; END; END;--:75-- ENDLOOP ENDLOOP;DoCharacters[];{PascalWriteLongString[file: @Output, item: "."]; PascalWriteLn[file: @Output]}; IF Level#0 THEN {PascalWriteLongString[file: @Output, item: "This program isn't working!"]; PascalWriteLn[file: @Output]}; IF NOT Perfect THEN PascalWriteLongString[file: @PlFile, item: "(COMMENT THE TFM FILE WAS BAD, SO THE DATA HAS BEEN CHANGED!)"]; EXITS Label9999 => NULL};FileClose[@PlFile];ByteFileClose[@TfmFile];--:88 END; PascalRegister["TFtoPL", TFtoPLRun]; END.