@x
@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)'
@y
@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}'
@z
@x
@!pool_name='TeXformats:SITEX3.POOL ';
{string of length |file_name_size|; tells where the string pool appears}
@y
@!pool_name='TeXformats:ISITEX3.POOL ';
{string of length |file_name_size|; tells where the string pool appears}
@z
@x
abteilen(hc_si,hyf_si,hn,funktioniert,zerleg);
for j:=0 to 64 do begin
hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
end;
@y
if not hsstart then begin
{ wterm(' =iSi=> running hsinit'); wterm_cr; }
hsinit;
hsstart := true;
{ wterm(' =iSi=> finished hsinit'); wterm_cr }
end;
if isidebug=1 then begin
wterm(' =iSi=> abteilen von '); wwort(hc_si, hn);
end;
if not funktioniert then begin
if isidebug=1 then begin
wterm_cr;
wterm(' =iSi=> unbekanntes Wort: '); wwort(hc_si, hn);
wterm_cr;
wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr;
end;
if md_suchen(hc_si, hn, mdb, hyf_si) then begin
if isidebug=1 then begin
wterm(' =iSi=> gefunden in mdb: ');
writewt(hc_si, hn, hyf_si);
wterm_cr
end;
funktioniert := true
end else begin
if isidebug=1 then begin
wterm(' =iSi=> nicht gefunden in mdb: ');
wwort(hc_si, hn); wterm_cr;
end;
repeat
wterm_cr; wterm_cr;
wterm('"');
wwort(hc_si, hn);
wterm('" ist ein unbekanntes Wort!');
wterm_cr;
wterm(0:2);
wterm(': neues Wort, merken in "'); wjob; wterm('.lex"');
wterm_cr;
wterm(1:2);
wterm(': neues Wort, Trennstellen angeben und merken in "'); wjob;
wterm('.lex"');
wterm_cr;
wterm(9:2);
wterm(': Tippfehler! - merken im File "'); wjob; wterm('.edt"');
wterm_cr;
wterm('Bitte waehlen Sie eine Bedeutung (0,1,9) aus:');
wterm_cr;
read(term_in, schnuller);
auswahl := schnuller;
read_ln(term_in);
until ((xord[auswahl] >= 48) and (xord[auswahl] <= 49)) or
(auswahl = '9');
if (auswahl = '0') then begin
{ Da abteilen bei not funktioniert hyf_si unver"andert l"asst, }
{ muss hier jetzt hyf_si ``gel"oscht'' werden. }
for indexi := 1 to hn do begin
hyf_si[indexi] := keine
end;
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: ');
writewt(hc_si, hn, hyf_si); wterm_cr
end;
mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
mdm_eintragen(hc_si, hn, hyf_si, true, mdm);
funktioniert := true
end else if (auswahl = '9') then begin
mde_eintragen(hc_si, hn, mde)
end else begin
wterm('Bitte den Trennvektor angeben'); wterm_cr;
wterm(' ("-" Nebentrennstelle, "=" Haupttrennstelle, ');
wterm('"." Weiterruecken,'); wterm_cr;
wterm(' Trennstrich unter den Buchstaben angeben, hinter dem ');
wterm('getrennt werden soll):'); wterm_cr;
wwort(hc_si, hn); wterm_cr;
indexi := 1; uebersprungen := false;
read(term_in, auswahl);
while (xord[auswahl] <> 10) and (indexi <= hn) do begin
if (hc_si[indexi] >= 27) and
(hc_si[indexi] <= 30) and
not uebersprungen then begin
{ Ist in hc_si[] ein Umlaut, so steht am Bildschirm "x. }
{ Die Trennvektoreingabe unter dem " muss uebersprungen }
{ werden. }
uebersprungen := true
end else begin
if auswahl = '.' then begin
hyf_si[indexi] := keine
end else if auswahl = '-' then begin
hyf_si[indexi] := neben
end else if auswahl = '=' then begin
hyf_si[indexi] := haupt
end else begin
hyf_si[indexi] := keine
end;
uebersprungen := false;
indexi := indexi+1
end;
read(term_in, auswahl)
end;
while (indexi) <= hn do begin {Rest von hyf_si mit . auff"ullen}
hyf_si[indexi] := keine;
indexi := indexi+1
end;
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: ');
writewt(hc_si, hn, hyf_si); wterm_cr
end;
mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
mdm_eintragen(hc_si, hn, hyf_si, true, mdm);
funktioniert := true
end
end
end else begin
if isidebug=1 then begin
wterm(': '); writewt(hc_si, hn, hyf_si); wterm_cr
end
end;
if zerleg >= 2 then begin
gleiche_weg(alletr, zerleg, hn); { eliminiert gleiche Trennvektoren }
if zerleg >= 2 then begin { jetzt sind es echte Alternativen }
if isidebug=1 then begin
wterm(' =iSi=> mehrdeutiges Wort: '); writewt(hc_si, hn, hyf_si);
wterm_cr;
wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr;
end;
if md_suchen(hc_si, hn, mdb, hyf_si) then begin
if isidebug=1 then begin
wterm(' =iSi=> gefunden in mdb: '); writewt(hc_si, hn, hyf_si);
wterm_cr
end
end else begin
if isidebug=1 then begin
wterm(' =iSi=> nicht gefunden in mdb: ');
wwort(hc_si, hn); wterm_cr
end;
if mehrdanz then begin
repeat
wterm_cr; wterm_cr;
wterm('`');
wwort(hc_si, hn);
wterm(''' ist ein mehrdeutiges Wort!');
wterm_cr;
wterm(0:2); { wterm('/A'); }
wterm(': nur die sicheren Trennstellen waehlen (also `');
writewt(hc_si, hn, hyf_si);
wterm(''')');
wterm_cr;
for indexi := 1 to zerleg do begin
wterm(indexi:2); { wterm('/'); wterm(xchr[65+indexi]); }
wterm(': `');
writewt(hc_si, hn, alletr[indexi]);
wterm('''');
wterm_cr
end;
wterm(9:2);
wterm(': Tippfehler! - merken im File `'); wjob; wterm('.edt''');
wterm_cr;
wterm('Bitte waehlen Sie eine Bedeutung z.B. `0''+`Enter'' aus:');
wterm_cr;
wterm(' (zusaetzlich `E'' z.B. `0E''+`Enter'': ');
wterm('Wort auch fuer LEXIKON vormerken)');
wterm_cr;
read(term_in, schnuller);
auswahl := schnuller;
lex_ja := false; lex_ok := true;
if xord[schnuller] <> 32 then begin
read(term_in, schnuller);
if xord[schnuller] <> 10 then begin
if (schnuller = 'e') or (schnuller = 'E') then begin
lex_ja := true; { lex_ok := true }
end else begin
{ lex_ja := false; } lex_ok := false
end;
read_ln(term_in);
end
end;
until (((xord[auswahl] >= 48) and (xord[auswahl] <= 48+zerleg)) or
(auswahl = '9')) and lex_ok;
if (auswahl = '0') or ((auswahl = '0') and lex_ja) then begin
if (auswahl = '0') and not lex_ja then begin
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: ');
writewt(hc_si, hn, hyf_si); wterm_cr
end;
mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb);
mdm_eintragen(hc_si, hn, hyf_si, false, mdm)
end else begin { '0E' }
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: ');
writewt(hc_si, hn, hyf_si); wterm_cr
end;
mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
mdm_eintragen(hc_si, hn, hyf_si, true, mdm)
end;
end else if (auswahl = '9') then begin
mde_eintragen(hc_si, hn, mde)
end else begin
for j := 0 to maxwl do
hyf_si[j] := alletr[xord[auswahl]-48][j];
if not lex_ja then begin
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: ');
writewt(hc_si, hn, hyf_si); wterm_cr
end;
mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb);
mdm_eintragen(hc_si, hn, hyf_si, false, mdm)
end else begin { lex_ja }
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: ');
writewt(hc_si, hn, hyf_si); wterm_cr
end;
mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
mdm_eintragen(hc_si, hn, hyf_si, true, mdm)
end {if not lex_ja ...}
end {if (auswahl = ...}
end {if mehrdanz}
end {if md_suchen ...}
end {if zerleg >= 2}
end; {if zerleg >= 2}
for j:=0 to 64 do begin
hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
end;
@z
@x
@<Types in the outer block@>=
string80 = packed array [0..80] of eight_bits;
buchstabe = eight_bits;
a_word = array[0..maxwl] of 0..256;
wort = a_word;
sperrvektor=array [0..maxwl] of boolean;
dudt=array [0..maxwl] of boolean;{frueher kein type !!}
{ trennung = (keine, neben, nebenck, haupt, haupt3); }
trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
zwischen Buchstabe i und i+1 wird getrennt }
ktabtype = packed array [0..255] of buchstabe;
verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
varr = array [0..maxwl] of verdschlue;
intarr = array [0..maxwl] of integer;
{ darf nicht als var Parameter uebergeben werden !!}
infotype = record
{ frueher ein variantenRecord }
ausnahme:boolean;
untrennbar:boolean;
{ erste :0..7;
zweite:0..7; }
erste :integer;
zweite:integer;
endung,vorsilbe,stamm,ehervor,stammallein:boolean;
end;
infobyte = eight_bits;
{ darf nicht als var Parameter uebergeben werden !!}
tableentry=record
tabv:verdschlue;
tabb:infobyte;
frei:boolean;
wiederfrei:boolean;
end;
hashelement = packed array [0..3] of eight_bits;
htabtype = packed array [0..tabsize] of hashelement;
@y
@<Types in the outer block@>=
string80 = packed array [0..80] of eight_bits;
buchstabe = eight_bits;
a_word = array[0..maxwl] of 0..256;
wort = a_word;
sperrvektor=array [0..maxwl] of boolean;
dudt=array [0..maxwl] of boolean;{frueher kein type !!}
{ trennung = (keine, neben, nebenck, haupt, haupt3); }
trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
zwischen Buchstabe i und i+1 wird getrennt }
ktabtype = packed array [0..255] of buchstabe;
verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
varr = array [0..maxwl] of verdschlue;
intarr = array [0..maxwl] of integer;
{ darf nicht als var Parameter uebergeben werden !!}
infotype = record
{ frueher ein variantenRecord }
ausnahme:boolean;
untrennbar:boolean;
{ erste :0..7;
zweite:0..7; }
erste :integer;
zweite:integer;
endung,vorsilbe,stamm,ehervor,stammallein:boolean;
end;
infobyte = eight_bits;
{ darf nicht als var Parameter uebergeben werden !!}
tableentry=record
tabv:verdschlue;
tabb:infobyte;
frei:boolean;
wiederfrei:boolean;
end;
hashelement = packed array [0..3] of eight_bits;
htabtype = packed array [0..tabsize] of hashelement;
@x
procedure trennen (
{ trennen }
zustand : integer;
anfang : integer;
spv : sperrvektor;
var ok1 : boolean;
{ abteilen }
var tr :trennvektor;
var dudtr:trennvektor;
var zerlegungen:integer ;
var dud:dudt; { array [0..maxwl] of boolean; }
var v:varr;
var ind,k:intarr;
var dudstop:sperrvektor;
{ abteilen aufruf }
var w:wort;
var tr1:trennvektor;
laenge : integer );
@y
procedure trennen (
{ trennen }
zustand : integer;
anfang : integer;
spv : sperrvektor;
var ok1 : boolean;
{ abteilen }
var alletr: trenn16; {iSi HH}
var tr :trennvektor;
var dudtr:trennvektor;
var zerlegungen:integer ;
var dud:dudt; { array [0..maxwl] of boolean; }
var v:varr;
var ind,k:intarr;
var dudstop:sperrvektor;
{ abteilen aufruf }
var w:wort;
var tr1:trennvektor;
laenge : integer );
@z
@x
gef, nichtok:boolean;
schnitt:integer;
inform:infotype;
i:integer;
ok_stamm, ok_vor, ok_end, ok_help:boolean;
tri:integer;
{ p_stamm }
i1,tre:integer;
ok : boolean;
stop_ptr :integer;
spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
fr die bersetzung nach C notwendig.
-PRAK!- }
@y
gef, nichtok:boolean;
schnitt:integer;
inform:infotype;
i:integer;
ok_stamm, ok_vor, ok_end, ok_help:boolean;
tri:integer;
{ p_stamm }
i1,tre:integer;
ok : boolean;
stop_ptr :integer;
spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
fr die bersetzung nach C notwendig.
-PRAK!- }
trlast: trennvektor; {iSi 920114}
@z
@x
for i := laenge downto 1 do
begin
if dudtr[i-1] = haupt3 then
begin
dudtr[i-1] := keine;
tri := haupt3;
end
else
tri := dudtr[i];
if zerlegungen = 0 then
tr1[i] := tri
else
tr1[i] := kombtab[tr1[i],tri];
end;
zerlegungen:=zerlegungen+1;
ok1:= true
@y
for i := laenge downto 1 do begin
if dudtr[i-1] = haupt3 then begin
dudtr[i-1] := keine;
tri := haupt3;
end
else
tri := dudtr[i];
if zerlegungen = 0 then
tr1[i] := tri
else
tr1[i] := kombtab[tr1[i],tri];
trlast[i] := tri; {iSi 920114}
end;
zerlegungen:=zerlegungen+1;
for i := 0 to maxwl do
alletr[zerlegungen][i] := trlast[i]; {iSi 920114}
@x
procedure abteilen ( var w:wort; var tr1:trennvektor;
laenge : integer; var ok:boolean;
var zerlegungen:integer );
@y
procedure wchar(c: halfword);
begin
if c = 27 then begin
wterm('"a')
end else if c = 28 then begin
wterm('"o')
end else if c = 29 then begin
wterm('"u')
end else if c = 30 then begin
wterm('"s')
end else begin
wterm(xchr[c+96])
end
end;
procedure wwort(w: wort;
l: integer);
var i: integer;
begin
for i := 1 to l do begin
wchar(w[i])
end
end;
procedure writewt(w: wort;
l: integer;
tr: trennvektor);
var i: integer;
begin
wchar(w[1]);
for i := 2 to l-1 do begin
if (tr[i-1] = nebenck) {and (w[i] = bst_c)} then begin
wterm('k');
wterm('-')
end else if (tr[i] = haupt3) then begin
wterm(xchr[w[i]+96]);
wterm('=');
wterm(xchr[w[i]+96]);
end else if (tr[i] = haupt) then begin
wchar(w[i]);
wterm('=')
end else if (tr[i] = neben) then begin
wchar(w[i]);
wterm('-')
end else begin
wchar(w[i])
end
end;
wchar(w[l])
end;
procedure wjob;
var i:integer;
begin
for i := str_start[job_name] to str_start[job_name+1]-1 do begin
wterm(xchr[str_pool[i]])
end
end;
function vergl(wrt1: wort;
l1: integer;
wrt2: wort;
l2: integer): integer;
label 99;
var i: integer;
begin
i := 1;
while (i <= l1) and (i <= l2) do begin
if wrt1[i] < wrt2[i] then begin
vergl := -1;
goto 99
end else if wrt1[i] > wrt2[i] then begin
vergl := 1;
goto 99
end;
i := i+1
end;
if l1 < l2 then begin
vergl := -1;
goto 99
end else if l1 > l2 then begin
vergl := 1;
goto 99
end else begin
vergl := 0;
goto 99
end;
99:
end;
procedure gleiche_weg (var alletr: trenn16;
var zerleg: integer;
laenge: integer);
{ eliminiert bei Mehrdeutigkeiten (zerleg >= 2 !!!) eventuell gleiche }
{ trennvektoren und korrigiert alletr & zerleg }
var i, j, k, ii: integer;
gleich: boolean;
begin
i := 1;
repeat
j := i+1; { zerleg >= 2 }
repeat
gleich := true;
k := 1; { laenge >= 1 }
repeat
if alletr[i][k] = alletr[j][k] then begin
k := k+1
end else begin
gleich := false
end
until (k > laenge) or (gleich = false);
if gleich then begin
for k := j to zerleg-1 do begin
for ii := 0 to maxwl do
alletr[k][ii] := alletr[k+1][ii]
end;
zerleg := zerleg-1
end else begin
j := j+1
end
until j > zerleg;
i := i+1
until i > zerleg-1
end;
var ii, test: integer;
begin
{ wterm(' =iSi=> mdb_eintragen von '); writewt(w, l, tr); wterm_cr; }
if mdb = nil then begin
{ new(mdb); }
mdb := malloc(sizeof(mdb_schnuller));
for ii := 0 to maxwl do
mdb^.w12[ii] := w[ii];
mdb^.l1 := l;
for ii := 0 to maxwl do
mdb^.tr1[ii] := tr[ii];
mdb^.neu1 := neu;
mdb^.used1 := used;
mdb^.del1 := false;
mdb^.li := nil;
mdb^.re := nil;
if isidebug=1 then begin
wterm_cr
end
end else begin
test := vergl(w, l, mdb^.w12, mdb^.l1);
if test = -1 then begin
if isidebug=1 then begin
{ wterm(' =iSi=> kleiner als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; }
wterm('/')
end;
mdb_eintragen(w, l, tr, neu, used, mdb^.li)
end else if test = 1 then begin
if isidebug=1 then begin
{ wterm(' =iSi=> gr"osser als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; }
wterm('\')
end;
mdb_eintragen(w, l, tr, neu, used, mdb^.re)
end else begin
wterm(' =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!');
wterm_cr
end
end
end;
{iSi 920102 end}
{iSi 920110 begin}
procedure mdm_eintragen(w: wort;
l: integer;
tr: trennvektor;
neu: boolean;
var mdm: mdm_knoten);
var rechts: mdm_knoten;
ii: integer;
begin
if mdm = nil then begin
{ new(mdm); }
mdm := malloc(sizeof(mdm_schnuller));
for ii := 0 to maxwl do
mdm^.w12[ii] := w[ii];
mdm^.l1 := l;
for ii := 0 to maxwl do
mdm^.tr1[ii] := tr[ii];
mdm^.neu1 := neu;
mdm^.li := nil;
mdm^.re := nil
end else if mdm^.re = nil then begin
{ new(mdm^.re); }
mdm^.re := malloc(sizeof(mdm_schnuller));
for ii := 0 to maxwl do
mdm^.re^.w12[ii] := w[ii];
mdm^.re^.l1 := l;
for ii := 0 to maxwl do
mdm^.re^.tr1[ii] := tr[ii];
mdm^.re^.neu1 := neu;
mdm^.re^.li := nil;
mdm^.re^.re := nil;
mdm^.li := mdm^.re
end else begin
rechts := mdm^.re;
{ new(mdm^.re); }
mdm^.re := malloc(sizeof(mdm_schnuller));
for ii := 0 to maxwl do
mdm^.re^.w12[ii] := w[ii];
mdm^.re^.l1 := l;
for ii := 0 to maxwl do
mdm^.re^.tr1[ii] := tr[ii];
mdm^.re^.neu1 := neu;
mdm^.re^.li := nil;
mdm^.re^.re := nil;
rechts^.li := mdm^.re
end
end;
procedure mdl_eintragen(w: wort;
l: integer;
var mdl: mdl_knoten);
var rechts: mdl_knoten;
ii: integer;
begin
if isidebug=1 then begin
wterm(' =iSi=> mdl_eintragen von '); wwort(w, l); wterm_cr;
end;
if mdl = nil then begin
{ new(mdl); }
mdl := malloc(sizeof(mdl_schnuller));
for ii := 0 to maxwl do
mdl^.w12[ii] := w[ii];
mdl^.l1 := l;
mdl^.li := nil;
mdl^.re := nil
end else if mdl^.re = nil then begin
{ new(mdl^.re); }
mdl^.re := malloc(sizeof(mdl_schnuller));
for ii := 0 to maxwl do
mdl^.re^.w12[ii] := w[ii];
mdl^.re^.l1 := l;
mdl^.re^.li := nil;
mdl^.re^.re := nil;
mdl^.li := mdl^.re
end else begin
rechts := mdl^.re;
{ new(mdl^.re); }
mdl^.re := malloc(sizeof(mdl_schnuller));
for ii := 0 to maxwl do
mdl^.re^.w12[ii] := w[ii];
mdl^.re^.l1 := l;
mdl^.re^.li := nil;
mdl^.re^.re := nil;
rechts^.li := mdl^.re
end
end;
procedure mde_eintragen(w: wort;
l: integer;
var mde: mde_knoten);
var rechts: mde_knoten;
ii: integer;
begin
if isidebug=1 then begin
wterm(' =iSi=> mde_eintragen von '); wwort(w, l); wterm_cr;
end;
if mde = nil then begin
{ new(mde); }
mde := malloc(sizeof(mde_schnuller));
for ii := 0 to maxwl do
mde^.w12[ii] := w[ii];
mde^.l1 := l;
mde^.li := nil;
mde^.re := nil
end else if mde^.re = nil then begin
{ new(mde^.re); }
mde^.re := malloc(sizeof(mde_schnuller));
for ii := 0 to maxwl do
mde^.re^.w12[ii] := w[ii];
mde^.re^.l1 := l;
mde^.re^.li := nil;
mde^.re^.re := nil;
mde^.li := mde^.re
end else begin
rechts := mde^.re;
{ new(mde^.re); }
mde^.re := malloc(sizeof(mde_schnuller));
for ii := 0 to maxwl do
mde^.re^.w12[ii] := w[ii];
mde^.re^.l1 := l;
mde^.re^.li := nil;
mde^.re^.re := nil;
rechts^.li := mde^.re
end
end;
{iSi 920110 end}
{isi 920111 begin}
function md_suchen (w: wort;
l: integer;
var mdb: mdb_knoten;
var tr: trennvektor): boolean;
var ii, test: integer;
begin
if mdb = nil then begin
md_suchen := false
end else begin
test := vergl(w, l, mdb^.w12, mdb^.l1);
if test = -1 then begin
md_suchen := md_suchen(w, l, mdb^.li, tr)
end else if test = 1 then begin
md_suchen := md_suchen(w, l, mdb^.re, tr)
end else begin
for ii := 0 to maxwl do
tr[ii] := mdb^.tr1[ii];
mdb^.used1 := true;
md_suchen := true
end
end
end;
function in_use (w: wort;
l: integer;
mdb: mdb_knoten): boolean;
var test: integer;
begin
if mdb = nil then begin
wterm(' =iSi=> in_use Fehler: '); wwort(w, l);
wterm(' nicht in mdb'); wterm_cr
end else begin
test := vergl(w, l, mdb^.w12, mdb^.l1);
if test = -1 then begin
in_use := in_use(w, l, mdb^.li)
end else if test = 1 then begin
in_use := in_use(w, l, mdb^.re)
end else begin
in_use := mdb^.used1;
if isidebug=1 then begin
if mdb^.used1 then begin
wterm(' =iSi=> '); wwort(w, l); wterm(' in use'); wterm_cr
end else begin
wterm(' =iSi=> '); wwort(w, l); wterm(' not in use'); wterm_cr
end
end
end
end
end;
procedure hsinit;
var i, j, l: integer;
tr: trennvektor;
w: wort;
temp, auswahl, schnuller: char;
neu, memkorr: boolean;
begin
wterm_cr; wterm_cr;
repeat
wterm_ln('iSi debug Info ? [J/N]');
read(term_in, auswahl);
schnuller := auswahl;
read_ln(term_in);
until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
(xord[auswahl] = 106) or (xord[auswahl] = 110);
wterm_cr;
if (xord[auswahl] = 74) or (xord[auswahl] = 106) then begin
isidebug := 1
end else begin
isidebug := 0
end;
for i := 1 to file_name_size do begin
name_of_file[i] := ' '
end;
j := str_start[job_name];
i := 1;
while (j < str_start[job_name+1]) and
(i < file_name_size - 4) do begin
name_of_file[i] := xchr[str_pool[j]];
j := j+1;
i := i+1
end;
name_of_file[i] := '.';
name_of_file[i+1] := 'm';
name_of_file[i+2] := 'e';
name_of_file[i+3] := 'm';
if not a_open_in(hsmem,TEX_INPUT_PATH) then begin
if isidebug=1 then begin
wterm(' =iSi=> cant a_open_in '); wjob; wterm('.mem');
wterm_cr
end
end else begin
repeat
wterm_cr;
wterm('Sollen Fehleintr"age gel"oscht werden? [J/N]'); wterm_cr;
read(term_in, auswahl);
schnuller := auswahl;
read_ln(term_in);
until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
(xord[auswahl] = 106) or (xord[auswahl] = 110);
wterm_cr; wterm_cr;
if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin
memkorr := true
end else begin
memkorr := false
end;
while not eof(hsmem) do begin
read(hsmem, l);
read_ln(hsmem);
for i := 1 to l do begin
read(hsmem, w[i]);
end;
read_ln(hsmem);
for i := 1 to l do begin
read(hsmem, tr[i]);
end;
read_ln(hsmem);
read(hsmem, temp);
read_ln(hsmem);
if temp = xchr[116] then neu := true else neu := false; {116 = t}
if isidebug=1 then begin
wterm(' =iSi=> reading from '); wjob; wterm('.mem: '); wwort(w, l);
wterm(', neu = '); wterm(temp); wterm_cr;
end;
if memkorr then begin
repeat
wterm_cr;
wterm('Soll ');
writewt(w, l, tr);
wterm(' gel"oscht werden? [J/N]'); wterm_cr;
read(term_in, auswahl);
schnuller := auswahl;
read_ln(term_in);
until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
(xord[auswahl] = 106) or (xord[auswahl] = 110);
wterm_cr;
if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin
{ nichts tun, Wort wird nicht eingetragen }
end else begin
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr);
wterm_cr
end;
mdb_eintragen(w, l, tr, neu, false {used}, mdb);
mdm_eintragen(w, l, tr, neu, mdm);
end
end else begin
if isidebug=1 then begin
wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr);
wterm_cr
end;
mdb_eintragen(w, l, tr, neu, false {used}, mdb);
mdm_eintragen(w, l, tr, neu, mdm)
end
end;
if isidebug=1 then begin
wterm_cr;
{ wterm(' =iSi=> closing '); wjob; wterm('.mem'); wterm_cr; }
end;
a_close(hsmem);
end;
repeat
wterm_cr;
wterm_ln('Sollen mehrdeutige W"orter angezeigt werden? [J/N]');
read(term_in, auswahl);
schnuller := auswahl;
read_ln(term_in);
until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
(xord[auswahl] = 106) or (xord[auswahl] = 110);
wterm_cr;
if (xord[auswahl]=74) or (xord[auswahl]=106) then begin
mehrdanz := true
end else begin
mehrdanz := false
end
end;
{iSi 920111 end}
procedure abteilen (var w:wort; var tr1:trennvektor;
var alletr: trenn16; {iSi 920114}
laenge : integer; var ok:boolean;
var zerlegungen:integer);
@z
@x
var
i:integer;
dud:dudt; { array [0..maxwl] of boolean; }
v:varr;
ind,k:intarr;
spv,dudstop:sperrvektor;
tr, dudtr:trennvektor;
@y
var
i:integer;
iSi_j: integer; {iSi 920114}
dud:dudt; {array [0..maxwl] of boolean; }
v:varr;
ind,k:intarr;
tr, dudtr:trennvektor;
spv,dudstop:sperrvektor;
@z
@x
for i:=0 to laenge do
if tr1[i]=nebenck then begin
tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
tr1[i-1]:=nebenck; {sprechend getrennt wird }
end;
@y
for i:=0 to laenge do
if tr1[i]=nebenck then begin
tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
tr1[i-1]:=nebenck; {sprechend getrennt wird }
for iSi_j := 1 to zerlegungen do begin {iSi 920114 begin}
if (alletr[iSi_j][i] = nebenck) then begin
alletr[iSi_j][i] := keine;
alletr[iSi_j][i-1] := nebenck
end
end {iSi 920114 end}
end;
@z
@x
@ @<Finish the extensions@>=
for k:=0 to 15 do if write_open[k] then a_close(write_file[k])
@y
@ @<Finish the extensions@>=
for k:=0 to 15 do if write_open[k] then a_close(write_file[k]);
for hsii := 1 to file_name_size do begin
name_of_file[hsii] := ' '
end;
hsij := str_start[job_name];
hsii := 1;
while hsij < str_start[job_name+1] do begin
name_of_file[hsii] := xchr[str_pool[hsij]];
hsij := hsij+1;
hsii := hsii+1
end;
name_of_file[hsii] := '.';
name_of_file[hsii+1] := 'm';
name_of_file[hsii+2] := 'e';
name_of_file[hsii+3] := 'm';
if not a_open_out(hsmem) then begin
wterm_ln(' =iSi=> cant a_open_out '); wjob; wterm('.mem ');
wterm_cr
end else begin
{ wterm(' =iSi=> a_open_out '); wjob; wterm('.mem '); wterm_cr; }
while mdm <> nil do begin
if in_use(mdm^.w12, mdm^.l1, mdb) then begin
if isidebug=1 then begin
wterm(' =iSi=> writing to '); wjob; wterm('.mem: ');
writewt(mdm^.w12, mdm^.l1, mdm^.tr1); wterm_cr;
end;
write_ln(hsmem, mdm^.l1);
for k := 1 to mdm^.l1 do begin
write(hsmem, mdm^.w12[k]);
end;
write_ln(hsmem);
for k := 1 to mdm^.l1 do begin
write(hsmem, mdm^.tr1[k]);
end;
write_ln(hsmem);
if mdm^.neu1 then begin
write(hsmem, xchr[116]);
write_ln(hsmem);
mdl_eintragen(mdm^.w12, mdm^.l1, mdl)
end else begin
write(hsmem, xchr[102]);
write_ln(hsmem)
end
end else begin
if isidebug=1 then begin
wterm(' =iSi=> '); wwort(mdm^.w12, mdm^.l1);
wterm(' not in use');
wterm_cr
end
end;
mdm := mdm^.li
end;
a_close(hsmem);
{ wterm(' =iSi=> a_close '); wjob; wterm('.mem '); wterm_cr; }
end;
for hsii := 1 to file_name_size do begin
name_of_file[hsii] := ' '
end;
hsij := str_start[job_name];
hsii := 1;
while hsij < str_start[job_name+1] do begin
name_of_file[hsii] := xchr[str_pool[hsij]];
hsij := hsij+1;
hsii := hsii+1
end;
name_of_file[hsii] := '.';
name_of_file[hsii+1] := 'l';
name_of_file[hsii+2] := 'e';
name_of_file[hsii+3] := 'x';
if not a_open_out(hslex) then
wterm_ln(' =iSi=> cant open hslex')
else begin
{ wterm(' =iSi=> a_open_out '); wjob; wterm('.lex '); wterm_cr; }
while mdl <> nil do begin
if isidebug=1 then begin
wterm(' =iSi=> writing to '); wjob; wterm('.lex: ');
wwort(mdl^.w12, mdl^.l1);
wterm_cr
end;
write(hslex, xchr[mdl^.l1]);
for k := 1 to mdl^.l1 do begin
if mdl^.w12[k] <= 26 then begin
write(hslex, xchr[mdl^.w12[k]+96])
end else begin
if mdl^.w12[k] = 27 then begin
write(hslex, '"a')
end else if mdl^.w12[k] = 28 then begin
write(hslex, '"o')
end else if mdl^.w12[k] = 29 then begin
write(hslex, '"u')
end else if mdl^.w12[k] = 30 then begin
write(hslex, '"s')
end else begin
write(hslex, '-')
end
end
end;
write_ln(hslex);
mdl := mdl^.li
end;
a_close(hslex);
{ wterm(' =iSi=> a_close '); wjob; wterm('.lex '); wterm_cr; }
end;
for hsii := 1 to file_name_size do begin
name_of_file[hsii] := ' '
end;
hsij := str_start[job_name];
hsii := 1;
while hsij < str_start[job_name+1] do begin
name_of_file[hsii] := xchr[str_pool[hsij]];
hsij := hsij+1;
hsii := hsii+1
end;
name_of_file[hsii] := '.';
name_of_file[hsii+1] := 'e';
name_of_file[hsii+2] := 'd';
name_of_file[hsii+3] := 't';
if not a_open_out(hsedt) then
wterm_ln(' =iSi=> cant open hsedt')
else begin
{ wterm(' =iSi=> a_open_out '); wjob; wterm('.edt '); wterm_cr; }
while mde <> nil do begin
if isidebug=1 then begin
wterm(' =iSi=> writing to '); wjob; wterm('.edt: ');
wwort(mde^.w12, mde^.l1);
wterm_cr
end;
for k := 1 to mde^.l1 do begin
if mde^.w12[k] <= 26 then begin
write(hsedt, xchr[mde^.w12[k]+96])
end else begin
if mde^.w12[k] = 27 then begin
write(hsedt, '"a')
end else if mde^.w12[k] = 28 then begin
write(hsedt, '"o')
end else if mde^.w12[k] = 29 then begin
write(hsedt, '"u')
end else if mde^.w12[k] = 30 then begin
write(hsedt, '"s')
end else begin
write(hsedt, '--')
end
end
end;
write_ln(hsedt);
mde := mde^.li
end;
a_close(hsedt);
{ wterm(' =iSi=> a_close '); wjob; wterm('.edt '); wterm_cr; }
end;
@z