@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
else  bad_pool('! I can''t read SITEX3.POOL.')
@.I can't read TEX.POOL@>
@y
else  bad_pool('! I can''t read ISITEX3.POOL.')
@.I can't read TEX.POOL@>
@z


@x
@!funktioniert: boolean;
@!zerleg: integer;
@y
@!funktioniert: boolean;
@!zerleg: integer;
@!alletr: trenn16;   {iSi 920114}
@!auswahl, schnuller: char;
@!memkorr: boolean; {iSi 920914 doku.mem korrigieren ja/nein}
@!indexi: integer;
@!uebersprungen: boolean;  {iSi 920921}
@!lex_ja, lex_ok: boolean; {iSi 920930 neue Eingabe `1E' statt `B'}
@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;

  abteilen(hc_si,hyf_si, alletr {iSi 920114}, hn,funktioniert,zerleg);

  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;

  trenn16 = array [1..16] of trennvektor; {iSi 921005 trenn8 -> trenn16}

                    {iSi 920103 begin}
  mdb_knoten = ^mdb_k;
  mdm_knoten = ^mdm_k;
  mdl_knoten = ^mdl_k;
  mde_knoten = ^mde_k; {HHHHH}

  mdb_k = record
            w12: wort;
            l1: integer;
            tr1: trennvektor;
            neu1: boolean;
            del1: boolean;    {gel"oscht ja/nein}
            used1: boolean;   {noch in Verwendung ja/nein}
			li, re: mdb_knoten;
          end;
                    {iSi 920103 end}

                    {iSi 920110 begin}

  mdm_k = record 
             w12: wort;
             l1: integer;
             tr1: trennvektor;
             neu1: boolean;
			 li, re: mdm_knoten;
           end;         
  mdl_k = record 
             w12: wort;
             l1: integer;
			 li, re: mdl_knoten;
          end;
  mde_k = record {HHHHH}
             w12: wort;
             l1: integer;
			 li, re: mde_knoten;
          end;

                    {iSi 920110 end} 

@z



@x
@<Global variables@>=
  ktab : ktabtype;
  htab : htabtype;
  anzahl : integer;
  hashfile : alpha_file;
  kombtab : array [1..5, 1..5] of integer;
  konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
@y
@<Global variables@>=
  ktab : ktabtype;
  htab : htabtype;
  anzahl : integer;
  hashfile : alpha_file;

  hsmem, hslex, hsedt: alpha_file;   {iSi 920111}

  kombtab : array [1..5, 1..5] of integer;
  konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}

  hsstart: boolean;   {iSi 920114} {ist mdb schon initialisiert?}
  isidebug: integer;  {iSi 920917} 
  auswahl, schnuller: char;   {iSi 920917}
  mehrdanz: boolean;  {iSi 920924} {mehrdeutige W"orter anzeigen?}
  mdb: mdb_knoten; {iSi 920111}
  mdm: mdm_knoten; {iSi 920111}
  mdl: mdl_knoten; {iSi 920114}
  mde: mde_knoten; {iSi 920114}
  mdb_schnuller: mdb_k; {iSi HH; um web2c zu ueberlisten: sizeof(var) statt }
  mdm_schnuller: mdm_k; {sizeof(typ) }
  mdl_schnuller: mdl_k;
  mde_schnuller: mde_k;

  hsii, hsij: integer; {iSi 920114} {HS_Index_i, HS_Index_j}
@z



@x
     { Konsonantentabelle initialisieren }
   for bst:=bst_a to bst_sz do   konsonant[bst] := true;
   konsonant[bst_a] := false;
   konsonant[bst_e] := false;
   konsonant[bst_i] := false;
   konsonant[bst_o] := false;
   konsonant[bst_u] := false;
   konsonant[bst_ae] := false;
   konsonant[bst_oe] := false;
   konsonant[bst_ue] := false;
@y
     { Konsonantentabelle initialisieren }
   for bst:=bst_a to bst_sz do   konsonant[bst] := true;
   konsonant[bst_a] := false;
   konsonant[bst_e] := false;
   konsonant[bst_i] := false;
   konsonant[bst_o] := false;
   konsonant[bst_u] := false;
   konsonant[bst_ae] := false;
   konsonant[bst_oe] := false;
   konsonant[bst_ue] := false;

{     wterm_cr; wterm_cr;
     wterm_ln('====================');
     wterm_ln('This is iSiTeX, HS92');
     wterm_ln('====================');
     wterm_cr;

     wterm_ln(' =iSi=> init mdb, mdm, mdl, mde'); } 
     mdb := nil; 
     mdm := nil;
     mdl := nil;
     mde := nil;

     hsstart := false;
     isidebug := 0;

@z


@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}

               ok1:= true
@z


@x

									trennen (2, schnitt+2, spv, ok_help,
												tr,dudtr,zerlegungen,dud,v,ind,k,
												dudstop,w,tr1,laenge);
@y
									trennen (2, schnitt+2, spv, ok_help, alletr,
												tr,dudtr,zerlegungen,dud,v,ind,k,
												dudstop,w,tr1,laenge);
@z

@x
							trennen (2, schnitt+1, spv, ok_help,
										tr,dudtr,zerlegungen,dud,v,ind,k,
										dudstop,w,tr1,laenge);
@y
							trennen (2, schnitt+1, spv, ok_help, alletr,
										tr,dudtr,zerlegungen,dud,v,ind,k,
										dudstop,w,tr1,laenge);
@z

@x
							trennen(1, schnitt+1, spv, ok_vor,
									  tr,dudtr,zerlegungen,dud,v,ind,k,
									  dudstop,w,tr1,laenge);
@y
							trennen(1, schnitt+1, spv, ok_vor, alletr,
									  tr,dudtr,zerlegungen,dud,v,ind,k,
									  dudstop,w,tr1,laenge);
@z

@x
											trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
														zerlegungen,dud,v,ind,k,
														dudstop,w,tr1,laenge);
@y
											trennen (2, schnitt+2, spv, ok_help, alletr,
														tr,dudtr,
														zerlegungen,dud,v,ind,k,
														dudstop,w,tr1,laenge);
@z

@x
											trennen(5, schnitt, spv, ok_help,tr,dudtr,
													  zerlegungen,dud,v,ind,k,
													  dudstop,w,tr1,laenge);
@y
											trennen(5, schnitt, spv, ok_help, alletr,
													  tr,dudtr,
													  zerlegungen,dud,v,ind,k,
													  dudstop,w,tr1,laenge);
@z

@x
									trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
												zerlegungen,dud,v,ind,k,
												dudstop,w,tr1,laenge);
@y
									trennen (2, schnitt+1, spv, ok_help, alletr,
												tr,dudtr,
												zerlegungen,dud,v,ind,k,
												dudstop,w,tr1,laenge);
@z

@x
										trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr,
													zerlegungen,dud,v,ind,k,
													dudstop,w,tr1,laenge);
@y
										trennen (4, schnitt+1, spv, ok_stamm, alletr,
													tr,dudtr,
													zerlegungen,dud,v,ind,k,
													dudstop,w,tr1,laenge);
@z

@x
								trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
											zerlegungen,dud,v,ind,k,
											dudstop,w,tr1,laenge);
@y
								trennen (2, schnitt+2, spv, ok_help, alletr,
											tr,dudtr,
											zerlegungen,dud,v,ind,k,
											dudstop,w,tr1,laenge);
@z

@x
								trennen(5, schnitt, spv, ok_help,tr,dudtr,
										  zerlegungen,dud,v,ind,k,
										  dudstop,w,tr1,laenge);
@y
								trennen(5, schnitt, spv, ok_help, alletr,
										  tr,dudtr,
										  zerlegungen,dud,v,ind,k,
										  dudstop,w,tr1,laenge);
@z

@x
						trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
									zerlegungen,dud,v,ind,k,
									dudstop,w,tr1,laenge);
@y
						trennen (2, schnitt+1, spv, ok_help, alletr,
									tr,dudtr,
									zerlegungen,dud,v,ind,k,
									dudstop,w,tr1,laenge);
@z


@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;

procedure mdb_eintragen(w: wort;
                        l: integer;
                        tr: trennvektor;
                        neu: boolean;
                        used: boolean;
                        var mdb: mdb_knoten);
 
  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
		trennen(3, 1, spv, ok,
		tr,dudtr,zerlegungen,dud,v,ind,k,
		dudstop,w,tr1,laenge);
@y
		trennen(3, 1, spv, ok, alletr,
		tr,dudtr,zerlegungen,dud,v,ind,k,
		dudstop,w,tr1,laenge);
@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

