#define EXTERN extern #include "texd.h" void zpostlinebreak ( finalwidowpenalty ) integer finalwidowpenalty ; {/* 30 31 */ postlinebreak_regmem halfword q, r, s ; boolean discbreak ; boolean postdiscbreak ; scaled curwidth ; scaled curindent ; quarterword t ; integer pen ; halfword curline ; q = mem [ bestbet + 1 ] .hh .v.RH ; curp = 0 ; do { r = q ; q = mem [ q + 1 ] .hh .v.LH ; mem [ r + 1 ] .hh .v.LH = curp ; curp = r ; } while ( ! ( q == 0 ) ) ; curline = curlist .pgfield + 1 ; do { q = mem [ curp + 1 ] .hh .v.RH ; discbreak = false ; postdiscbreak = false ; if ( q != 0 ) if ( mem [ q ] .hh.b0 == 10 ) { deleteglueref ( mem [ q + 1 ] .hh .v.LH ) ; mem [ q + 1 ] .hh .v.LH = eqtb [ 10290 ] .hh .v.RH ; mem [ q ] .hh.b1 = 9 ; incr ( mem [ eqtb [ 10290 ] .hh .v.RH ] .hh .v.RH ) ; goto lab30 ; } else { if ( mem [ q ] .hh.b0 == 7 ) { t = mem [ q ] .hh.b1 ; if ( t == 0 ) r = mem [ q ] .hh .v.RH ; else { r = q ; while ( t > 1 ) { r = mem [ r ] .hh .v.RH ; decr ( t ) ; } s = mem [ r ] .hh .v.RH ; r = mem [ s ] .hh .v.RH ; mem [ s ] .hh .v.RH = 0 ; flushnodelist ( mem [ q ] .hh .v.RH ) ; mem [ q ] .hh.b1 = 0 ; } if ( mem [ q + 1 ] .hh .v.RH != 0 ) { s = mem [ q + 1 ] .hh .v.RH ; while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; mem [ s ] .hh .v.RH = r ; r = mem [ q + 1 ] .hh .v.RH ; mem [ q + 1 ] .hh .v.RH = 0 ; postdiscbreak = true ; } if ( mem [ q + 1 ] .hh .v.LH != 0 ) { s = mem [ q + 1 ] .hh .v.LH ; if ( mem [ s ] .hh.b0 == 12 ) { s = mem [ s ] .hh .v.RH ; mem [ mem [ q + 1 ] .hh .v.LH ] .hh .v.RH = 0 ; flushnodelist ( mem [ q + 1 ] .hh .v.LH ) ; } mem [ q ] .hh .v.RH = s ; while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; mem [ q + 1 ] .hh .v.LH = 0 ; q = s ; } mem [ q ] .hh .v.RH = r ; discbreak = true ; } else if ( ( mem [ q ] .hh.b0 == 9 ) || ( mem [ q ] .hh.b0 == 11 ) ) mem [ q + 1 ] .cint = 0 ; } else { q = memtop - 3 ; while ( mem [ q ] .hh .v.RH != 0 ) q = mem [ q ] .hh .v.RH ; } r = newparamglue ( 8 ) ; mem [ r ] .hh .v.RH = mem [ q ] .hh .v.RH ; mem [ q ] .hh .v.RH = r ; q = r ; lab30: ; r = mem [ q ] .hh .v.RH ; mem [ q ] .hh .v.RH = 0 ; q = mem [ memtop - 3 ] .hh .v.RH ; mem [ memtop - 3 ] .hh .v.RH = r ; if ( eqtb [ 10289 ] .hh .v.RH != 0 ) { r = newparamglue ( 7 ) ; mem [ r ] .hh .v.RH = q ; q = r ; } if ( curline > lastspecialline ) { curwidth = secondwidth ; curindent = secondindent ; } else if ( eqtb [ 10812 ] .hh .v.RH == 0 ) { curwidth = firstwidth ; curindent = firstindent ; } else { curwidth = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline ] .cint ; curindent = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline - 1 ] .cint ; } adjusttail = memtop - 5 ; justbox = hpack ( q , curwidth , 0 ) ; mem [ justbox + 4 ] .cint = curindent ; appendtovlist ( justbox ) ; if ( memtop - 5 != adjusttail ) { mem [ curlist .tailfield ] .hh .v.RH = mem [ memtop - 5 ] .hh .v.RH ; curlist .tailfield = adjusttail ; } adjusttail = 0 ; if ( curline + 1 != bestline ) { pen = eqtb [ 12676 ] .cint ; if ( curline == curlist .pgfield + 1 ) pen = pen + eqtb [ 12668 ] .cint ; if ( curline + 2 == bestline ) pen = pen + finalwidowpenalty ; if ( discbreak ) pen = pen + eqtb [ 12671 ] .cint ; if ( pen != 0 ) { r = newpenalty ( pen ) ; mem [ curlist .tailfield ] .hh .v.RH = r ; curlist .tailfield = r ; } } incr ( curline ) ; curp = mem [ curp + 1 ] .hh .v.LH ; if ( curp != 0 ) if ( ! postdiscbreak ) { r = memtop - 3 ; while ( true ) { q = mem [ r ] .hh .v.RH ; if ( q == mem [ curp + 1 ] .hh .v.RH ) goto lab31 ; if ( ( q >= himemmin ) ) goto lab31 ; if ( ( mem [ q ] .hh.b0 < 9 ) ) goto lab31 ; if ( mem [ q ] .hh.b1 == 2 ) if ( mem [ q ] .hh.b0 == 11 ) goto lab31 ; r = q ; } lab31: if ( r != memtop - 3 ) { mem [ r ] .hh .v.RH = 0 ; flushnodelist ( mem [ memtop - 3 ] .hh .v.RH ) ; mem [ memtop - 3 ] .hh .v.RH = q ; } } } while ( ! ( curp == 0 ) ) ; if ( ( curline != bestline ) || ( mem [ memtop - 3 ] .hh .v.RH != 0 ) ) confusion ( 935 ) ; curlist .pgfield = bestline - 1 ; } smallnumber zreconstitute ( j , n , bchar , hchar ) smallnumber j ; smallnumber n ; halfword bchar ; halfword hchar ; {/* 22 30 */ register smallnumber Result; reconstitute_regmem halfword p ; halfword t ; fourquarters q ; halfword currh ; halfword testchar ; scaled w ; fontindex k ; smallnumber ii ; hyphenpassed = 0 ; t = memtop - 4 ; w = 0 ; mem [ memtop - 4 ] .hh .v.RH = 0 ; {register integer for_end; ii = n ; for_end = j ; if ( ii >= for_end) do if ( dirtyumlaut [ ii ] != 0 ) n = ii - 1 ; while ( ii-- > for_end ) ; } curl = hu [ j ] ; curq = t ; if ( j == 0 ) { ligaturepresent = initlig ; p = initlist ; if ( ligaturepresent ) lfthit = initlft ; while ( p > 0 ) { { mem [ t ] .hh .v.RH = getavail () ; t = mem [ t ] .hh .v.RH ; mem [ t ] .hh.b0 = hf ; mem [ t ] .hh.b1 = mem [ p ] .hh.b1 ; } p = mem [ p ] .hh .v.RH ; } } else if ( curl < 256 ) { mem [ t ] .hh .v.RH = getavail () ; t = mem [ t ] .hh .v.RH ; mem [ t ] .hh.b0 = hf ; mem [ t ] .hh.b1 = curl ; } ligstack = 0 ; { if ( j < n ) curr = hu [ j + 1 ] ; else curr = bchar ; if ( hyfpen [ j ] != 10000 ) currh = hchar ; else currh = 256 ; } lab22: if ( curl == 256 ) { k = bcharlabel [ hf ] ; if ( k == fontmemsize ) goto lab30 ; else q = fontinfo [ k ] .qqqq ; } else { q = fontinfo [ charbase [ hf ] + curl ] .qqqq ; if ( ( ( q .b2 ) % 4 ) != 1 ) goto lab30 ; k = ligkernbase [ hf ] + q .b3 ; q = fontinfo [ k ] .qqqq ; if ( q .b0 > 128 ) { k = ligkernbase [ hf ] + 256 * q .b2 + q .b3 + 32768L - 256 * ( 128 ) ; q = fontinfo [ k ] .qqqq ; } } if ( currh < 256 ) testchar = currh ; else testchar = curr ; while ( true ) { if ( q .b1 == testchar ) if ( q .b0 <= 128 ) if ( currh < 256 ) { hyphenpassed = j ; hchar = 256 ; currh = 256 ; goto lab22 ; } else { if ( hchar < 256 ) if ( hyfpen [ j ] != 10000 ) { hyphenpassed = j ; hchar = 256 ; } if ( q .b2 < 128 ) { if ( curl == 256 ) lfthit = true ; if ( j == n ) if ( ligstack == 0 ) rthit = true ; { if ( interrupt != 0 ) pauseforinstructions () ; } switch ( q .b2 ) {case 1 : case 5 : { curl = q .b3 ; ligaturepresent = true ; } break ; case 2 : case 6 : { curr = q .b3 ; if ( ligstack > 0 ) mem [ ligstack ] .hh.b1 = curr ; else { ligstack = newligitem ( curr ) ; if ( j == n ) bchar = 256 ; else { p = getavail () ; mem [ ligstack + 1 ] .hh .v.RH = p ; mem [ p ] .hh.b1 = hu [ j + 1 ] ; mem [ p ] .hh.b0 = hf ; } } } break ; case 3 : { curr = q .b3 ; p = ligstack ; ligstack = newligitem ( curr ) ; mem [ ligstack ] .hh .v.RH = p ; } break ; case 7 : case 11 : { if ( ligaturepresent ) { p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ; if ( lfthit ) { mem [ p ] .hh.b1 = 2 ; lfthit = false ; } if ( false ) if ( ligstack == 0 ) { incr ( mem [ p ] .hh.b1 ) ; rthit = false ; } mem [ curq ] .hh .v.RH = p ; t = p ; ligaturepresent = false ; } curq = t ; curl = q .b3 ; ligaturepresent = true ; } break ; default: { curl = q .b3 ; ligaturepresent = true ; if ( ligstack > 0 ) { if ( mem [ ligstack + 1 ] .hh .v.RH > 0 ) { mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ; t = mem [ t ] .hh .v.RH ; incr ( j ) ; } p = ligstack ; ligstack = mem [ p ] .hh .v.RH ; freenode ( p , 2 ) ; if ( ligstack == 0 ) { if ( j < n ) curr = hu [ j + 1 ] ; else curr = bchar ; if ( hyfpen [ j ] != 10000 ) currh = hchar ; else currh = 256 ; } else curr = mem [ ligstack ] .hh.b1 ; } else if ( j == n ) goto lab30 ; else { { mem [ t ] .hh .v.RH = getavail () ; t = mem [ t ] .hh .v.RH ; mem [ t ] .hh.b0 = hf ; mem [ t ] .hh.b1 = curr ; } incr ( j ) ; { if ( j < n ) curr = hu [ j + 1 ] ; else curr = bchar ; if ( hyfpen [ j ] != 10000 ) currh = hchar ; else currh = 256 ; } } } break ; } if ( q .b2 > 4 ) if ( q .b2 != 7 ) goto lab30 ; goto lab22 ; } w = fontinfo [ kernbase [ hf ] + 256 * q .b2 + q .b3 ] .cint ; goto lab30 ; } if ( q .b0 >= 128 ) if ( currh == 256 ) goto lab30 ; else { currh = 256 ; goto lab22 ; } k = k + q .b0 + 1 ; q = fontinfo [ k ] .qqqq ; } lab30: ; if ( ligaturepresent ) { p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ; if ( lfthit ) { mem [ p ] .hh.b1 = 2 ; lfthit = false ; } if ( rthit ) if ( ligstack == 0 ) { incr ( mem [ p ] .hh.b1 ) ; rthit = false ; } mem [ curq ] .hh .v.RH = p ; t = p ; ligaturepresent = false ; } if ( w != 0 ) { mem [ t ] .hh .v.RH = newkern ( w ) ; t = mem [ t ] .hh .v.RH ; w = 0 ; } if ( ligstack > 0 ) { curq = t ; curl = mem [ ligstack ] .hh.b1 ; ligaturepresent = true ; { if ( mem [ ligstack + 1 ] .hh .v.RH > 0 ) { mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ; t = mem [ t ] .hh .v.RH ; incr ( j ) ; } p = ligstack ; ligstack = mem [ p ] .hh .v.RH ; freenode ( p , 2 ) ; if ( ligstack == 0 ) { if ( j < n ) curr = hu [ j + 1 ] ; else curr = bchar ; if ( hyfpen [ j ] != 10000 ) currh = hchar ; else currh = 256 ; } else curr = mem [ ligstack ] .hh.b1 ; } goto lab22 ; } Result = j ; return(Result) ; } void zhashfunk ( w , anfang , ende , v , ind , k ) wort w ; integer anfang ; integer ende ; varr v ; intarr ind ; intarr k ; {hashfunk_regmem long vacc, indacc, kacc ; integer i ; vacc = 31415L ; indacc = 152L ; kacc = 271L ; {register integer for_end; i = anfang ; for_end = ende ; if ( i <= for_end) do { ; vacc = ( vacc * 31 + w [ i ] ) % 8388648L ; v [ i ] = vacc ; indacc = ( indacc * 33 + w [ i ] ) % ( tabsize + 1 ) ; ind [ i ] = indacc ; kacc = ( kacc * 15 + w [ i ] ) % ( ( tabsize + 1 ) / 2 ) ; k [ i ] = 2 * kacc + 1 ; } while ( i++ < for_end ) ; } } void zunpackinfo ( b , iausnahme , iuntrennbar , ierste , izweite , iendung , ivorsilbe , istamm , iehervor , istammallein ) infobyte b ; boolean * iausnahme ; boolean * iuntrennbar ; integer * ierste ; integer * izweite ; boolean * iendung ; boolean * ivorsilbe ; boolean * istamm ; boolean * iehervor ; boolean * istammallein ; {unpackinfo_regmem if ( odd ( b ) ) { (* iausnahme )= true ; b = b / 2 ; if ( odd ( b ) ) (* iuntrennbar )= true ; else (*iuntrennbar )= false ; b = b / 2 ; (* ierste )= b % 8 ; (* izweite )= b / 8 ; } else { (* iausnahme )= false ; b = b / 2 ; if ( odd ( b ) ) (* iendung )= true ; else (*iendung )= false ; b = b / 2 ; if ( odd ( b ) ) (* ivorsilbe )= true ; else (*ivorsilbe )= false ; b = b / 2 ; if ( odd ( b ) ) (* istamm )= true ; else (*istamm )= false ; b = b / 2 ; if ( odd ( b ) ) (* iehervor )= true ; else (*iehervor )= false ; b = b / 2 ; if ( odd ( b ) ) (* istammallein )= true ; else (*istammallein )= false ; } } void zunpackentry ( h , etabv , etabb , efrei , ewiederfrei ) hashelement h ; verdschlue * etabv ; infobyte * etabb ; boolean * efrei ; boolean * ewiederfrei ; {unpackentry_regmem ; (* etabv )= h [ 0 ] + h [ 1 ] * 256 + h [ 2 ] * 256 * 256 ; if ( odd ( h [ 3 ] ) ) { ; (* etabb )= h [ 3 ] ; (* efrei )= false ; (* ewiederfrei )= false ; } else { ; (* etabb )= h [ 3 ] % 64 ; if ( odd ( h [ 3 ] / 64 ) ) (* efrei )= true ; else (*efrei )= false ; if ( odd ( h [ 3 ] / 128 ) ) (* ewiederfrei )= true ; else (*ewiederfrei )= false ; } } void zhashsuch ( v , ind , k , iausnahme , iuntrennbar , ierste , izweite , iendung , ivorsilbe , istamm , iehervor , istammallein , g ) verdschlue v ; integer ind ; integer k ; boolean * iausnahme ; boolean * iuntrennbar ; integer * ierste ; integer * izweite ; boolean * iendung ; boolean * ivorsilbe ; boolean * istamm ; boolean * iehervor ; boolean * istammallein ; boolean * g ; {hashsuch_regmem boolean gef, ngef ; integer j ; tableentry entry ; gef = false ; ngef = false ; j = ind ; do { unpackentry ( htab [ j ] , entry .tabv , entry .tabb , entry .frei , entry .wiederfrei ) ; if ( entry .frei ) ngef = true ; else if ( ( v == entry .tabv ) && ! entry .wiederfrei ) { unpackinfo ( entry .tabb , (*iausnahme ), (*iuntrennbar ), (*ierste ), (*izweite ), (* iendung ), (*ivorsilbe ), (*istamm ), (*iehervor ), (*istammallein )) ; gef = true ; } else j = ( j + k ) % ( tabsize + 1 ) ; } while ( ! ( gef || ngef ) ) ; (* g )= gef ; } void zhashload ( status ) integer * status ; {hashload_regmem integer i ; tableentry e ; {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <= for_end) do nameoffile [ i ] = ' ' ; while ( i++ < for_end ) ; } nameoffile [ 1 ] = 'h' ; nameoffile [ 2 ] = 'f' ; nameoffile [ 3 ] = '3' ; namelength = 3 ; anzahl = 0 ; if ( aopenin ( hashfile , TEXINPUTPATH ) ) { {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) do { int help; fscanf ( hashfile, "%d", &help ); htab [i][0] = (eightbits) help; fscanf ( hashfile, "%d", &help ); htab [i][1] = (eightbits) help; fscanf ( hashfile, "%d", &help ); htab [i][2] = (eightbits) help; fscanf ( hashfile, "%d", &help ); htab [i][3] = (eightbits) help; unpackentry ( htab [ i ] , e .tabv , e .tabb , e .frei , e .wiederfrei ) ; if ( ! e .frei && ! e .wiederfrei ) anzahl = anzahl + 1 ; } while ( i++ < for_end ) ; } (* status )= 0 ; aclose ( hashfile ) ; } else (*status )= 1 ; } void zpackinfo ( i , b ) infotype i ; infobyte * b ; {packinfo_regmem (* b )= 0 ; if ( i .ausnahme ) { ; if ( i .untrennbar ) ; else ; (* b )= 1 + 2 * ord ( i .untrennbar ) + 4 * i .erste + 32 * i .zweite ; } else { ; (* b )= 2 * ord ( i .endung ) + 4 * ord ( i .vorsilbe ) + 8 * ord ( i .stamm ) + 16 * ord ( i .ehervor ) + 32 * ord ( i .stammallein ) ; } } void zpackentry ( e , h ) tableentry e ; hashelement h ; {packentry_regmem ; h [ 0 ] = e .tabv % 256 ; e .tabv = e .tabv / 256 ; h [ 1 ] = e .tabv % 256 ; h [ 2 ] = e .tabv / 256 ; if ( odd ( e .tabb ) ) h [ 3 ] = e .tabb ; else { ; h [ 3 ] = e .tabb + 64 * ord ( e .frei ) + 128 * ord ( e .wiederfrei ) ; } } void zhashetr ( w , laenge , i , g ) wort w ; integer laenge ; infotype i ; boolean * g ; {hashetr_regmem varr v1 ; intarr ind1, k1 ; verdschlue v ; integer ind, k, j, e ; boolean gef, ngef ; tableentry entry ; hashelement helem ; if ( anzahl >= tabsize ) { ; (* g )= false ; } else { ; if ( ( anzahl < 10 ) || ( anzahl % 100 == 0 ) ) { println () ; { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) fprintf( stdout , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ; if ( ( selector == 18 ) || ( selector == 19 ) ) (void) fprintf( logfile , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ; } } hashfunk ( w , 1 , laenge , v1 , ind1 , k1 ) ; v = v1 [ laenge ] ; ind = ind1 [ laenge ] ; k = k1 [ laenge ] ; gef = false ; ngef = false ; do { ; unpackentry ( htab [ ind ] , entry .tabv , entry .tabb , entry .frei , entry .wiederfrei ) ; if ( entry .frei || entry .wiederfrei ) { anzahl = anzahl + 1 ; ngef = true ; entry .tabv = v ; packinfo ( i , entry .tabb ) ; entry .frei = false ; entry .wiederfrei = false ; packentry ( entry , helem ) ; memcpy((void *)htab [ ind ] , (void *)helem , sizeof(hashelement)); } else { ; gef = v == entry .tabv ; if ( ! gef ) ind = ( ind + k ) % ( tabsize + 1 ) ; } } while ( ! ( gef || ngef ) ) ; (* g )= ngef ; } } void hashempty ( ) {hashempty_regmem integer i ; tableentry elem ; hashelement he ; elem .tabv = 0 ; elem .tabb = 0 ; elem .frei = true ; elem .wiederfrei = false ; packentry ( elem , he ) ; {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) do memcpy((void *)htab [ i ] , (void *)he, sizeof(hashelement)); while ( i++ < for_end ) ; } anzahl = 0 ; } void zhashsave ( status ) integer * status ; {hashsave_regmem integer i ; {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <= for_end) do nameoffile [ i ] = ' ' ; while ( i++ < for_end ) ; } nameoffile [ 1 ] = 'h' ; nameoffile [ 2 ] = 'f' ; nameoffile [ 3 ] = '3' ; namelength = 3 ; if ( aopenout ( hashfile ) ) { {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) do { (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 0 ] ) ; (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 1 ] ) ; (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 2 ] ) ; (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 3 ] ) ; (void) putc('\n', hashfile ); } while ( i++ < for_end ) ; } (* status )= 0 ; aclose ( hashfile ) ; } else (*status )= 1 ; } integer hashsize ( ) {register integer Result; hashsize_regmem Result = anzahl ; return(Result) ; } void zzahl ( line , i , ende , j ) string80 line ; integer * i ; integer ende ; integer * j ; {zahl_regmem boolean aus ; (* j )= 0 ; do { if ( (*i )<= ende ) if ( ktab [ line [ (*i )] ] == 46 ) (* i )= (*i )+ 1 ; else aus = true ; else aus = true ; } while ( ! ( aus ) ) ; do { if ( (*i )<= ende ) { switch ( line [ (*i )] ) {case 48 : case 49 : case 50 : case 51 : case 52 : case 53 : case 54 : case 55 : case 56 : case 57 : { (* j )= 10 * (*j )+ line [ (*i )] - 48 ; (* i )= (*i )+ 1 ; } break ; } if ( ( line [ (*i )] != 48 ) && ( line [ (*i )] != 49 ) && ( line [ (*i )] != 50 ) && ( line [ (*i )] != 51 ) && ( line [ (*i )] != 52 ) && ( line [ (*i )] != 53 ) && ( line [ (*i )] != 54 ) && ( line [ (*i )] != 55 ) && ( line [ (*i )] != 56 ) && ( line [ (*i )] != 57 ) ) aus = true ; } else aus = true ; } while ( ! ( aus ) ) ; } void zinfobau ( line , anfang , ende , informausnahme , informuntrennbar , informerste , informzweite , informendung , informvorsilbe , informstamm , informehervor , informstammallein , g ) string80 line ; integer anfang ; integer ende ; boolean * informausnahme ; boolean * informuntrennbar ; integer * informerste ; integer * informzweite ; boolean * informendung ; boolean * informvorsilbe ; boolean * informstamm ; boolean * informehervor ; boolean * informstammallein ; boolean * g ; {infobau_regmem integer i, j ; boolean ok, fehler ; buchstabe b ; (* g )= false ; (* informausnahme )= false ; (* informendung )= false ; (* informvorsilbe )= false ; (* informehervor )= false ; (* informstamm )= false ; (* informstammallein )= false ; i = anfang ; ok = false ; fehler = false ; do { if ( i <= ende ) if ( line [ i ] == 46 ) i = i + 1 ; else ok = true ; else fehler = true ; } while ( ! ( ok || fehler ) ) ; if ( ! fehler ) { b = ktab [ line [ i ] ] ; if ( b == bsta ) { (* informausnahme )= true ; i = i + 1 ; if ( ktab [ line [ i ] ] == bstu ) { i = i + 1 ; (* informuntrennbar )= true ; } else (*informuntrennbar )= false ; zahl ( line , i , ende , j ) ; if ( j == 0 ) { (* informerste )= 7 ; (* informzweite )= 7 ; } else { j = j - 2 ; if ( ( j >= 0 ) && ( j <= 6 ) ) (* informerste )= j ; else fehler = true ; zahl ( line , i , ende , j ) ; if ( j == 0 ) (* informzweite )= 7 ; else { j = j - (*informerste )- 4 ; if ( ( j >= 0 ) && ( j <= 6 ) ) (* informzweite )= j ; else fehler = true ; } } if ( ! fehler ) (* g )= true ; } else { ok = false ; do { switch ( b ) {case 22 : (* informvorsilbe )= true ; break ; case 5 : (* informendung )= true ; break ; case 19 : (* informstamm )= true ; break ; case 2 : (* informehervor )= true ; break ; case 20 : (* informstammallein )= true ; break ; case 31 : ; break ; default: fehler = true ; break ; } if ( i == ende ) ok = true ; else { i = i + 1 ; b = ktab [ line [ i ] ] ; } } while ( ! ( ok || fehler ) ) ; if ( ! fehler ) (* g )= ( (*informvorsilbe )|| (*informendung )|| (*informstamm )) && ( ! (* informehervor )|| (*informvorsilbe )&& (*informendung )) && ( ! (* informstammallein )|| (*informstamm )) ; } } } void zeintragen ( line , l ) string80 line ; integer l ; {eintragen_regmem integer i, laenge ; infotype inform ; wort w ; boolean g ; laenge = 1 ; while ( line [ laenge ] != 46 ) laenge = laenge + 1 ; laenge = laenge - 1 ; if ( laenge >= 1 ) { if ( laenge <= maxwl ) { infobau ( line , laenge + 1 , l , inform .ausnahme , inform .untrennbar , inform .erste , inform .zweite , inform .endung , inform .vorsilbe , inform .stamm , inform .ehervor , inform .stammallein , g ) ; if ( ! g ) { println () ; { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) Fputs( stdout , " Info falsch: " ) ; if ( ( selector == 18 ) || ( selector == 19 ) ) (void) Fputs( logfile , " Info falsch: " ) ; } } else { {register integer for_end; i = 1 ; for_end = laenge ; if ( i <= for_end) do w [ i ] = ktab [ line [ i ] ] ; while ( i++ < for_end ) ; } hashetr ( w , laenge , inform , g ) ; if ( ! g ) { println () ; { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) Fputs( stdout , " Tabellenfehler: " ) ; if ( ( selector == 18 ) || ( selector == 19 ) ) (void) Fputs( logfile , " Tabellenfehler: " ) ; } } } if ( ! g ) { {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) putc( Xchr ( line [ i ] ) , stdout ); if ( ( selector == 18 ) || ( selector == 19 ) ) (void) putc( Xchr ( line [ i ] ) , logfile ); } while ( i++ < for_end ) ; } println () ; } } else { println () ; { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) fprintf( stdout , "%s\n", " zu langes Wort: " ) ; if ( ( selector == 18 ) || ( selector == 19 ) ) (void) fprintf( logfile , "%s\n", " zu langes Wort: " ) ; } {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) putc( Xchr ( line [ i ] ) , stdout ); if ( ( selector == 18 ) || ( selector == 19 ) ) (void) putc( Xchr ( line [ i ] ) , logfile ); } while ( i++ < for_end ) ; } println () ; } } else { println () ; { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) fprintf( stdout , "%s\n", " Falsche Zeile: " ) ; if ( ( selector == 18 ) || ( selector == 19 ) ) (void) fprintf( logfile , "%s\n", " Falsche Zeile: " ) ; } {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do { if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) println () ; if ( selector != 18 ) (void) putc( Xchr ( line [ i ] ) , stdout ); if ( ( selector == 18 ) || ( selector == 19 ) ) (void) putc( Xchr ( line [ i ] ) , logfile ); } while ( i++ < for_end ) ; } println () ; } } void znaechsterbst ( i , tr , dudstop , b , w ) integer * i ; trennvektor tr ; sperrvektor dudstop ; buchstabe * b ; wort w ; {naechsterbst_regmem if ( ( (*i )> 0 ) && ( tr [ (*i )] == keine ) && ! dudstop [ (*i )] ) { (* b )= w [ (*i )] ; (* i )= (*i )- 1 ; } else (*b )= trennzeichen ; } void zduden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , zerlegungen ) trennvektor tr ; wort w ; trennvektor tr1 ; trennvektor dudtr ; dudt dud ; sperrvektor dudstop ; integer laenge ; boolean * ok ; integer * zerlegungen ; {duden_regmem integer i ; integer j ; integer zust ; boolean aus ; integer tre ; integer letzte ; integer l, lalt ; buchstabe b ; i = laenge ; {register integer for_end; j = 0 ; for_end = laenge ; if ( j <= for_end) do dudtr [ j ] = tr [ j ] ; while ( j++ < for_end ) ; } while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ; while ( i > 0 ) { zust = 1 ; aus = false ; letzte = 0 ; l = kons ; b = w [ i ] ; i = i - 1 ; do { { tre = i + 1 ; lalt = l ; switch ( b ) {case 1 : { l = voka ; naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 15 : { l = voko ; naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 29 : { l = vokue ; naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 28 : { l = vokoe ; naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 27 : { l = vokae ; naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 5 : { l = voke ; naechsterbst ( i , tr , dudstop , b , w ) ; if ( b == bsti ) { l = vokie ; naechsterbst ( i , tr , dudstop , b , w ) ; if ( b == bste ) { i = i + 1 ; l = voke ; b = bsti ; } } } break ; case 9 : { l = voki ; naechsterbst ( i , tr , dudstop , b , w ) ; if ( b == bste ) { l = vokei ; naechsterbst ( i , tr , dudstop , b , w ) ; } else if ( b == bsta ) { l = vokai ; naechsterbst ( i , tr , dudstop , b , w ) ; } } break ; case 21 : { l = voku ; naechsterbst ( i , tr , dudstop , b , w ) ; if ( b == bste ) { l = vokeu ; naechsterbst ( i , tr , dudstop , b , w ) ; } else if ( b == bsta ) { l = vokau ; naechsterbst ( i , tr , dudstop , b , w ) ; } else if ( b == bstae ) { l = vokaeu ; naechsterbst ( i , tr , dudstop , b , w ) ; } else if ( b == bstq ) { l = kons ; naechsterbst ( i , tr , dudstop , b , w ) ; } } break ; case 20 : { l = kons ; naechsterbst ( i , tr , dudstop , b , w ) ; if ( b == bsts ) naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 8 : { l = kons ; naechsterbst ( i , tr , dudstop , b , w ) ; if ( b == bstc ) { naechsterbst ( i , tr , dudstop , b , w ) ; if ( b == bsts ) naechsterbst ( i , tr , dudstop , b , w ) ; } else if ( b == bstp ) naechsterbst ( i , tr , dudstop , b , w ) ; else if ( b == bstt ) naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 2 : case 3 : case 4 : case 6 : case 7 : case 10 : case 11 : case 12 : case 13 : case 14 : case 16 : case 17 : case 18 : case 19 : case 22 : case 23 : case 24 : case 26 : case 30 : { l = kons ; naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 25 : { l = voky ; naechsterbst ( i , tr , dudstop , b , w ) ; } break ; case 31 : case 0 : aus = true ; break ; } } if ( ! aus ) switch ( zust ) {case 1 : if ( l == kons ) zust = 2 ; else zust = 4 ; break ; case 2 : if ( l != kons ) zust = 3 ; break ; case 3 : if ( l == kons ) zust = 6 ; else if ( l != lalt ) { zust = 4 ; letzte = tre ; dudtr [ letzte ] = neben ; } break ; case 4 : if ( l == kons ) zust = 6 ; else zust = 3 ; break ; case 6 : if ( l == kons ) { zust = 2 ; letzte = tre ; if ( ( w [ tre ] == bstc ) && ( w [ tre + 1 ] == bstk ) ) dudtr [ letzte ] = nebenck ; else dudtr [ letzte ] = neben ; } else { zust = 4 ; letzte = tre ; dudtr [ letzte ] = neben ; } break ; } } while ( ! ( aus ) ) ; if ( zust == 2 ) dudtr [ letzte ] = keine ; else if ( zust == 4 ) if ( ( lalt < vokie ) || ( lalt > vokeu ) ) dudtr [ letzte ] = keine ; while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ; } } void ztrennen ( zustand , anfang , spv , ok1 , alletr , tr , dudtr , zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) integer zustand ; integer anfang ; sperrvektor spv ; boolean * ok1 ; trenn16 alletr ; trennvektor tr ; trennvektor dudtr ; integer * zerlegungen ; dudt dud ; varr v ; intarr ind ; intarr k ; sperrvektor dudstop ; wort w ; trennvektor tr1 ; integer laenge ; {trennen_regmem boolean gef, nichtok ; integer schnitt ; infotype inform ; integer i ; boolean okstamm, okvor, okend, okhelp ; integer tri ; integer i1, tre ; boolean ok ; integer stopptr ; sperrvektor spvtmp ; trennvektor trlast ; memcpy((void *)spvtmp, (void *)spv, sizeof(sperrvektor)) ; (* ok1 )= false ; if ( anfang == laenge + 1 ) if ( ( zustand == 2 ) || ( zustand == 4 ) ) { dud [ anfang - 1 ] = true ; duden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , (*zerlegungen )) ; {register integer for_end; i = laenge ; for_end = 1 ; if ( i >= for_end) do { if ( dudtr [ i - 1 ] == haupt3 ) { dudtr [ i - 1 ] = keine ; tri = haupt3 ; } else tri = dudtr [ i ] ; if ( (*zerlegungen )== 0 ) tr1 [ i ] = tri ; else tr1 [ i ] = kombtab [ tr1 [ i ] ][ tri ] ; trlast [ i ] = tri ; } while ( i-- > for_end ) ; } (* zerlegungen )= (*zerlegungen )+ 1 ; memcpy((void *)alletr[(*zerlegungen)],(void *)trlast,sizeof(trennvektor)); (* ok1 )= true ; } else ; else { hashfunk ( w , anfang , laenge , v , ind , k ) ; schnitt = laenge ; nichtok = false ; do { do { if ( spv [ schnitt ] ) gef = false ; else { hashsuch ( v [ schnitt ] , ind [ schnitt ] , k [ schnitt ] , inform .ausnahme , inform .untrennbar , inform .erste , inform .zweite , inform .endung , inform .vorsilbe , inform .stamm , inform .ehervor , inform .stammallein , gef ) ; } if ( gef ) spv [ schnitt ] = true ; else schnitt = schnitt - 1 ; } while ( ! ( gef || ( schnitt == anfang - 1 ) ) ) ; if ( gef ) { if ( ! inform .ausnahme ) { if ( inform .endung && ( zustand == 2 ) ) { okend = false ; if ( ( w [ anfang ] == bstc ) || ( w [ anfang ] == bsth ) ) { dud [ anfang - 1 ] = true ; tr [ anfang - 1 ] = neben ; } if ( schnitt < laenge ) if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) { spv [ schnitt + 1 ] = true ; trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okend = okhelp ; } trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okend = okend || okhelp ; tr [ anfang - 1 ] = keine ; dud [ anfang - 1 ] = false ; (* ok1 )= (*ok1 )|| okend ; } else okend = false ; if ( inform .vorsilbe ) { if ( zustand == 1 ) tr [ anfang - 1 ] = neben ; else { dud [ anfang - 1 ] = true ; if ( zustand == 5 ) tr [ anfang - 1 ] = haupt3 ; else tr [ anfang - 1 ] = haupt ; } dud [ schnitt ] = true ; trennen ( 1 , schnitt + 1 , spv , okvor , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; tr [ anfang - 1 ] = keine ; dud [ anfang - 1 ] = false ; dud [ schnitt ] = false ; (* ok1 )= (*ok1 )|| okvor ; } else okvor = false ; if ( inform .stamm && ! okvor ) { if ( ! inform .stammallein ) { okstamm = false ; stopptr = 0 ; if ( zustand == 1 ) tr [ anfang - 1 ] = neben ; else { dud [ anfang - 1 ] = true ; if ( zustand == 5 ) tr [ anfang - 1 ] = haupt3 ; else tr [ anfang - 1 ] = haupt ; } if ( inform .ausnahme ) { if ( inform .erste != 7 ) { tre = anfang + inform .erste + 1 ; tr [ tre ] = neben ; if ( inform .zweite != 7 ) { tre = tre + inform .zweite + 2 ; if ( inform .untrennbar ) { stopptr = tre ; dudstop [ stopptr ] = true ; } else tr [ tre ] = neben ; } else { if ( inform .untrennbar ) { tr [ tre ] = keine ; stopptr = tre ; dudstop [ tre ] = true ; } } } else { stopptr = schnitt - 1 ; dudstop [ stopptr ] = true ; } } if ( schnitt < laenge ) if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) { spv [ schnitt + 1 ] = true ; trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr , (*zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okstamm = okhelp ; } if ( ( schnitt >= 2 ) && ( schnitt < laenge ) ) if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + 1 ] ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) ) { trennen ( 5 , schnitt , spv , okhelp , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okstamm = okstamm || okhelp ; } trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okstamm = okstamm || okhelp ; if ( inform .ausnahme ) {register integer for_end; i1 = anfang - 1 ; for_end = schnitt ; if ( i1 <= for_end) do { tr [ i1 ] = keine ; dud [ i1 ] = false ; dudstop [ stopptr ] = false ; } while ( i1++ < for_end ) ; } else { tr [ anfang - 1 ] = keine ; dud [ anfang - 1 ] = false ; } (* ok1 )= (*ok1 )|| okstamm ; } else if ( ( anfang == 1 ) && ( schnitt == laenge ) ) { dud [ anfang - 1 ] = true ; tr [ anfang - 1 ] = haupt ; trennen ( 4 , schnitt + 1 , spv , okstamm , alletr , tr , dudtr , (*zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; tr [ anfang - 1 ] = keine ; dud [ anfang - 1 ] = false ; (* ok1 )= (*ok1 )|| okstamm ; } } } else { okstamm = false ; stopptr = 0 ; if ( zustand == 1 ) tr [ anfang - 1 ] = neben ; else { dud [ anfang - 1 ] = true ; if ( zustand == 5 ) tr [ anfang - 1 ] = haupt3 ; else tr [ anfang - 1 ] = haupt ; } if ( inform .ausnahme ) { if ( inform .erste != 7 ) { tre = anfang + inform .erste + 1 ; tr [ tre ] = neben ; if ( inform .zweite != 7 ) { tre = tre + inform .zweite + 2 ; if ( inform .untrennbar ) { stopptr = tre ; dudstop [ stopptr ] = true ; } else tr [ tre ] = neben ; } else { if ( inform .untrennbar ) { tr [ tre ] = keine ; stopptr = tre ; dudstop [ tre ] = true ; } } } else { stopptr = schnitt - 1 ; dudstop [ stopptr ] = true ; } } if ( schnitt < laenge ) if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) { spv [ schnitt + 1 ] = true ; trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okstamm = okhelp ; } if ( ( schnitt >= 2 ) && ( schnitt < laenge ) ) if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + 1 ] ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) ) { trennen ( 5 , schnitt , spv , okhelp , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okstamm = okstamm || okhelp ; } trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (* zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; okstamm = okstamm || okhelp ; if ( inform .ausnahme ) {register integer for_end; i1 = anfang - 1 ; for_end = schnitt ; if ( i1 <= for_end) do { tr [ i1 ] = keine ; dud [ i1 ] = false ; dudstop [ stopptr ] = false ; } while ( i1++ < for_end ) ; } else { tr [ anfang - 1 ] = keine ; dud [ anfang - 1 ] = false ; } (* ok1 )= (*ok1 )|| okstamm ; } schnitt = schnitt - 1 ; nichtok = schnitt == anfang - 1 ; } else nichtok = true ; } while ( ! ( nichtok ) ) ; } memcpy((void *)spv, (void *)spvtmp, sizeof(sperrvektor)) ; } void zwchar ( c ) halfword c ; {wchar_regmem if ( c == 27 ) { (void) Fputs( stdout , "\"a" ) ; } else if ( c == 28 ) { (void) Fputs( stdout , "\"o" ) ; } else if ( c == 29 ) { (void) Fputs( stdout , "\"u" ) ; } else if ( c == 30 ) { (void) Fputs( stdout , "\"s" ) ; } else { (void) putc( Xchr ( c + 96 ) , stdout ); } } void zwwort ( w , l ) wort w ; integer l ; {wwort_regmem integer i ; {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do { wchar ( w [ i ] ) ; } while ( i++ < for_end ) ; } } void zwritewt ( w , l , tr ) wort w ; integer l ; trennvektor tr ; {writewt_regmem integer i ; wchar ( w [ 1 ] ) ; {register integer for_end; i = 2 ; for_end = l - 1 ; if ( i <= for_end) do { if ( ( tr [ i - 1 ] == nebenck ) ) { (void) putc( 'k' , stdout ); (void) putc( '-' , stdout ); } else if ( ( tr [ i ] == haupt3 ) ) { (void) putc( Xchr ( w [ i ] + 96 ) , stdout ); (void) putc( '=' , stdout ); (void) putc( Xchr ( w [ i ] + 96 ) , stdout ); } else if ( ( tr [ i ] == haupt ) ) { wchar ( w [ i ] ) ; (void) putc( '=' , stdout ); } else if ( ( tr [ i ] == neben ) ) { wchar ( w [ i ] ) ; (void) putc( '-' , stdout ); } else { wchar ( w [ i ] ) ; } } while ( i++ < for_end ) ; } wchar ( w [ l ] ) ; } void wjob ( ) {wjob_regmem integer i ; {register integer for_end; i = strstart [ jobname ] ; for_end = strstart [ jobname + 1 ] - 1 ; if ( i <= for_end) do { (void) putc( Xchr ( strpool [ i ] ) , stdout ); } while ( i++ < for_end ) ; } } integer zvergl ( wrt1 , l1 , wrt2 , l2 ) wort wrt1 ; integer l1 ; wort wrt2 ; integer l2 ; {/* 99 */ register integer Result; vergl_regmem integer i ; i = 1 ; while ( ( i <= l1 ) && ( i <= l2 ) ) { if ( wrt1 [ i ] < wrt2 [ i ] ) { Result = -1 ; goto lab99 ; } else if ( wrt1 [ i ] > wrt2 [ i ] ) { Result = 1 ; goto lab99 ; } i = i + 1 ; } if ( l1 < l2 ) { Result = -1 ; goto lab99 ; } else if ( l1 > l2 ) { Result = 1 ; goto lab99 ; } else { Result = 0 ; goto lab99 ; } lab99: ; return(Result) ; } void zgleicheweg ( alletr , zerleg , laenge ) trenn16 alletr ; integer * zerleg ; integer laenge ; {gleicheweg_regmem integer i, j, k ; boolean gleich ; i = 1 ; do { j = i + 1 ; do { gleich = true ; k = 1 ; do { if ( alletr [ i ] [ k ] == alletr [ j ] [ k ] ) { k = k + 1 ; } else { gleich = false ; } } while ( ! ( ( k > laenge ) || ( gleich == false ) ) ) ; if ( gleich ) { {register integer for_end; k = j ; for_end = (*zerleg )- 1 ; if ( k <= for_end) do { memcpy((void *)alletr[k],(void *)alletr[k+1],sizeof(trennvektor)); } while ( k++ < for_end ) ; } (* zerleg )= (*zerleg )- 1 ; } else { j = j + 1 ; } } while ( ! ( j > (*zerleg )) ) ; i = i + 1 ; } while ( ! ( i > (*zerleg )- 1 ) ) ; } void zmdbeintragen ( w , l , tr , neu , used , mdb ) wort w ; integer l ; trennvektor tr ; boolean neu ; boolean used ; mdbknoten * mdb ; {mdbeintragen_regmem integer test ; if ( (*mdb )== nil ) { (* mdb )= (mdbknoten) malloc ( sizeof ( mdbschnuller ) ) ; memcpy((void *)(* mdb )->w12 ,(void *) w ,sizeof(wort)); (* mdb )->l1 = l ; memcpy((void *)(* mdb )->tr1 ,(void *) tr,sizeof(trennvektor)) ; (* mdb )->neu1 = neu ; (* mdb )->used1 = used ; (* mdb )->del1 = false ; (* mdb )->li = nil ; (* mdb )->re = nil ; if ( isidebug == 1 ) { (void) putc('\n', stdout ); } } else { test = vergl ( w , l , (*mdb )->w12 , (*mdb )->l1 ) ; if ( test == -1 ) { if ( isidebug == 1 ) { (void) putc( '/' , stdout ); } mdbeintragen ( w , l , tr , neu , used , (*mdb )->li ) ; } else if ( test == 1 ) { if ( isidebug == 1 ) { (void) putc( '\\' , stdout ); } mdbeintragen ( w , l , tr , neu , used , (*mdb )->re ) ; } else { (void) Fputs( stdout , " =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!" ) ; (void) putc('\n', stdout ); } } } void zmdmeintragen ( w , l , tr , neu , mdm ) wort w ; integer l ; trennvektor tr ; boolean neu ; mdmknoten * mdm ; {mdmeintragen_regmem mdmknoten rechts ; if ( (*mdm )== nil ) { (* mdm )= (mdmknoten) malloc ( sizeof ( mdmschnuller ) ) ; memcpy((void *)(* mdm )->w12 ,(void *) w,sizeof(wort)) ; (* mdm )->l1 = l ; memcpy((void *)(* mdm )->tr1 ,(void *) tr,sizeof(trennvektor)) ; (* mdm )->neu1 = neu ; (* mdm )->li = nil ; (* mdm )->re = nil ; } else if ( (*mdm )->re == nil ) { (* mdm )->re = (mdmknoten) malloc ( sizeof ( mdmschnuller ) ) ; memcpy((void *)(* mdm )->re ->w12 ,(void *) w ,sizeof(wort)); (* mdm )->re ->l1 = l ; memcpy((void *)(* mdm )->re ->tr1 ,(void *) tr,sizeof(trennvektor)) ; (* mdm )->re ->neu1 = neu ; (* mdm )->re ->li = nil ; (* mdm )->re ->re = nil ; (* mdm )->li = (*mdm )->re ; } else { rechts = (*mdm )->re ; (* mdm )->re = (mdmknoten) malloc ( sizeof (mdmschnuller ) ) ; memcpy((void *)(* mdm )->re ->w12 ,(void *) w ,sizeof(wort)); (* mdm )->re ->l1 = l ; memcpy((void *)(* mdm )->re ->tr1 ,(void *) tr ,sizeof(trennvektor)); (* mdm )->re ->neu1 = neu ; (* mdm )->re ->li = nil ; (* mdm )->re ->re = nil ; rechts ->li = (*mdm )->re ; } } void zmdleintragen ( w , l , mdl ) wort w ; integer l ; mdlknoten * mdl ; {mdleintragen_regmem mdlknoten rechts ; if ( isidebug == 1 ) { (void) Fputs( stdout , " =iSi=> mdl_eintragen von " ) ; wwort ( w , l ) ; (void) putc('\n', stdout ); } if ( (*mdl )== nil ) { (* mdl )= (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ; memcpy((void *)(* mdl )->w12 ,(void *) w,sizeof(wort)) ; (* mdl )->l1 = l ; (* mdl )->li = nil ; (* mdl )->re = nil ; } else if ( (*mdl )->re == nil ) { (* mdl )->re = (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ; memcpy((void *)(* mdl )->re ->w12 ,(void *) w,sizeof(wort)) ; (* mdl )->re ->l1 = l ; (* mdl )->re ->li = nil ; (* mdl )->re ->re = nil ; (* mdl )->li = (*mdl )->re ; } else { rechts = (*mdl )->re ; (* mdl )->re = (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ; memcpy((void *)(* mdl )->re ->w12 ,(void *) w,sizeof(wort)) ; (* mdl )->re ->l1 = l ; (* mdl )->re ->li = nil ; (* mdl )->re ->re = nil ; rechts ->li = (*mdl )->re ; } } void zmdeeintragen ( w , l , mde ) wort w ; integer l ; mdeknoten * mde ; {mdeeintragen_regmem mdeknoten rechts ; if ( isidebug == 1 ) { (void) Fputs( stdout , " =iSi=> mde_eintragen von " ) ; wwort ( w , l ) ; (void) putc('\n', stdout ); } if ( (*mde )== nil ) { (* mde )= (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ; memcpy((void *)(* mde )->w12 ,(void *) w,sizeof(wort)) ; (* mde )->l1 = l ; (* mde )->li = nil ; (* mde )->re = nil ; } else if ( (*mde )->re == nil ) { (* mde )->re = (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ; memcpy((void *)(* mde )->re ->w12 ,(void *) w,sizeof(wort)) ; (* mde )->re ->l1 = l ; (* mde )->re ->li = nil ; (* mde )->re ->re = nil ; (* mde )->li = (*mde )->re ; } else { rechts = (*mde )->re ; (* mde )->re = (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ; memcpy((void *)(* mde )->re ->w12 ,(void *) w,sizeof(wort)) ; (* mde )->re ->l1 = l ; (* mde )->re ->li = nil ; (* mde )->re ->re = nil ; rechts ->li = (*mde )->re ; } } boolean zmdsuchen ( w , l , mdb , tr ) wort w ; integer l ; mdbknoten * mdb ; trennvektor tr ; {register boolean Result; mdsuchen_regmem integer test ; if ( (*mdb )== nil ) { Result = false ; } else { test = vergl ( w , l , (*mdb )->w12 , (*mdb )->l1 ) ; if ( test == -1 ) { Result = mdsuchen ( w , l , (*mdb )->li , tr ) ; } else if ( test == 1 ) { Result = mdsuchen ( w , l , (*mdb )->re , tr ) ; } else { tr = (*mdb )->tr1 ; (* mdb )->used1 = true ; Result = true ; } } return(Result) ; }