#define PATGEN #include "cpascal.h" /* 9999 */ #define triesize ( 55000L ) #define triecsize ( 26000 ) #define maxops ( 4080 ) #define maxval ( 10 ) #define maxdot ( 15 ) #define maxlen ( 50 ) #define maxbuflen ( 3000 ) typedef unsigned char ASCIIcode ; typedef ASCIIcode textchar ; typedef text textfile ; typedef unsigned char packedASCIIcode ; typedef ASCIIcode internalcode ; typedef packedASCIIcode packedinternalcode ; typedef char classtype ; typedef char digit ; typedef char hyftype ; typedef unsigned char qindex ; typedef integer valtype ; typedef integer dottype ; typedef integer optype ; typedef integer wordindex ; typedef integer triepointer ; typedef integer triecpointer ; typedef struct { dottype dot ; valtype val ; optype op ; } opword ; dottype patstart, patfinish ; valtype hyphstart, hyphfinish ; integer goodwt, badwt, thresh ; ASCIIcode xord[256] ; textchar xchr[256] ; classtype xclass[256] ; internalcode xint[256] ; textchar xdig[10] ; textchar xext[256] ; textchar xhyf[4] ; internalcode cmax ; packedinternalcode triec[triesize + 1] ; triepointer triel[triesize + 1], trier[triesize + 1] ; boolean trietaken[triesize + 1] ; packedinternalcode triecc[triecsize + 1] ; triecpointer triecl[triecsize + 1], triecr[triecsize + 1] ; boolean triectaken[triecsize + 1] ; opword ops[maxops + 1] ; internalcode trieqc[256] ; triepointer trieql[256], trieqr[256] ; qindex qmax ; qindex qmaxthresh ; triepointer triemax ; triepointer triebmax ; triepointer triecount ; optype opcount ; internalcode pat[maxdot + 1] ; dottype patlen ; triecpointer triecmax, triecbmax, trieccount ; triecpointer trieckmax ; integer patcount ; textfile dictionary, patterns, translate, patout, pattmp ; char * fname ; real badfrac, denom, eff ; textchar buf[maxbuflen + 1] ; integer bufptr ; internalcode imax ; dottype lefthyphenmin, righthyphenmin ; integer goodpatcount, badpatcount ; integer goodcount, badcount, misscount ; integer levelpatterncount ; boolean moretocome ; internalcode word[maxlen + 1] ; hyftype dots[maxlen + 1] ; digit dotw[maxlen + 1] ; valtype hval[maxlen + 1] ; boolean nomore[maxlen + 1] ; wordindex wlen ; digit wordwt ; boolean wtchg ; wordindex hyfmin, hyfmax, hyflen ; hyftype gooddot, baddot ; wordindex dotmin, dotmax, dotlen ; boolean procesp, hyphp ; dottype patdot ; valtype hyphlevel ; char filnam[9] ; valtype maxpat ; integer n1, n2, n3 ; valtype i ; dottype j ; dottype k ; dottype dot1 ; boolean morethislevel[maxdot + 1] ; #include "patgen.h" void #ifdef HAVE_PROTOTYPES parsearguments ( void ) #else parsearguments ( ) #endif { #define noptions ( 2 ) getoptstruct longoptions[noptions + 1] ; integer getoptreturnval ; cinttype optionindex ; integer currentoption ; currentoption = 0 ; longoptions [currentoption ].name = "help" ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = "version" ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = 0 ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; do { getoptreturnval = getoptlongonly ( argc , argv , "" , longoptions , addressof ( optionindex ) ) ; if ( getoptreturnval == -1 ) { ; } else if ( getoptreturnval == '?' ) { usage ( 1 , "patgen" ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "help" ) == 0 ) ) { usage ( 0 , PATGENHELP ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "version" ) == 0 ) ) { printversionandexit ( "This is PATGEN, Version 2.3" , nil , "Frank M. Liang and Peter Breitenlohner" ) ; } } while ( ! ( getoptreturnval == -1 ) ) ; if ( ( optind + 4 != argc ) ) { fprintf( stderr , "%s\n", "patgen: Need exactly four arguments." ) ; usage ( 1 , "patgen" ) ; } } void #ifdef HAVE_PROTOTYPES initialize ( void ) #else initialize ( ) #endif { integer bad ; textchar i ; ASCIIcode j ; kpsesetprogname ( argv [0 ]) ; parsearguments () ; Fputs( output , "This is PATGEN, Version 2.3" ) ; fprintf( output , "%s\n", versionstring ) ; bad = 0 ; if ( 255 < 127 ) bad = 1 ; if ( ( 0 != 0 ) || ( 0 != 0 ) ) bad = 2 ; if ( ( triecsize < 4096 ) || ( triesize < triecsize ) ) bad = 3 ; if ( maxops > triesize ) bad = 4 ; if ( maxval > 10 ) bad = 5 ; if ( maxbuflen < maxlen ) bad = 6 ; if ( bad > 0 ) { fprintf( stderr , "%s%ld\n", "Bad constants---case " , (long)bad ) ; uexit ( 1 ) ; } {register integer for_end; j = 0 ;for_end = 255 ; if ( j <= for_end) do xchr [j ]= ' ' ; while ( j++ < for_end ) ;} xchr [46 ]= '.' ; xchr [48 ]= '0' ; xchr [49 ]= '1' ; xchr [50 ]= '2' ; xchr [51 ]= '3' ; xchr [52 ]= '4' ; xchr [53 ]= '5' ; xchr [54 ]= '6' ; xchr [55 ]= '7' ; xchr [56 ]= '8' ; xchr [57 ]= '9' ; xchr [65 ]= 'A' ; xchr [66 ]= 'B' ; xchr [67 ]= 'C' ; xchr [68 ]= 'D' ; xchr [69 ]= 'E' ; xchr [70 ]= 'F' ; xchr [71 ]= 'G' ; xchr [72 ]= 'H' ; xchr [73 ]= 'I' ; xchr [74 ]= 'J' ; xchr [75 ]= 'K' ; xchr [76 ]= 'L' ; xchr [77 ]= 'M' ; xchr [78 ]= 'N' ; xchr [79 ]= 'O' ; xchr [80 ]= 'P' ; xchr [81 ]= 'Q' ; xchr [82 ]= 'R' ; xchr [83 ]= 'S' ; xchr [84 ]= 'T' ; xchr [85 ]= 'U' ; xchr [86 ]= 'V' ; xchr [87 ]= 'W' ; xchr [88 ]= 'X' ; xchr [89 ]= 'Y' ; xchr [90 ]= 'Z' ; xchr [97 ]= 'a' ; xchr [98 ]= 'b' ; xchr [99 ]= 'c' ; xchr [100 ]= 'd' ; xchr [101 ]= 'e' ; xchr [102 ]= 'f' ; xchr [103 ]= 'g' ; xchr [104 ]= 'h' ; xchr [105 ]= 'i' ; xchr [106 ]= 'j' ; xchr [107 ]= 'k' ; xchr [108 ]= 'l' ; xchr [109 ]= 'm' ; xchr [110 ]= 'n' ; xchr [111 ]= 'o' ; xchr [112 ]= 'p' ; xchr [113 ]= 'q' ; xchr [114 ]= 'r' ; xchr [115 ]= 's' ; xchr [116 ]= 't' ; xchr [117 ]= 'u' ; xchr [118 ]= 'v' ; xchr [119 ]= 'w' ; xchr [120 ]= 'x' ; xchr [121 ]= 'y' ; xchr [122 ]= 'z' ; {register integer for_end; i = chr ( 0 ) ;for_end = chr ( 255 ) ; if ( i <= for_end) do xord [i ]= 0 ; while ( i++ < for_end ) ;} {register integer for_end; j = 0 ;for_end = 255 ; if ( j <= for_end) do xord [xchr [j ]]= j ; while ( j++ < for_end ) ;} xord [' ' ]= 32 ; xord [chr ( 9 ) ]= 32 ; {register integer for_end; i = chr ( 0 ) ;for_end = chr ( 255 ) ; if ( i <= for_end) do { xclass [i ]= 5 ; xint [i ]= 0 ; } while ( i++ < for_end ) ;} xclass [' ' ]= 0 ; {register integer for_end; j = 0 ;for_end = 255 ; if ( j <= for_end) do xext [j ]= ' ' ; while ( j++ < for_end ) ;} xext [1 ]= '.' ; {register integer for_end; j = 0 ;for_end = 9 ; if ( j <= for_end) do { xdig [j ]= xchr [j + 48 ]; xclass [xdig [j ]]= 1 ; xint [xdig [j ]]= j ; } while ( j++ < for_end ) ;} xhyf [1 ]= '.' ; xhyf [2 ]= '-' ; xhyf [3 ]= '*' ; } ASCIIcode #ifdef HAVE_PROTOTYPES zgetASCII ( textchar c ) #else zgetASCII ( c ) textchar c ; #endif { /* 40 */ register ASCIIcode Result; ASCIIcode i ; i = xord [c ]; if ( i == 0 ) { while ( i < 255 ) { i = i + 1 ; if ( ( xchr [i ]== ' ' ) && ( i != 32 ) ) goto lab40 ; } { fprintf( stderr , "%s%ld%s%s\n", "PATGEN capacity exceeded, sorry [" , (long)256 , " characters" , "]." ) ; uexit ( 1 ) ; } lab40: xord [c ]= i ; xchr [i ]= c ; } Result = i ; return Result ; } void #ifdef HAVE_PROTOTYPES initpatterntrie ( void ) #else initpatterntrie ( ) #endif { internalcode c ; optype h ; {register integer for_end; c = 0 ;for_end = 255 ; if ( c <= for_end) do { triec [1 + c ]= c ; triel [1 + c ]= 0 ; trier [1 + c ]= 0 ; trietaken [1 + c ]= false ; } while ( c++ < for_end ) ;} trietaken [1 ]= true ; triebmax = 1 ; triemax = 256 ; triecount = 256 ; qmaxthresh = 5 ; triel [0 ]= triemax + 1 ; trier [triemax + 1 ]= 0 ; {register integer for_end; h = 1 ;for_end = maxops ; if ( h <= for_end) do ops [h ].val = 0 ; while ( h++ < for_end ) ;} opcount = 0 ; } triepointer #ifdef HAVE_PROTOTYPES firstfit ( void ) #else firstfit ( ) #endif { /* 40 41 */ register triepointer Result; triepointer s, t ; qindex q ; if ( qmax > qmaxthresh ) t = trier [triemax + 1 ]; else t = 0 ; while ( true ) { t = triel [t ]; s = t - trieqc [1 ]; if ( s > triesize - 256 ) { fprintf( stderr , "%s%ld%s%s\n", "PATGEN capacity exceeded, sorry [" , (long)triesize , " pattern trie nodes" , "]." ) ; uexit ( 1 ) ; } while ( triebmax < s ) { triebmax = triebmax + 1 ; trietaken [triebmax ]= false ; triec [triebmax + 255 ]= 0 ; triel [triebmax + 255 ]= triebmax + 256 ; trier [triebmax + 256 ]= triebmax + 255 ; } if ( trietaken [s ]) goto lab41 ; {register integer for_end; q = qmax ;for_end = 2 ; if ( q >= for_end) do if ( triec [s + trieqc [q ]]!= 0 ) goto lab41 ; while ( q-- > for_end ) ;} goto lab40 ; lab41: ; } lab40: ; {register integer for_end; q = 1 ;for_end = qmax ; if ( q <= for_end) do { t = s + trieqc [q ]; triel [trier [t ]]= triel [t ]; trier [triel [t ]]= trier [t ]; triec [t ]= trieqc [q ]; triel [t ]= trieql [q ]; trier [t ]= trieqr [q ]; if ( t > triemax ) triemax = t ; } while ( q++ < for_end ) ;} trietaken [s ]= true ; Result = s ; return Result ; } void #ifdef HAVE_PROTOTYPES zunpack ( triepointer s ) #else zunpack ( s ) triepointer s ; #endif { internalcode c ; triepointer t ; qmax = 1 ; {register integer for_end; c = 1 ;for_end = cmax ; if ( c <= for_end) do { t = s + c ; if ( triec [t ]== c ) { trieqc [qmax ]= c ; trieql [qmax ]= triel [t ]; trieqr [qmax ]= trier [t ]; qmax = qmax + 1 ; trier [triel [0 ]]= t ; triel [t ]= triel [0 ]; triel [0 ]= t ; trier [t ]= 0 ; triec [t ]= 0 ; } } while ( c++ < for_end ) ;} trietaken [s ]= false ; } optype #ifdef HAVE_PROTOTYPES znewtrieop ( valtype v , dottype d , optype n ) #else znewtrieop ( v , d , n ) valtype v ; dottype d ; optype n ; #endif { /* 10 */ register optype Result; optype h ; h = ( ( n + 313 * d + 361 * v ) % maxops ) + 1 ; while ( true ) { if ( ops [h ].val == 0 ) { opcount = opcount + 1 ; if ( opcount == maxops ) { fprintf( stderr , "%s%ld%s%s\n", "PATGEN capacity exceeded, sorry [" , (long)maxops , " outputs" , "]." ) ; uexit ( 1 ) ; } ops [h ].val = v ; ops [h ].dot = d ; ops [h ].op = n ; Result = h ; goto lab10 ; } if ( ( ops [h ].val == v ) && ( ops [h ].dot == d ) && ( ops [h ].op == n ) ) { Result = h ; goto lab10 ; } if ( h > 1 ) h = h - 1 ; else h = maxops ; } lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES zinsertpattern ( valtype val , dottype dot ) #else zinsertpattern ( val , dot ) valtype val ; dottype dot ; #endif { dottype i ; triepointer s, t ; i = 1 ; s = 1 + pat [i ]; t = triel [s ]; while ( ( t > 0 ) && ( i < patlen ) ) { i = i + 1 ; t = t + pat [i ]; if ( triec [t ]!= pat [i ]) { if ( triec [t ]== 0 ) { triel [trier [t ]]= triel [t ]; trier [triel [t ]]= trier [t ]; triec [t ]= pat [i ]; triel [t ]= 0 ; trier [t ]= 0 ; if ( t > triemax ) triemax = t ; } else { unpack ( t - pat [i ]) ; trieqc [qmax ]= pat [i ]; trieql [qmax ]= 0 ; trieqr [qmax ]= 0 ; t = firstfit () ; triel [s ]= t ; t = t + pat [i ]; } triecount = triecount + 1 ; } s = t ; t = triel [s ]; } trieql [1 ]= 0 ; trieqr [1 ]= 0 ; qmax = 1 ; while ( i < patlen ) { i = i + 1 ; trieqc [1 ]= pat [i ]; t = firstfit () ; triel [s ]= t ; s = t + pat [i ]; triecount = triecount + 1 ; } trier [s ]= newtrieop ( val , dot , trier [s ]) ; } void #ifdef HAVE_PROTOTYPES initcounttrie ( void ) #else initcounttrie ( ) #endif { internalcode c ; {register integer for_end; c = 0 ;for_end = 255 ; if ( c <= for_end) do { triecc [1 + c ]= c ; triecl [1 + c ]= 0 ; triecr [1 + c ]= 0 ; triectaken [1 + c ]= false ; } while ( c++ < for_end ) ;} triectaken [1 ]= true ; triecbmax = 1 ; triecmax = 256 ; trieccount = 256 ; trieckmax = 4096 ; triecl [0 ]= triecmax + 1 ; triecr [triecmax + 1 ]= 0 ; patcount = 0 ; } triecpointer #ifdef HAVE_PROTOTYPES firstcfit ( void ) #else firstcfit ( ) #endif { /* 40 41 */ register triecpointer Result; triecpointer a, b ; qindex q ; if ( qmax > 3 ) a = triecr [triecmax + 1 ]; else a = 0 ; while ( true ) { a = triecl [a ]; b = a - trieqc [1 ]; if ( b > trieckmax - 256 ) { if ( trieckmax == triecsize ) { fprintf( stderr , "%s%ld%s%s\n", "PATGEN capacity exceeded, sorry [" , (long)triecsize , " count trie nodes" , "]." ) ; uexit ( 1 ) ; } fprintf( output , "%ld%s", (long)trieckmax / 1024 , "K " ) ; if ( trieckmax > triecsize - 4096 ) trieckmax = triecsize ; else trieckmax = trieckmax + 4096 ; } while ( triecbmax < b ) { triecbmax = triecbmax + 1 ; triectaken [triecbmax ]= false ; triecc [triecbmax + 255 ]= 0 ; triecl [triecbmax + 255 ]= triecbmax + 256 ; triecr [triecbmax + 256 ]= triecbmax + 255 ; } if ( triectaken [b ]) goto lab41 ; {register integer for_end; q = qmax ;for_end = 2 ; if ( q >= for_end) do if ( triecc [b + trieqc [q ]]!= 0 ) goto lab41 ; while ( q-- > for_end ) ;} goto lab40 ; lab41: ; } lab40: ; {register integer for_end; q = 1 ;for_end = qmax ; if ( q <= for_end) do { a = b + trieqc [q ]; triecl [triecr [a ]]= triecl [a ]; triecr [triecl [a ]]= triecr [a ]; triecc [a ]= trieqc [q ]; triecl [a ]= trieql [q ]; triecr [a ]= trieqr [q ]; if ( a > triecmax ) triecmax = a ; } while ( q++ < for_end ) ;} triectaken [b ]= true ; Result = b ; return Result ; } void #ifdef HAVE_PROTOTYPES zunpackc ( triecpointer b ) #else zunpackc ( b ) triecpointer b ; #endif { internalcode c ; triecpointer a ; qmax = 1 ; {register integer for_end; c = 1 ;for_end = cmax ; if ( c <= for_end) do { a = b + c ; if ( triecc [a ]== c ) { trieqc [qmax ]= c ; trieql [qmax ]= triecl [a ]; trieqr [qmax ]= triecr [a ]; qmax = qmax + 1 ; triecr [triecl [0 ]]= a ; triecl [a ]= triecl [0 ]; triecl [0 ]= a ; triecr [a ]= 0 ; triecc [a ]= 0 ; } } while ( c++ < for_end ) ;} triectaken [b ]= false ; } triecpointer #ifdef HAVE_PROTOTYPES zinsertcpat ( wordindex fpos ) #else zinsertcpat ( fpos ) wordindex fpos ; #endif { register triecpointer Result; wordindex spos ; triecpointer a, b ; spos = fpos - patlen ; spos = spos + 1 ; b = 1 + word [spos ]; a = triecl [b ]; while ( ( a > 0 ) && ( spos < fpos ) ) { spos = spos + 1 ; a = a + word [spos ]; if ( triecc [a ]!= word [spos ]) { if ( triecc [a ]== 0 ) { triecl [triecr [a ]]= triecl [a ]; triecr [triecl [a ]]= triecr [a ]; triecc [a ]= word [spos ]; triecl [a ]= 0 ; triecr [a ]= 0 ; if ( a > triecmax ) triecmax = a ; } else { unpackc ( a - word [spos ]) ; trieqc [qmax ]= word [spos ]; trieql [qmax ]= 0 ; trieqr [qmax ]= 0 ; a = firstcfit () ; triecl [b ]= a ; a = a + word [spos ]; } trieccount = trieccount + 1 ; } b = a ; a = triecl [a ]; } trieql [1 ]= 0 ; trieqr [1 ]= 0 ; qmax = 1 ; while ( spos < fpos ) { spos = spos + 1 ; trieqc [1 ]= word [spos ]; a = firstcfit () ; triecl [b ]= a ; b = a + word [spos ]; trieccount = trieccount + 1 ; } Result = b ; patcount = patcount + 1 ; return Result ; } void #ifdef HAVE_PROTOTYPES readtranslate ( void ) #else readtranslate ( ) #endif { /* 30 */ textchar c ; integer n ; ASCIIcode j ; boolean bad ; boolean lower ; dottype i ; triepointer s, t ; imax = 1 ; fname = cmdline ( 4 ) ; reset ( translate , fname ) ; if ( eof ( translate ) ) { lefthyphenmin = 2 ; righthyphenmin = 3 ; {register integer for_end; j = 65 ;for_end = 90 ; if ( j <= for_end) do { imax = imax + 1 ; c = xchr [j + 32 ]; xclass [c ]= 3 ; xint [c ]= imax ; xext [imax ]= c ; c = xchr [j ]; xclass [c ]= 3 ; xint [c ]= imax ; } while ( j++ < for_end ) ;} } else { { bufptr = 0 ; while ( ! eoln ( translate ) ) { if ( ( bufptr >= maxbuflen ) ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Line too long" ) ; uexit ( 1 ) ; } } bufptr = bufptr + 1 ; read ( translate , buf [bufptr ]) ; } readln ( translate ) ; while ( bufptr < maxbuflen ) { bufptr = bufptr + 1 ; buf [bufptr ]= ' ' ; } } bad = false ; if ( buf [1 ]== ' ' ) n = 0 ; else if ( xclass [buf [1 ]]== 1 ) n = xint [buf [1 ]]; else bad = true ; if ( xclass [buf [2 ]]== 1 ) n = 10 * n + xint [buf [2 ]]; else bad = true ; if ( ( n >= 1 ) && ( n < maxdot ) ) lefthyphenmin = n ; else bad = true ; if ( buf [3 ]== ' ' ) n = 0 ; else if ( xclass [buf [3 ]]== 1 ) n = xint [buf [3 ]]; else bad = true ; if ( xclass [buf [4 ]]== 1 ) n = 10 * n + xint [buf [4 ]]; else bad = true ; if ( ( n >= 1 ) && ( n < maxdot ) ) righthyphenmin = n ; else bad = true ; if ( bad ) { bad = false ; do { Fputs( output , "left_hyphen_min, right_hyphen_min: " ) ; input2ints ( n1 , n2 ) ; if ( ( n1 >= 1 ) && ( n1 < maxdot ) && ( n2 >= 1 ) && ( n2 < maxdot ) ) { lefthyphenmin = n1 ; righthyphenmin = n2 ; } else { n1 = 0 ; fprintf( output , "%s%ld%s\n", "Specify 1<=left_hyphen_min,right_hyphen_min<=" , (long)maxdot - 1 , " !" ) ; } } while ( ! ( n1 > 0 ) ) ; } {register integer for_end; j = 1 ;for_end = 3 ; if ( j <= for_end) do { if ( buf [j + 4 ]!= ' ' ) xhyf [j ]= buf [j + 4 ]; if ( xclass [xhyf [j ]]== 5 ) xclass [xhyf [j ]]= 2 ; else bad = true ; } while ( j++ < for_end ) ;} xclass ['.' ]= 2 ; if ( bad ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad hyphenation data" ) ; uexit ( 1 ) ; } } cmax = 254 ; while ( ! eof ( translate ) ) { { bufptr = 0 ; while ( ! eoln ( translate ) ) { if ( ( bufptr >= maxbuflen ) ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Line too long" ) ; uexit ( 1 ) ; } } bufptr = bufptr + 1 ; read ( translate , buf [bufptr ]) ; } readln ( translate ) ; while ( bufptr < maxbuflen ) { bufptr = bufptr + 1 ; buf [bufptr ]= ' ' ; } } bufptr = 1 ; lower = true ; while ( ! bad ) { patlen = 0 ; do { if ( bufptr < maxbuflen ) bufptr = bufptr + 1 ; else bad = true ; if ( buf [bufptr ]== buf [1 ]) if ( patlen == 0 ) goto lab30 ; else { if ( lower ) { if ( imax == 255 ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s%ld%s%s\n", "PATGEN capacity exceeded, sorry [" , (long)256 , " letters" , "]." ) ; uexit ( 1 ) ; } } imax = imax + 1 ; xext [imax ]= xchr [pat [patlen ]]; } c = xchr [pat [1 ]]; if ( patlen == 1 ) { if ( xclass [c ]!= 5 ) bad = true ; xclass [c ]= 3 ; xint [c ]= imax ; } else { if ( xclass [c ]== 5 ) xclass [c ]= 4 ; if ( xclass [c ]!= 4 ) bad = true ; i = 0 ; s = 1 ; t = triel [s ]; while ( ( t > 1 ) && ( i < patlen ) ) { i = i + 1 ; t = t + pat [i ]; if ( triec [t ]!= pat [i ]) { if ( triec [t ]== 0 ) { triel [trier [t ]]= triel [t ]; trier [triel [t ]]= trier [t ]; triec [t ]= pat [i ]; triel [t ]= 0 ; trier [t ]= 0 ; if ( t > triemax ) triemax = t ; } else { unpack ( t - pat [i ]) ; trieqc [qmax ]= pat [i ]; trieql [qmax ]= 0 ; trieqr [qmax ]= 0 ; t = firstfit () ; triel [s ]= t ; t = t + pat [i ]; } triecount = triecount + 1 ; } else if ( trier [t ]> 0 ) bad = true ; s = t ; t = triel [s ]; } if ( t > 1 ) bad = true ; trieql [1 ]= 0 ; trieqr [1 ]= 0 ; qmax = 1 ; while ( i < patlen ) { i = i + 1 ; trieqc [1 ]= pat [i ]; t = firstfit () ; triel [s ]= t ; s = t + pat [i ]; triecount = triecount + 1 ; } trier [s ]= imax ; if ( ! lower ) triel [s ]= 1 ; } } else if ( patlen == maxdot ) bad = true ; else { patlen = patlen + 1 ; pat [patlen ]= getASCII ( buf [bufptr ]) ; } } while ( ! ( ( buf [bufptr ]== buf [1 ]) || bad ) ) ; lower = false ; } lab30: if ( bad ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad representation" ) ; uexit ( 1 ) ; } } } } fprintf( output , "%s%ld%s%ld%s%ld%s\n", "left_hyphen_min = " , (long)lefthyphenmin , ", right_hyphen_min = " , (long)righthyphenmin , ", " , (long)imax - 1 , " letters" ) ; cmax = imax ; } void #ifdef HAVE_PROTOTYPES zfindletters ( triepointer b , dottype i ) #else zfindletters ( b , i ) triepointer b ; dottype i ; #endif { ASCIIcode c ; triepointer a ; dottype j ; triecpointer l ; if ( i == 1 ) initcounttrie () ; {register integer for_end; c = 1 ;for_end = 255 ; if ( c <= for_end) do { a = b + c ; if ( triec [a ]== c ) { pat [i ]= c ; if ( trier [a ]== 0 ) findletters ( triel [a ], i + 1 ) ; else if ( triel [a ]== 0 ) { l = 1 + trier [a ]; {register integer for_end; j = 1 ;for_end = i - 1 ; if ( j <= for_end) do { if ( triecmax == triecsize ) { fprintf( stderr , "%s%ld%s%s\n", "PATGEN capacity exceeded, sorry [" , (long)triecsize , " count trie nodes" , "]." ) ; uexit ( 1 ) ; } triecmax = triecmax + 1 ; triecl [l ]= triecmax ; l = triecmax ; triecc [l ]= pat [j ]; } while ( j++ < for_end ) ;} triecl [l ]= 0 ; } } } while ( c++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES ztraversecounttrie ( triecpointer b , dottype i ) #else ztraversecounttrie ( b , i ) triecpointer b ; dottype i ; #endif { internalcode c ; triecpointer a ; {register integer for_end; c = 1 ;for_end = cmax ; if ( c <= for_end) do { a = b + c ; if ( triecc [a ]== c ) { pat [i ]= c ; if ( i < patlen ) traversecounttrie ( triecl [a ], i + 1 ) ; else if ( goodwt * triecl [a ]< thresh ) { insertpattern ( maxval , patdot ) ; badpatcount = badpatcount + 1 ; } else if ( goodwt * triecl [a ]- badwt * triecr [a ]>= thresh ) { insertpattern ( hyphlevel , patdot ) ; goodpatcount = goodpatcount + 1 ; goodcount = goodcount + triecl [a ]; badcount = badcount + triecr [a ]; } else moretocome = true ; } } while ( c++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES collectcounttrie ( void ) #else collectcounttrie ( ) #endif { goodpatcount = 0 ; badpatcount = 0 ; goodcount = 0 ; badcount = 0 ; moretocome = false ; traversecounttrie ( 1 , 1 ) ; fprintf( output , "%ld%s%ld%s", (long)goodpatcount , " good and " , (long)badpatcount , " bad patterns added" ) ; levelpatterncount = levelpatterncount + goodpatcount ; if ( moretocome ) fprintf( output , "%s\n", " (more to come)" ) ; else fprintf( output , "%c\n", ' ' ) ; fprintf( output , "%s%ld%s%ld%s", "finding " , (long)goodcount , " good and " , (long)badcount , " bad hyphens" ) ; if ( goodpatcount > 0 ) { Fputs( output , ", efficiency = " ) ; printreal ( goodcount / ((double) ( goodpatcount + badcount / ((double) ( thresh / ((double) goodwt ) ) ) ) ) , 1 , 2 ) ; putc ('\n', output ); } else fprintf( output , "%c\n", ' ' ) ; fprintf( output , "%s%ld%s%s%ld%s%ld%s\n", "pattern trie has " , (long)triecount , " nodes, " , "trie_max = " , (long)triemax , ", " , (long)opcount , " outputs" ) ; } triepointer #ifdef HAVE_PROTOTYPES zdeletepatterns ( triepointer s ) #else zdeletepatterns ( s ) triepointer s ; #endif { register triepointer Result; internalcode c ; triepointer t ; boolean allfreed ; optype h, n ; allfreed = true ; {register integer for_end; c = 1 ;for_end = cmax ; if ( c <= for_end) do { t = s + c ; if ( triec [t ]== c ) { { h = 0 ; ops [0 ].op = trier [t ]; n = ops [0 ].op ; while ( n > 0 ) { if ( ops [n ].val == maxval ) ops [h ].op = ops [n ].op ; else h = n ; n = ops [h ].op ; } trier [t ]= ops [0 ].op ; } if ( triel [t ]> 0 ) triel [t ]= deletepatterns ( triel [t ]) ; if ( ( triel [t ]> 0 ) || ( trier [t ]> 0 ) || ( s == 1 ) ) allfreed = false ; else { triel [trier [triemax + 1 ]]= t ; trier [t ]= trier [triemax + 1 ]; triel [t ]= triemax + 1 ; trier [triemax + 1 ]= t ; triec [t ]= 0 ; triecount = triecount - 1 ; } } } while ( c++ < for_end ) ;} if ( allfreed ) { trietaken [s ]= false ; s = 0 ; } Result = s ; return Result ; } void #ifdef HAVE_PROTOTYPES deletebadpatterns ( void ) #else deletebadpatterns ( ) #endif { optype oldopcount ; triepointer oldtriecount ; triepointer t ; optype h ; oldopcount = opcount ; oldtriecount = triecount ; t = deletepatterns ( 1 ) ; {register integer for_end; h = 1 ;for_end = maxops ; if ( h <= for_end) do if ( ops [h ].val == maxval ) { ops [h ].val = 0 ; opcount = opcount - 1 ; } while ( h++ < for_end ) ;} fprintf( output , "%ld%s%ld%s\n", (long)oldtriecount - triecount , " nodes and " , (long)oldopcount - opcount , " outputs deleted" ) ; qmaxthresh = 7 ; } void #ifdef HAVE_PROTOTYPES zoutputpatterns ( triepointer s , dottype patlen ) #else zoutputpatterns ( s , patlen ) triepointer s ; dottype patlen ; #endif { internalcode c ; triepointer t ; optype h ; dottype d ; triecpointer l ; {register integer for_end; c = 1 ;for_end = cmax ; if ( c <= for_end) do { t = s + c ; if ( triec [t ]== c ) { pat [patlen ]= c ; h = trier [t ]; if ( h > 0 ) { {register integer for_end; d = 0 ;for_end = patlen ; if ( d <= for_end) do hval [d ]= 0 ; while ( d++ < for_end ) ;} do { d = ops [h ].dot ; if ( hval [d ]< ops [h ].val ) hval [d ]= ops [h ].val ; h = ops [h ].op ; } while ( ! ( h == 0 ) ) ; if ( hval [0 ]> 0 ) putc ( xdig [hval [0 ]], patout ); {register integer for_end; d = 1 ;for_end = patlen ; if ( d <= for_end) do { l = triecl [1 + pat [d ]]; while ( l > 0 ) { putc ( xchr [triecc [l ]], patout ); l = triecl [l ]; } putc ( xext [pat [d ]], patout ); if ( hval [d ]> 0 ) putc ( xdig [hval [d ]], patout ); } while ( d++ < for_end ) ;} putc ('\n', patout ); } if ( triel [t ]> 0 ) outputpatterns ( triel [t ], patlen + 1 ) ; } } while ( c++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES readword ( void ) #else readword ( ) #endif { /* 30 40 */ textchar c ; triepointer t ; { bufptr = 0 ; while ( ! eoln ( dictionary ) ) { if ( ( bufptr >= maxbuflen ) ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Line too long" ) ; uexit ( 1 ) ; } } bufptr = bufptr + 1 ; read ( dictionary , buf [bufptr ]) ; } readln ( dictionary ) ; while ( bufptr < maxbuflen ) { bufptr = bufptr + 1 ; buf [bufptr ]= ' ' ; } } word [1 ]= 1 ; wlen = 1 ; bufptr = 0 ; do { bufptr = bufptr + 1 ; c = buf [bufptr ]; switch ( xclass [c ]) {case 0 : goto lab40 ; break ; case 1 : if ( wlen == 1 ) { if ( xint [c ]!= wordwt ) wtchg = true ; wordwt = xint [c ]; } else dotw [wlen ]= xint [c ]; break ; case 2 : dots [wlen ]= xint [c ]; break ; case 3 : { wlen = wlen + 1 ; if ( wlen == maxlen ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s%s%ld%s\n", "PATGEN capacity exceeded, sorry [" , "word length=" , (long)maxlen , "]." ) ; uexit ( 1 ) ; } } word [wlen ]= xint [c ]; dots [wlen ]= 0 ; dotw [wlen ]= wordwt ; } break ; case 4 : { wlen = wlen + 1 ; if ( wlen == maxlen ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s%s%ld%s\n", "PATGEN capacity exceeded, sorry [" , "word length=" , (long)maxlen , "]." ) ; uexit ( 1 ) ; } } { t = 1 ; while ( true ) { t = triel [t ]+ xord [c ]; if ( triec [t ]!= xord [c ]) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad representation" ) ; uexit ( 1 ) ; } } if ( trier [t ]!= 0 ) { word [wlen ]= trier [t ]; goto lab30 ; } if ( bufptr == maxbuflen ) c = ' ' ; else { bufptr = bufptr + 1 ; c = buf [bufptr ]; } } lab30: ; } dots [wlen ]= 0 ; dotw [wlen ]= wordwt ; } break ; case 5 : { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad character" ) ; uexit ( 1 ) ; } } break ; } } while ( ! ( bufptr == maxbuflen ) ) ; lab40: wlen = wlen + 1 ; word [wlen ]= 1 ; } void #ifdef HAVE_PROTOTYPES hyphenate ( void ) #else hyphenate ( ) #endif { /* 30 */ wordindex spos, dpos, fpos ; triepointer t ; optype h ; valtype v ; {register integer for_end; spos = wlen - hyfmax ;for_end = 0 ; if ( spos >= for_end) do { nomore [spos ]= false ; hval [spos ]= 0 ; fpos = spos + 1 ; t = 1 + word [fpos ]; do { h = trier [t ]; while ( h > 0 ) { dpos = spos + ops [h ].dot ; v = ops [h ].val ; if ( ( v < maxval ) && ( hval [dpos ]< v ) ) hval [dpos ]= v ; if ( ( v >= hyphlevel ) ) if ( ( ( fpos - patlen ) <= ( dpos - patdot ) ) && ( ( dpos - patdot ) <= spos ) ) nomore [dpos ]= true ; h = ops [h ].op ; } t = triel [t ]; if ( t == 0 ) goto lab30 ; fpos = fpos + 1 ; t = t + word [fpos ]; } while ( ! ( triec [t ]!= word [fpos ]) ) ; lab30: ; } while ( spos-- > for_end ) ;} } void #ifdef HAVE_PROTOTYPES changedots ( void ) #else changedots ( ) #endif { wordindex dpos ; {register integer for_end; dpos = wlen - hyfmax ;for_end = hyfmin ; if ( dpos >= for_end) do { if ( odd ( hval [dpos ]) ) dots [dpos ]= dots [dpos ]+ 1 ; if ( dots [dpos ]== 3 ) goodcount = goodcount + dotw [dpos ]; else if ( dots [dpos ]== 1 ) badcount = badcount + dotw [dpos ]; else if ( dots [dpos ]== 2 ) misscount = misscount + dotw [dpos ]; } while ( dpos-- > for_end ) ;} } void #ifdef HAVE_PROTOTYPES outputhyphenatedword ( void ) #else outputhyphenatedword ( ) #endif { wordindex dpos ; triecpointer l ; if ( wtchg ) { putc ( xdig [wordwt ], pattmp ); wtchg = false ; } {register integer for_end; dpos = 2 ;for_end = wlen - 2 ; if ( dpos <= for_end) do { l = triecl [1 + word [dpos ]]; while ( l > 0 ) { putc ( xchr [triecc [l ]], pattmp ); l = triecl [l ]; } putc ( xext [word [dpos ]], pattmp ); if ( dots [dpos ]!= 0 ) putc ( xhyf [dots [dpos ]], pattmp ); if ( dotw [dpos ]!= wordwt ) putc ( xdig [dotw [dpos ]], pattmp ); } while ( dpos++ < for_end ) ;} l = triecl [1 + word [wlen - 1 ]]; while ( l > 0 ) { putc ( xchr [triecc [l ]], pattmp ); l = triecl [l ]; } fprintf( pattmp , "%c\n", xext [word [wlen - 1 ]]) ; } void #ifdef HAVE_PROTOTYPES doword ( void ) #else doword ( ) #endif { /* 22 30 */ wordindex spos, dpos, fpos ; triecpointer a ; boolean goodp ; {register integer for_end; dpos = wlen - dotmax ;for_end = dotmin ; if ( dpos >= for_end) do { spos = dpos - patdot ; fpos = spos + patlen ; if ( nomore [dpos ]) goto lab22 ; if ( dots [dpos ]== gooddot ) goodp = true ; else if ( dots [dpos ]== baddot ) goodp = false ; else goto lab22 ; spos = spos + 1 ; a = 1 + word [spos ]; while ( spos < fpos ) { spos = spos + 1 ; a = triecl [a ]+ word [spos ]; if ( triecc [a ]!= word [spos ]) { a = insertcpat ( fpos ) ; goto lab30 ; } } lab30: if ( goodp ) triecl [a ]= triecl [a ]+ dotw [dpos ]; else triecr [a ]= triecr [a ]+ dotw [dpos ]; lab22: ; } while ( dpos-- > for_end ) ;} } void #ifdef HAVE_PROTOTYPES dodictionary ( void ) #else dodictionary ( ) #endif { goodcount = 0 ; badcount = 0 ; misscount = 0 ; wordwt = 1 ; wtchg = false ; fname = cmdline ( 1 ) ; reset ( dictionary , fname ) ; xclass ['.' ]= 5 ; xclass [xhyf [1 ]]= 2 ; xint [xhyf [1 ]]= 0 ; xclass [xhyf [2 ]]= 2 ; xint [xhyf [2 ]]= 2 ; xclass [xhyf [3 ]]= 2 ; xint [xhyf [3 ]]= 2 ; hyfmin = lefthyphenmin + 1 ; hyfmax = righthyphenmin + 1 ; hyflen = hyfmin + hyfmax ; if ( procesp ) { dotmin = patdot ; dotmax = patlen - patdot ; if ( dotmin < hyfmin ) dotmin = hyfmin ; if ( dotmax < hyfmax ) dotmax = hyfmax ; dotlen = dotmin + dotmax ; if ( odd ( hyphlevel ) ) { gooddot = 2 ; baddot = 0 ; } else { gooddot = 1 ; baddot = 3 ; } } if ( procesp ) { initcounttrie () ; fprintf( output , "%s%ld%s%ld\n", "processing dictionary with pat_len = " , (long)patlen , ", pat_dot = " , (long)patdot ) ; } if ( hyphp ) { strcpy ( filnam , "pattmp" ) ; filnam [8 ]= xdig [hyphlevel ]; rewrite ( pattmp , filnam ) ; fprintf( output , "%s%c\n", "writing pattmp." , xdig [hyphlevel ]) ; } while ( ! eof ( dictionary ) ) { readword () ; if ( wlen >= hyflen ) { hyphenate () ; changedots () ; } if ( hyphp ) if ( wlen > 2 ) outputhyphenatedword () ; if ( procesp ) if ( wlen >= dotlen ) doword () ; } fprintf( output , "%c\n", ' ' ) ; fprintf( output , "%ld%s%ld%s%ld%s\n", (long)goodcount , " good, " , (long)badcount , " bad, " , (long)misscount , " missed" ) ; if ( ( goodcount + misscount ) > 0 ) { printreal ( ( 100 * goodcount / ((double) ( goodcount + misscount ) ) ) , 1 , 2 ) ; Fputs( output , " %, " ) ; printreal ( ( 100 * badcount / ((double) ( goodcount + misscount ) ) ) , 1 , 2 ) ; Fputs( output , " %, " ) ; printreal ( ( 100 * misscount / ((double) ( goodcount + misscount ) ) ) , 1 , 2 ) ; fprintf( output , "%s\n", " %" ) ; } if ( procesp ) fprintf( output , "%ld%s%ld%s%s%ld\n", (long)patcount , " patterns, " , (long)trieccount , " nodes in count trie, " , "triec_max = " , (long)triecmax ) ; if ( hyphp ) ; } void #ifdef HAVE_PROTOTYPES readpatterns ( void ) #else readpatterns ( ) #endif { /* 30 40 */ textchar c ; digit d ; dottype i ; triepointer t ; xclass ['.' ]= 3 ; xint ['.' ]= 1 ; levelpatterncount = 0 ; maxpat = 0 ; fname = cmdline ( 2 ) ; reset ( patterns , fname ) ; while ( ! eof ( patterns ) ) { { bufptr = 0 ; while ( ! eoln ( patterns ) ) { if ( ( bufptr >= maxbuflen ) ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Line too long" ) ; uexit ( 1 ) ; } } bufptr = bufptr + 1 ; read ( patterns , buf [bufptr ]) ; } readln ( patterns ) ; while ( bufptr < maxbuflen ) { bufptr = bufptr + 1 ; buf [bufptr ]= ' ' ; } } levelpatterncount = levelpatterncount + 1 ; patlen = 0 ; bufptr = 0 ; hval [0 ]= 0 ; do { bufptr = bufptr + 1 ; c = buf [bufptr ]; switch ( xclass [c ]) {case 0 : goto lab40 ; break ; case 1 : { d = xint [c ]; if ( d >= maxval ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad hyphenation value" ) ; uexit ( 1 ) ; } } if ( d > maxpat ) maxpat = d ; hval [patlen ]= d ; } break ; case 3 : { patlen = patlen + 1 ; hval [patlen ]= 0 ; pat [patlen ]= xint [c ]; } break ; case 4 : { patlen = patlen + 1 ; hval [patlen ]= 0 ; { t = 1 ; while ( true ) { t = triel [t ]+ xord [c ]; if ( triec [t ]!= xord [c ]) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad representation" ) ; uexit ( 1 ) ; } } if ( trier [t ]!= 0 ) { pat [patlen ]= trier [t ]; goto lab30 ; } if ( bufptr == maxbuflen ) c = ' ' ; else { bufptr = bufptr + 1 ; c = buf [bufptr ]; } } lab30: ; } } break ; case 2 : case 5 : { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad character" ) ; uexit ( 1 ) ; } } break ; } } while ( ! ( bufptr == maxbuflen ) ) ; lab40: if ( patlen > 0 ) {register integer for_end; i = 0 ;for_end = patlen ; if ( i <= for_end) do { if ( hval [i ]!= 0 ) insertpattern ( hval [i ], i ) ; if ( i > 1 ) if ( i < patlen ) if ( pat [i ]== 1 ) { { bufptr = 0 ; do { bufptr = bufptr + 1 ; putc ( buf [bufptr ], output ); } while ( ! ( bufptr == maxbuflen ) ) ; fprintf( output , "%c\n", ' ' ) ; } { fprintf( stderr , "%s\n", "Bad edge_of_word" ) ; uexit ( 1 ) ; } } } while ( i++ < for_end ) ;} } fprintf( output , "%ld%s\n", (long)levelpatterncount , " patterns read in" ) ; fprintf( output , "%s%ld%s%s%ld%s%ld%s\n", "pattern trie has " , (long)triecount , " nodes, " , "trie_max = " , (long)triemax , ", " , (long)opcount , " outputs" ) ; } void mainbody() { initialize () ; initpatterntrie () ; readtranslate () ; readpatterns () ; procesp = true ; hyphp = false ; do { Fputs( output , "hyph_start, hyph_finish: " ) ; input2ints ( n1 , n2 ) ; if ( ( n1 >= 1 ) && ( n1 < maxval ) && ( n2 >= 1 ) && ( n2 < maxval ) ) { hyphstart = n1 ; hyphfinish = n2 ; } else { n1 = 0 ; fprintf( output , "%s%ld%s\n", "Specify 1<=hyph_start,hyph_finish<=" , (long)maxval - 1 , " !" ) ; } } while ( ! ( n1 > 0 ) ) ; hyphlevel = maxpat ; {register integer for_end; i = hyphstart ;for_end = hyphfinish ; if ( i <= for_end) do { hyphlevel = i ; levelpatterncount = 0 ; if ( hyphlevel > hyphstart ) fprintf( output , "%c\n", ' ' ) ; else if ( hyphstart <= maxpat ) fprintf( output , "%s%ld%s\n", "Largest hyphenation value " , (long)maxpat , " in patterns should be less than hyph_start" ) ; do { Fputs( output , "pat_start, pat_finish: " ) ; input2ints ( n1 , n2 ) ; if ( ( n1 >= 1 ) && ( n1 <= n2 ) && ( n2 <= maxdot ) ) { patstart = n1 ; patfinish = n2 ; } else { n1 = 0 ; fprintf( output , "%s%ld%s\n", "Specify 1<=pat_start<=pat_finish<=" , (long)maxdot , " !" ) ; } } while ( ! ( n1 > 0 ) ) ; do { Fputs( output , "good weight, bad weight, threshold: " ) ; input3ints ( n1 , n2 , n3 ) ; if ( ( n1 >= 1 ) && ( n2 >= 1 ) && ( n3 >= 1 ) ) { goodwt = n1 ; badwt = n2 ; thresh = n3 ; } else { n1 = 0 ; fprintf( output , "%s\n", "Specify good weight, bad weight, threshold>=1 !" ) ; } } while ( ! ( n1 > 0 ) ) ; {register integer for_end; k = 0 ;for_end = maxdot ; if ( k <= for_end) do morethislevel [k ]= true ; while ( k++ < for_end ) ;} {register integer for_end; j = patstart ;for_end = patfinish ; if ( j <= for_end) do { patlen = j ; patdot = patlen / 2 ; dot1 = patdot * 2 ; do { patdot = dot1 - patdot ; dot1 = patlen * 2 - dot1 - 1 ; if ( morethislevel [patdot ]) { dodictionary () ; collectcounttrie () ; morethislevel [patdot ]= moretocome ; } } while ( ! ( patdot == patlen ) ) ; {register integer for_end; k = maxdot ;for_end = 1 ; if ( k >= for_end) do if ( ! morethislevel [k - 1 ]) morethislevel [k ]= false ; while ( k-- > for_end ) ;} } while ( j++ < for_end ) ;} deletebadpatterns () ; fprintf( output , "%s%ld%s%ld\n", "total of " , (long)levelpatterncount , " patterns at hyph_level " , (long)hyphlevel ) ; } while ( i++ < for_end ) ;} findletters ( triel [1 ], 1 ) ; fname = cmdline ( 3 ) ; rewrite ( patout , fname ) ; outputpatterns ( 1 , 1 ) ; procesp = false ; hyphp = true ; Fputs( output , "hyphenate word list? " ) ; { buf [1 ]= getc ( stdin ) ; readln ( stdin ) ; } if ( ( buf [1 ]== 'Y' ) || ( buf [1 ]== 'y' ) ) dodictionary () ; lab9999: ; }