-- file: TFtoPLMiscImpl.mesa
-- Pascal-to-Mesa translator output, translated at September 23, 1986 1:04:35 pm PDT
DIRECTORY
PascalBasic,
PascalWizardFiles,
TFtoPLPrivate,
TFtoPLExternals,
TFtoPLMain;
TFtoPLMiscImpl: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, TFtoPLExternals, TFtoPLMain EXPORTS TFtoPLPrivate = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, TFtoPLPrivate, TFtoPLExternals, TFtoPLMain;
--:89
Initialize: PROCEDURE =
BEGIN {PascalWriteLongString[file: @Output, item: "This is TFtoPL 2.4 for Cedar 6.0"]; PascalWriteLn[file: @Output]};
--7:--ByteFileReset[@TfmFile,Alfa['t, 'f, 'm, ' , ' , ' , ' , ' , ' , ' ]];--:7----17:
FileRewrite[@PlFile,Alfa['p, 'l, ' , ' , ' , ' , ' , ' , ' , ' ]];--:17----28:
Ascii04↑←[' , '!, '", '#, '$, '%, '&, '', '(, '), '*, '+, ',, '-, '., '/, '0, '1, '2, '3, '4, '5, '6, '7, '8, '9, ':, ';, '<, '=, '>, '?];
Ascii10↑←['@, 'A, 'B, 'C, 'D, 'E, 'F, 'G, 'H, 'I, 'J, 'K, 'L, 'M, 'N, 'O, 'P, 'Q, 'R, 'S, 'T, 'U, 'V, 'W, 'X, 'Y, 'Z, '[, '\\, '], '↑, '←];
Ascii14↑←['`, 'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, 'n, 'o, 'p, 'q, 'r, 's, 't, 'u, 'v, 'w, 'x, 'y, 'z, '{, '|, '}, '~, ' ];MblString↑←['M, 'B, 'L];
RiString↑←['R, 'I, ' ];RceString↑←['R, 'C, 'E];--:28----33:--Level←0;--:33----46:
CharsOnLine←0;Perfect←TRUE;--:46----64:--LabelPtr←0;
LabelTable↑[0].Rr←0;--:64-- END;--:2----30:-- OutDigs: PROCEDURE[J: PascalInteger]
=
BEGIN DO J←J-1;PascalWriteInteger[file: @PlFile, item: Dig↑[J], fieldMinLength: 1]; IF J=0 THEN EXIT; ENDLOOP; END;
PrintDigs: PROCEDURE[J: PascalInteger] =
BEGIN DO J←J-1;PascalWriteInteger[file: @Output, item: Dig↑[J], fieldMinLength: 1];
IF J=0 THEN EXIT; ENDLOOP; END;--:30----31:-- PrintOctal: PROCEDURE[C: Byte] =
BEGIN J:PascalInteger[0..2];
PascalWriteLongString[file: @Output, item: "'"];FOR i:INT IN [ INT[0 ].. INT[2 ]] DO J ← i; Dig↑[J]← PascalMODPower2Mask[C ,7];C← PascalDIVPower2[C ,3]; ENDLOOP;
PrintDigs[3]; END;--:31----34:-- OutLn: PROCEDURE =
BEGIN L:PascalInteger[0..5];
PascalWriteLn[file: @PlFile];FOR i:INT IN [ INT[1 ].. INT[Level ]] DO L ← i; PascalWriteLongString[file: @PlFile, item: " "] ENDLOOP; END;
Left: PROCEDURE =
BEGIN Level←Level+1;PascalWriteLongString[file: @PlFile, item: "("]; END;
Right: PROCEDURE =
BEGIN Level←Level-1;PascalWriteLongString[file: @PlFile, item: ")"];OutLn[]; END;--:34
--35:-- OutBcpl: PROCEDURE[K: Index] =
BEGIN L:PascalInteger[0..39]; PascalWriteLongString[file: @PlFile, item: " "];
L←Tfm↑[K];WHILE INT[L]>0 DO BEGIN K←K+1;L←L-1;
SELECT PascalDIVPower2[Tfm↑[K],5]FROM 1 =>PascalWriteChar[file: @PlFile, item: Ascii04↑[1+( PascalMODPower2Mask[Tfm↑[K],31])]];
2 =>PascalWriteChar[file: @PlFile, item: Ascii10↑[1+( PascalMODPower2Mask[Tfm↑[K],31])]];
3 =>PascalWriteChar[file: @PlFile, item: Ascii14↑[1+( PascalMODPower2Mask[Tfm↑[K],31])]]; ENDCASE; END ENDLOOP ; END;--:35----36:
OutOctal: PROCEDURE[K,L: Index] =
BEGIN A:PascalInteger[0..1023];B:PascalInteger[0..32];J:PascalInteger[0..11];
PascalWriteLongString[file: @PlFile, item: " O "];A←0;B←0;J←0;WHILE INT[L]>0 DO--37:--BEGIN L←L-1;
IF Tfm↑[K+L]#0 THEN BEGIN WHILE INT[B]>2 DO BEGIN Dig↑[J]← PascalMODPower2Mask[A ,7];A← PascalDIVPower2[A ,3];
B←B-3;J←J+1; END ENDLOOP ;SELECT B FROM 0 =>A←Tfm↑[K+L];1 =>A←A+2*Tfm↑[K+L];
2 =>A←A+4*Tfm↑[K+L]; ENDCASE; END;B←B+8; END--:37-- ENDLOOP ;
WHILE( INT[A]>0)OR (J=0)DO BEGIN Dig↑[J]← PascalMODPower2Mask[A ,7];A← PascalDIVPower2[A ,3];J←J+1; END ENDLOOP ;
OutDigs[J]; END;--:36----38:-- OutChar: PROCEDURE[C: Byte]
=
BEGIN IF INT[FontType]>0 THEN BEGIN Tfm↑[0]←C;
OutOctal[0,1]; END ELSE IF( INT[C]>=48)AND ( INT[C]<=57) THEN {PascalWriteLongString[file: @PlFile, item: " C "]; PascalWriteInteger[file: @PlFile, item: C-48
, fieldMinLength: 1]} ELSE IF( INT[C]>=65)AND ( INT[C]<=90) THEN {PascalWriteLongString[file: @PlFile, item: " C "]; PascalWriteChar[file: @PlFile, item: Ascii10↑[C-63]]} ELSE
IF( INT[C]>=97)AND ( INT[C]<=122) THEN {PascalWriteLongString[file: @PlFile, item: " C "]; PascalWriteChar[file: @PlFile, item: Ascii14↑[C-95]]} ELSE BEGIN
Tfm↑[0]←C;OutOctal[0,1]; END; END;--:38----39:-- OutFace: PROCEDURE[K: Index]
=
BEGIN S:PascalInteger[0..1];B:PascalInteger[0..8];
IF INT[Tfm↑[K]]>=18 THEN OutOctal[K,1] ELSE BEGIN PascalWriteLongString[file: @PlFile, item: " F "];
S← PascalMODPower2Mask[Tfm↑[K],1];B← PascalDIVPower2[Tfm↑[K],1];PascalWriteChar[file: @PlFile, item: MblString↑[1+( B MOD 3)]];
PascalWriteChar[file: @PlFile, item: RiString↑[1+S]];PascalWriteChar[file: @PlFile, item: RceString↑[1+( B /3)]];
END; END;--:39----40:-- OutFix: PROCEDURE[K: Index] =
BEGIN A:PascalInteger[0..4095];F:PascalInteger;
J:PascalInteger[0..12];Delta:PascalInteger; PascalWriteLongString[file: @PlFile, item: " R "];
A←(Tfm↑[K]*16)+( PascalDIVPower2[Tfm↑[K+1],4]);
F←(( PascalMODPower2Mask[Tfm↑[K+1],15])*256+Tfm↑[K+2])*256+Tfm↑[K+3];IF INT[A]>2047 THEN--43:
BEGIN PascalWriteLongString[file: @PlFile, item: "-"];A←4096-A;IF F>0 THEN BEGIN F←1048576-F;
A←A-1; END; END--:43--;--41:--BEGIN J←0;DO Dig↑[J]← A MOD 10;A← A /10;
J←J+1; IF A=0 THEN EXIT; ENDLOOP;OutDigs[J]; END--:41--;--42:--BEGIN PascalWriteLongString[file: @PlFile, item: "."];
F←10*F+5;Delta←10;
DO IF Delta>1048576 THEN F←F+524288-( PascalDIVPower2[Delta ,1]);
PascalWriteInteger[file: @PlFile, item: PascalDIVPower2[F ,20], fieldMinLength: 1];F←10*( PascalMODPower2Mask[F ,1048575]);Delta←Delta*10;
IF F<=Delta THEN EXIT; ENDLOOP; END;--:42-- END;--:40----52:-- CheckBcpl: PROCEDURE[K,L: Index]
=
BEGIN J:Index;C:Byte; IF INT[Tfm↑[K]]>=L 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: "String is too long; I've shortened it drastically."]; PascalWriteLn[file: @Output]}; END;Tfm↑[K]←1;
END;FOR i:INT IN [ INT[K+1 ].. INT[K+Tfm↑[K]]] DO J ← i; C←Tfm↑[J];
IF(C=40)OR (C=41) 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: "Parenthesis in string has been changed to slash."]; PascalWriteLn[file: @Output]}; END;Tfm↑[J]←47;
END ELSE IF( INT[C]<32)OR ( INT[C]>126) 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: "Nonstandard ASCII code has been blotted out."]
; PascalWriteLn[file: @Output]}; END;Tfm↑[J]←63; END ELSE IF( INT[C]>=97)AND ( INT[C]<=122) THEN Tfm↑[J]←C-32; ENDLOOP; END;
END.