-- file: TexHyphImpl.mesa
-- Pascal-to-Mesa translator output, translated at September 27, 1985 10:21:38 am PDT
DIRECTORY
PascalBasic,
TexTypes,
TexInit,
TexInteraction,
TexMemory,
TexSymbols,
TexScan,
TexParagraph,
TexSysdepInline;
TexHyphImpl: PROGRAM IMPORTS PascalBasic, TexTypes, TexInit, TexInteraction, TexMemory, TexSymbols, TexScan, TexParagraph, TexSysdepInline EXPORTS TexParagraph = PUBLIC
BEGIN OPEN PascalBasic, TexTypes, TexInit, TexInteraction, TexMemory, TexSymbols, TexScan, TexParagraph, TexSysdepInline;
Hyphenate: PROCEDURE =
BEGIN
--901:--I, J, L:PascalInteger[0..65];Q, R, S:Halfword;--:901----912:
MajorTail, MinorTail:Halfword;C:AsciiCode;--:912----922:--Z:TriePointer;
V:Quarterword;--:922----929:--H:HyphPointer;K:StrNumber;U:PoolPointer;
--:929----923:-- --903:
FOR i:INT IN [ INT[0 ].. INT[Hn ]] DO J ← i; Hyf↑[J]←0 ENDLOOP;--930:--H←Hc↑[1];
FOR i:INT IN [ INT[2 ].. INT[Hn ]] DO J ← i; H← ( INT[H+H]+Hc↑[J])MOD 307 ENDLOOP;{{WHILE TRUE DO BEGIN--931:
K←HyphWord↑[H];IF K=0 THEN GOTO Label45;
IF( INT[StrStart↑[K+1]]-StrStart↑[K])<Hn THEN GOTO Label45;
{IF( INT[StrStart↑[K+1]]-StrStart↑[K])=Hn THEN BEGIN J←1;U←StrStart↑[K];
DO IF INT[StrPool↑[U]]<Hc↑[J] THEN GOTO Label45;
IF INT[StrPool↑[U]]>Hc↑[J] THEN GOTO Label30;J←J+1;U←U+1; IF INT[J]>Hn THEN EXIT; ENDLOOP;--932:
S←HyphList↑[H];WHILE S#0 DO BEGIN Hyf↑[Mem[S]↑.Hh.Lh]←1;
S←Mem[S]↑.Hh.Rh; END--:932-- ENDLOOP ; GOTO Label40; END;EXITS Label30 => NULL};--:931--IF INT[H]>0 THEN H←H-1 ELSE H←307; END ENDLOOP ;EXITS Label45 => NULL};--:930--Hc↑[0]←127;Hc↑[Hn+1]←127;
Hc↑[Hn+2]←256;FOR i:INT IN [ INT[0 ].. INT[Hn-2 ]] DO J ← i; Z←Hc↑[J];L←J;
WHILE Hc↑[L]=Trie↑[Z].B1 DO BEGIN IF Trie↑[Z].B0#0 THEN--924:
BEGIN V←Trie↑[Z].B0;DO I←L-HyfDistance↑[V];
IF INT[HyfNum↑[V]]>Hyf↑[I] THEN Hyf↑[I]←HyfNum↑[V];V←HyfNext↑[V]; IF V=0 THEN EXIT; ENDLOOP;
END--:924--;L←L+1;Z← INT[Trie↑[Z].Rh]+Hc↑[L]; END ENDLOOP ; ENDLOOP;EXITS Label40 => NULL};Hyf↑[1]←0;Hyf↑[Hn-2]←0;
Hyf↑[Hn-1]←0;Hyf↑[Hn]←0--:923--;--902:
{{FOR i:INT IN [ INT[2 ].. INT[Hn-3 ]] DO J ← i; IF PascalODD[Hyf↑[J]] THEN GOTO Label41 ENDLOOP; GOTO Label10;EXITS Label41 => NULL};--:902--Q←Mem[Hb]↑.Hh.Rh;Mem[Hb]↑.Hh.Rh←0;S←CurP;
WHILE Mem[S]↑.Hh.Rh#Ha DO S←Mem[S]↑.Hh.Rh ENDLOOP ;Mem[S]↑.Hh.Rh←0;
FlushNodeList[Ha];--913:--J←0;DO L←J;J←Reconstitute[J+1,Hn];
IF HyphenPassed#0 THEN--914:--BEGIN R←GetNode[2];Mem[S]↑.Hh.Rh←R;
Mem[R]↑.Hh.Rh←Mem[64996]↑.Hh.Rh;Mem[R]↑.Hh.B0←7;
MajorTail←Mem[64996]↑.Hh.Rh;
IF Mem[MajorTail]↑.Hh.Rh#0 THEN MajorTail←Mem[MajorTail]↑.Hh.Rh;
I←HyphenPassed;--915:--MinorTail←0;C←Hu↑[I+1];
Hu↑[I+1]←HyphenChar↑[Hf];DO L←Reconstitute[L+1,I+1];
IF MinorTail=0 THEN Mem[R+1]↑.Hh.Lh←Mem[64996]↑.Hh.Rh ELSE Mem[
MinorTail]↑.Hh.Rh←Mem[64996]↑.Hh.Rh;MinorTail←Mem[64996]↑.Hh.Rh;
IF Mem[MinorTail]↑.Hh.Rh#0 THEN MinorTail←Mem[MinorTail]↑.Hh.Rh;
IF INT[L]>I THEN EXIT; ENDLOOP;Hu↑[I+1]←C;L←L-1;Hyf↑[L]←0--:915--;--916:--MinorTail←0;
Mem[R+1]↑.Hh.Rh←0;WHILE INT[L]<J DO BEGIN DO L←Reconstitute[L+1,Hn];
IF MinorTail=0 THEN Mem[R+1]↑.Hh.Rh←Mem[64996]↑.Hh.Rh ELSE Mem[
MinorTail]↑.Hh.Rh←Mem[64996]↑.Hh.Rh;MinorTail←Mem[64996]↑.Hh.Rh;
IF Mem[MinorTail]↑.Hh.Rh#0 THEN BEGIN Hyf↑[L]←0;
MinorTail←Mem[MinorTail]↑.Hh.Rh; END; IF INT[L]>=J THEN EXIT; ENDLOOP;
WHILE INT[L]>J DO BEGIN J←Reconstitute[J+1,Hn];
Mem[MajorTail]↑.Hh.Rh←Mem[64996]↑.Hh.Rh;MajorTail←Mem[64996]↑.Hh.Rh;
IF Mem[MajorTail]↑.Hh.Rh#0 THEN BEGIN Hyf↑[J]←0;
MajorTail←Mem[MajorTail]↑.Hh.Rh; END; END ENDLOOP ; END--:916-- ENDLOOP ;--917:--I←0;S←R;
WHILE Mem[S]↑.Hh.Rh#0 DO BEGIN I←I+1;S←Mem[S]↑.Hh.Rh; END ENDLOOP ;
Mem[R]↑.Hh.B1←I--:917--; END--:914
ELSE BEGIN Mem[S]↑.Hh.Rh←Mem[64996]↑.Hh.Rh;S←Mem[S]↑.Hh.Rh;
IF Mem[S]↑.Hh.Rh#0 THEN S←Mem[S]↑.Hh.Rh; END;IF PascalODD[Hyf↑[J]] THEN--918:
BEGIN R←NewDisc[];Mem[R+1]↑.Hh.Lh←NewCharacter[Hf,HyphenChar↑[Hf]];
Mem[S]↑.Hh.Rh←R;S←R; END--:918--; IF J=Hn THEN EXIT; ENDLOOP;Mem[S]↑.Hh.Rh←Q--:913----:903--;
EXITS Label10 => NULL}; END;--:895-- NewHyphExceptions: PROCEDURE =
BEGIN N:SmallNumber;
J:SmallNumber;H:HyphPointer;K:StrNumber;P:Halfword;Q:Halfword;
S, T:StrNumber;U, V:PoolPointer; ScanLeftBrace[];--935:--N←0;P←0;
{WHILE TRUE DO BEGIN GetXToken[];DO {--Label21:--SELECT CurCmd FROM 11,12,67 =>--937:
IF CurChr=45 THEN--938:--BEGIN IF INT[N]>1 THEN BEGIN Q←GetAvail[];
Mem[Q]↑.Hh.Rh←P;Mem[Q]↑.Hh.Lh←N;P←Q; END; END--:938
ELSE BEGIN IF( INT[CurChr]>127)OR (Eqtb↑[ INT[4255]+CurChr].Hh.Rh=0) THEN BEGIN BEGIN
IF Interaction=3 THEN NULL;PrintNl[134];Print[802]; END;BEGIN HelpPtr←2;
HelpLine↑[1]←803;HelpLine↑[0]←804; END;Error[];
END ELSE IF INT[N]<63 THEN BEGIN N←N+1;Hc↑[N]← INT[Eqtb↑[ INT[4255]+CurChr].Hh.Rh]-1;
END; END--:937--;16 =>BEGIN ScanCharNum[];CurChr←CurVal;CurCmd←67;
GOTO Label21; END;10,2 =>BEGIN IF INT[N]>4 THEN--939:
BEGIN BEGIN IF INT[PoolPtr+N]>PoolSize THEN Overflow[129,
PoolSize-InitPoolPtr]; END;H←0;FOR i:INT IN [ INT[1 ].. INT[N ]] DO J ← i; H← ( INT[H+H]+Hc↑[J])MOD 307;
BEGIN StrPool↑[PoolPtr]←Hc↑[J];PoolPtr←PoolPtr+1; END; ENDLOOP;
S←MakeString[];{WHILE TRUE DO BEGIN IF P=0 THEN GOTO Label30;
IF INT[Mem[P]↑.Hh.Lh]<N-2 THEN GOTO Label30;Q←Mem[P]↑.Hh.Rh;
BEGIN Mem[P]↑.Hh.Rh←Avail;Avail←P;DynUsed←DynUsed-1; END;P←Q; END ENDLOOP ;
EXITS Label30 => NULL};--940:--IF HyphCount=307 THEN Overflow[805,307];
HyphCount←HyphCount+1;WHILE HyphWord↑[H]#0 DO BEGIN--941:
K←HyphWord↑[H];
{{IF( INT[StrStart↑[K+1]]-StrStart↑[K])<( INT[StrStart↑[S+1]]-StrStart↑[S]) THEN
GOTO Label40;
IF( INT[StrStart↑[K+1]]-StrStart↑[K])>( INT[StrStart↑[S+1]]-StrStart↑[S]) THEN
GOTO Label45;U←StrStart↑[K];V←StrStart↑[S];
DO IF INT[StrPool↑[U]]<StrPool↑[V] THEN GOTO Label40;
IF INT[StrPool↑[U]]>StrPool↑[V] THEN GOTO Label45;U←U+1;V←V+1;
IF U=StrStart↑[K+1] THEN EXIT; ENDLOOP;EXITS Label40 => NULL};Q←HyphList↑[H];HyphList↑[H]←P;P←Q;
T←HyphWord↑[H];HyphWord↑[H]←S;S←T;EXITS Label45 => NULL};--:941--IF INT[H]>0 THEN H←H-1 ELSE H←307; END ENDLOOP ;HyphWord↑[H]←S;HyphList↑[H]←P--:940
; END--:939--;IF CurCmd=2 THEN GOTO Label10;N←0;P←0; END; ENDCASE =>--936:
BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[134];Print[539]; END;
PrintEsc[798];Print[799];BEGIN HelpPtr←2;HelpLine↑[1]←800;
HelpLine↑[0]←801; END;Error[]; END--:936--;EXIT; EXITS Label21 => NULL} ENDLOOP; END--:935-- ENDLOOP ;EXITS Label10 => NULL}; END;--:934----942:
--944:-- NewTrieOp: PROCEDURE[D,N: SmallNumber,V: Quarterword] RETURNS[NewTrieOpResult: Quarterword]
=
BEGIN H:PascalInteger[0..510];U:Quarterword; H← ABS[N+313*D+ INT[361]*V]MOD 510;
{WHILE TRUE DO BEGIN U←TrieOpHash↑[H];
IF U=0 THEN BEGIN IF TrieOpPtr=255 THEN BEGIN NewTrieOpResult←0; GOTO Label10;
END;TrieOpPtr←TrieOpPtr+1;HyfDistance↑[TrieOpPtr]←D;
HyfNum↑[TrieOpPtr]←N;HyfNext↑[TrieOpPtr]←V;
TrieOpHash↑[H]←TrieOpPtr;NewTrieOpResult←TrieOpPtr; GOTO Label10; END;
IF(HyfDistance↑[U]=D)AND (HyfNum↑[U]=N)AND (HyfNext↑[U]=V) THEN BEGIN
NewTrieOpResult←U; GOTO Label10; END;IF INT[H]>0 THEN H←H-1 ELSE H←510; END ENDLOOP ;EXITS Label10 => NULL}; END;
--:944----947:-- TrieNode: PROCEDURE[P: TriePointer] RETURNS[TrieNodeResult: TriePointer] =
BEGIN
H:TriePointer;Q:TriePointer;
H←
ABS[TrieC↑[P]+ INT[1009]*TrieO↑[P]+ INT[2718]*TrieL↑[P]+ INT[3142]*TrieR↑[P]]MOD TrieSize;{WHILE TRUE DO BEGIN Q←TrieHash↑[H];
IF Q=0 THEN BEGIN TrieHash↑[H]←P;TrieNodeResult←P; GOTO Label10; END;
IF(TrieC↑[Q]=TrieC↑[P])AND (TrieO↑[Q]=TrieO↑[P])AND (TrieL↑[Q]=TrieL↑[P])
AND (TrieR↑[Q]=TrieR↑[P]) THEN BEGIN TrieNodeResult←Q; GOTO Label10; END;
IF INT[H]>0 THEN H←H-1 ELSE H←TrieSize; END ENDLOOP ;EXITS Label10 => NULL}; END;--:947----948:
CompressTrie: PROCEDURE[P: TriePointer] RETURNS[CompressTrieResult: TriePointer]
=
BEGIN IF P=0 THEN CompressTrieResult←0 ELSE BEGIN TrieL↑[P]←CompressTrie[
TrieL↑[P]];TrieR↑[P]←CompressTrie[TrieR↑[P]];
CompressTrieResult←TrieNode[P]; END; END;--:948----949:
--:949----951:-- InitTrieMemory: PROCEDURE =
BEGIN P:TriePointer;
FOR i:INT IN [ INT[0 ].. INT[TriePtr ]] DO P ← i; TrieHash↑[P]←0 ENDLOOP;TrieMax←128;
TrieMin←128;Trie↑[0].Rh←1;TrieTaken↑[0]←FALSE;
FOR i:INT IN [ INT[1 ].. INT[128 ]] DO P ← i; Trie↑[P].Lh←P-1;Trie↑[P].Rh←P+1;
TrieTaken↑[P]←FALSE; ENDLOOP; END;--:951----953:
FirstFit: PROCEDURE[P: TriePointer] =
BEGIN H:TriePointer;
Z:TriePointer;Q:TriePointer;C:AsciiCode; C←TrieC↑[P];
IF INT[C]<TrieMin THEN TrieMin←C;Z←Trie↑[TrieMin-1].Rh;
{WHILE TRUE DO BEGIN {IF INT[Z]<C THEN GOTO Label45;H←Z-C;--954:
IF INT[TrieMax]<H+128 THEN BEGIN IF INT[TrieSize]<=H+128 THEN Overflow[806,
TrieSize];DO TrieMax←TrieMax+1;TrieTaken↑[TrieMax]←FALSE;
Trie↑[TrieMax].Rh←TrieMax+1;Trie↑[TrieMax].Lh←TrieMax-1;
IF TrieMax=H+128 THEN EXIT; ENDLOOP; END--:954--;IF TrieTaken↑[H] THEN GOTO Label45;--955:
Q←TrieR↑[P];WHILE INT[Q]>0 DO BEGIN IF Trie↑[H+TrieC↑[Q]].Rh=0 THEN GOTO Label45;
Q←TrieR↑[Q]; END ENDLOOP ; GOTO Label40--:955--;EXITS Label45 => NULL};Z←Trie↑[Z].Rh; END ENDLOOP ;EXITS Label40 => NULL};--956:
TrieTaken↑[H]←TRUE;TrieHash↑[P]←H;Q←P;DO Z←H+TrieC↑[Q];
Trie↑[Trie↑[Z].Rh].Lh←Trie↑[Z].Lh;Trie↑[Trie↑[Z].Lh].Rh←Trie↑[Z].Rh;
Trie↑[Z].Rh←0;Q←TrieR↑[Q]; IF Q=0--:956-- THEN EXIT; ENDLOOP; END;--:953----957:
TriePack: PROCEDURE[P: TriePointer] =
BEGIN Q:TriePointer;
DO Q←TrieL↑[P];
IF( INT[Q]>0)AND (TrieHash↑[Q]=0) THEN BEGIN FirstFit[Q];TriePack[Q]; END;
P←TrieR↑[P]; IF P=0 THEN EXIT; ENDLOOP; END;--:957----959:
TrieFix: PROCEDURE[P: TriePointer] =
BEGIN Q:TriePointer;C:AsciiCode;
Z:TriePointer; Z←TrieHash↑[P];WHILE P#0 DO BEGIN Q←TrieL↑[P];
C←TrieC↑[P];Trie↑[Z+C].Rh←TrieHash↑[Q];Trie↑[Z+C].B1←C;
Trie↑[Z+C].B0←TrieO↑[P];IF INT[Q]>0 THEN TrieFix[Q];P←TrieR↑[P]; END ENDLOOP ; END;
--:959----960:-- NewPatterns: PROCEDURE =
BEGIN K, L:SmallNumber;
DigitSensed:PascalBoolean;V:Quarterword;P, Q:TriePointer;FirstChild:PascalBoolean;
C:AsciiCode;R, S:TriePointer;H:TwoHalves;
ScanLeftBrace[];
InitPatternMemory[];--961:--K←0;Hyf↑[0]←0;DigitSensed←FALSE;
{WHILE TRUE DO BEGIN GetXToken[];SELECT CurCmd FROM 11,12 =>--962:
IF DigitSensed OR ( INT[CurChr]<48)OR ( INT[CurChr]>57) THEN BEGIN IF CurChr=46
THEN CurChr←128 ELSE BEGIN CurChr←Eqtb↑[ INT[4255]+CurChr].Hh.Rh;
IF CurChr=0 THEN BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[134];
Print[810]; END;BEGIN HelpPtr←1;HelpLine↑[0]←809; END;Error[];
CurChr←128; END; END;IF INT[K]<63 THEN BEGIN K←K+1;Hc↑[K]← INT[CurChr]-1;
Hyf↑[K]←0;DigitSensed←FALSE; END; END ELSE BEGIN Hyf↑[K]← INT[CurChr]-48;
IF INT[K]<63 THEN DigitSensed←TRUE; END--:962--;10,2 =>BEGIN IF INT[K]>0 THEN--963:
BEGIN--965:-- IF Hc↑[1]=127 THEN Hyf↑[0]←0;IF Hc↑[K]=127 THEN Hyf↑[K]←0;L←K;
V←0;{WHILE TRUE DO BEGIN IF Hyf↑[L]#0 THEN V←NewTrieOp[K-L,Hyf↑[L],V];
IF INT[L]>0 THEN L←L-1 ELSE GOTO Label31; END ENDLOOP ;EXITS Label31 => NULL};--:965--Q←0;
WHILE INT[L]<K DO BEGIN L←L+1;C←Hc↑[L];P←TrieL↑[Q];FirstChild←TRUE;
WHILE( INT[P]>0)AND ( INT[C]>TrieC↑[P])DO BEGIN Q←P;P←TrieR↑[Q];FirstChild←FALSE;
END ENDLOOP ;IF(P=0)OR ( INT[C]<TrieC↑[P]) THEN--964:
BEGIN IF TriePtr=TrieSize THEN Overflow[806,TrieSize];
TriePtr←TriePtr+1;TrieR↑[TriePtr]←P;P←TriePtr;TrieL↑[P]←0;
IF FirstChild THEN TrieL↑[Q]←P ELSE TrieR↑[Q]←P;TrieC↑[P]←C;
TrieO↑[P]←0; END--:964--;Q←P; END ENDLOOP ;
IF TrieO↑[Q]#0 THEN BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[134];
Print[811]; END;BEGIN HelpPtr←1;HelpLine↑[0]←809; END;Error[]; END;
TrieO↑[Q]←V; END--:963--;IF CurCmd=2 THEN GOTO Label30;K←0;Hyf↑[0]←0;
DigitSensed←FALSE; END; ENDCASE =>BEGIN BEGIN IF Interaction=3 THEN NULL;
PrintNl[134];Print[807]; END;PrintEsc[808];BEGIN HelpPtr←1;
HelpLine↑[0]←809; END;Error[]; END ; END ENDLOOP ;EXITS Label30 => NULL};--:961--TrieL↑[0]←CompressTrie[TrieL↑[0]];--966:--InitTrieMemory[];
IF TrieL↑[0]#0 THEN BEGIN FirstFit[TrieL↑[0]];TriePack[TrieL↑[0]];
END;--958:--R←0;WHILE TrieTaken↑[R]DO R←R+1 ENDLOOP ;TrieHash↑[0]←R;
TrieFix[TrieL↑[0]]--:958--;R←0;H.Rh←0;H.B0←0;H.B1←0;
DO S←Trie↑[R].Rh;Trie↑[R]←H;R←S; IF INT[R]>TrieMax--:966-- THEN EXIT; ENDLOOP; END;--:960
END.