#define GFTOPK #include "cpascal.h" #define linelength ( 79 ) #define maxrow ( 100000L ) typedef char ASCIIcode ; typedef text /* of char */ textfile ; typedef unsigned char eightbits ; typedef text /* of eightbits */ bytefile ; ASCIIcode xord[256] ; char xchr[256] ; bytefile gffile ; bytefile pkfile ; integer pkloc ; integer gfloc ; boolean pkopen ; integer bitweight ; integer outputbyte ; integer gflen ; integer tfmwidth[256] ; integer dx[256], dy[256] ; char status[256] ; integer row[maxrow + 1] ; integer gfch ; integer gfchmod256 ; integer predpkloc ; integer maxn, minn ; integer maxm, minm ; integer rowptr ; integer power[9] ; char comment[1] ; integer checksum ; integer designsize ; integer hmag ; integer i ; cinttype verbose ; cstring gfname, pkname, vplname ; #include "gftopk.h" void #ifdef HAVE_PROTOTYPES parsearguments ( void ) #else parsearguments ( ) #endif { #define noptions ( 3 ) getoptstruct longoptions[noptions + 1] ; integer getoptreturnval ; cinttype optionindex ; integer currentoption ; verbose = false ; 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 = "verbose" ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = addressof ( verbose ) ; longoptions [currentoption ].val = 1 ; 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 == 63 ) { usage ( 1 , "gftopk" ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "help" ) == 0 ) ) { usage ( 0 , GFTOPKHELP ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "version" ) == 0 ) ) { printversionandexit ( "This is GFtoPK, Version 2.3" , nil , "Tomas Rokicki" ) ; } } while ( ! ( getoptreturnval == -1 ) ) ; if ( ( optind + 1 != argc ) && ( optind + 2 != argc ) ) { fprintf( stderr , "%s\n", "gftopk: Need one or two file arguments." ) ; usage ( 1 , "gftopk" ) ; } gfname = cmdline ( optind ) ; if ( optind + 2 == argc ) { pkname = cmdline ( optind + 1 ) ; } else { pkname = basenamechangesuffix ( gfname , "gf" , "pk" ) ; } } void #ifdef HAVE_PROTOTYPES initialize ( void ) #else initialize ( ) #endif { integer i ; kpsesetprogname ( argv [0 ]) ; kpseinitprog ( "GFTOPK" , 0 , nil , nil ) ; parsearguments () ; if ( verbose ) Fputs( stdout , "This is GFtoPK, Version 2.3" ) ; if ( verbose ) fprintf( stdout , "%s\n", versionstring ) ; {register integer for_end; i = 0 ;for_end = 31 ; if ( i <= for_end) do xchr [i ]= '?' ; while ( i++ < for_end ) ;} xchr [32 ]= ' ' ; xchr [33 ]= '!' ; xchr [34 ]= '"' ; xchr [35 ]= '#' ; xchr [36 ]= '$' ; xchr [37 ]= '%' ; xchr [38 ]= '&' ; xchr [39 ]= '\'' ; xchr [40 ]= '(' ; xchr [41 ]= ')' ; xchr [42 ]= '*' ; xchr [43 ]= '+' ; xchr [44 ]= ',' ; xchr [45 ]= '-' ; xchr [46 ]= '.' ; xchr [47 ]= '/' ; 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 [58 ]= ':' ; xchr [59 ]= ';' ; xchr [60 ]= '<' ; xchr [61 ]= '=' ; xchr [62 ]= '>' ; xchr [63 ]= '?' ; xchr [64 ]= '@' ; 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 [91 ]= '[' ; xchr [92 ]= '\\' ; xchr [93 ]= ']' ; xchr [94 ]= '^' ; xchr [95 ]= '_' ; xchr [96 ]= '`' ; 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' ; xchr [123 ]= '{' ; xchr [124 ]= '|' ; xchr [125 ]= '}' ; xchr [126 ]= '~' ; {register integer for_end; i = 127 ;for_end = 255 ; if ( i <= for_end) do xchr [i ]= '?' ; while ( i++ < for_end ) ;} {register integer for_end; i = 0 ;for_end = 127 ; if ( i <= for_end) do xord [chr ( i ) ]= 32 ; while ( i++ < for_end ) ;} {register integer for_end; i = 32 ;for_end = 126 ; if ( i <= for_end) do xord [xchr [i ]]= i ; while ( i++ < for_end ) ;} pkopen = false ; {register integer for_end; i = 0 ;for_end = 255 ; if ( i <= for_end) do status [i ]= 0 ; while ( i++ < for_end ) ;} power [0 ]= 1 ; {register integer for_end; i = 1 ;for_end = 8 ; if ( i <= for_end) do power [i ]= power [i - 1 ]+ power [i - 1 ]; while ( i++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES opengffile ( void ) #else opengffile ( ) #endif { gffile = kpseopenfile ( gfname , kpsegfformat ) ; gfloc = 0 ; } void #ifdef HAVE_PROTOTYPES openpkfile ( void ) #else openpkfile ( ) #endif { rewritebin ( pkfile , pkname ) ; pkloc = 0 ; pkopen = true ; } integer #ifdef HAVE_PROTOTYPES gfbyte ( void ) #else gfbyte ( ) #endif { register integer Result; eightbits b ; if ( eof ( gffile ) ) { fprintf( stderr , "%s%s%c\n", "Bad GF file: " , "Unexpected end of file!" , '!' ) ; uexit ( 1 ) ; } else { read ( gffile , b ) ; Result = b ; } gfloc = gfloc + 1 ; return Result ; } integer #ifdef HAVE_PROTOTYPES gfsignedquad ( void ) #else gfsignedquad ( ) #endif { register integer Result; eightbits a, b, c, d ; read ( gffile , a ) ; read ( gffile , b ) ; read ( gffile , c ) ; read ( gffile , d ) ; if ( a < 128 ) Result = ( ( a * 256 + b ) * 256 + c ) * 256 + d ; else Result = ( ( ( a - 256 ) * 256 + b ) * 256 + c ) * 256 + d ; gfloc = gfloc + 4 ; return Result ; } void #ifdef HAVE_PROTOTYPES zpkhalfword ( integer a ) #else zpkhalfword ( a ) integer a ; #endif { if ( a < 0 ) a = a + 65536L ; putbyte ( a / 256 , pkfile ) ; putbyte ( a % 256 , pkfile ) ; pkloc = pkloc + 2 ; } void #ifdef HAVE_PROTOTYPES zpkthreebytes ( integer a ) #else zpkthreebytes ( a ) integer a ; #endif { putbyte ( a / 65536L % 256 , pkfile ) ; putbyte ( a / 256 % 256 , pkfile ) ; putbyte ( a % 256 , pkfile ) ; pkloc = pkloc + 3 ; } void #ifdef HAVE_PROTOTYPES zpkword ( integer a ) #else zpkword ( a ) integer a ; #endif { integer b ; if ( a < 0 ) { a = a + 1073741824L ; a = a + 1073741824L ; b = 128 + a / 16777216L ; } else b = a / 16777216L ; putbyte ( b , pkfile ) ; putbyte ( a / 65536L % 256 , pkfile ) ; putbyte ( a / 256 % 256 , pkfile ) ; putbyte ( a % 256 , pkfile ) ; pkloc = pkloc + 4 ; } void #ifdef HAVE_PROTOTYPES zpknyb ( integer a ) #else zpknyb ( a ) integer a ; #endif { if ( bitweight == 16 ) { outputbyte = a * 16 ; bitweight = 1 ; } else { { putbyte ( outputbyte + a , pkfile ) ; pkloc = pkloc + 1 ; } bitweight = 16 ; } } integer #ifdef HAVE_PROTOTYPES gflength ( void ) #else gflength ( ) #endif { register integer Result; xfseek ( gffile , 0 , 2 , "gftopk" ) ; Result = xftell ( gffile , "gftopk" ) ; return Result ; } void #ifdef HAVE_PROTOTYPES zmovetobyte ( integer n ) #else zmovetobyte ( n ) integer n ; #endif { xfseek ( gffile , n , 0 , "gftopk" ) ; } void #ifdef HAVE_PROTOTYPES packandsendcharacter ( void ) #else packandsendcharacter ( ) #endif { integer i, j, k ; integer extra ; integer putptr ; integer repeatflag ; integer hbit ; integer buff ; integer dynf ; integer height, width ; integer xoffset, yoffset ; integer deriv[14] ; integer bcompsize ; boolean firston ; integer flagbyte ; boolean state ; boolean on ; integer compsize ; integer count ; integer pbit ; boolean ron, son ; integer rcount, scount ; integer ri, si ; integer max2 ; i = 2 ; rowptr = rowptr - 1 ; while ( row [i ]== ( -99999L ) ) i = i + 1 ; if ( row [i ]!= ( -99998L ) ) { maxn = maxn - i + 2 ; while ( row [rowptr - 2 ]== ( -99999L ) ) { rowptr = rowptr - 1 ; row [rowptr ]= ( -99998L ) ; } minn = maxn + 1 ; extra = maxm - minm + 1 ; maxm = 0 ; j = i ; while ( row [j ]!= ( -99998L ) ) { minn = minn - 1 ; if ( row [j ]!= ( -99999L ) ) { k = row [j ]; if ( k < extra ) extra = k ; j = j + 1 ; while ( row [j ]!= ( -99999L ) ) { k = k + row [j ]; j = j + 1 ; } if ( maxm < k ) maxm = k ; } j = j + 1 ; } minm = minm + extra ; maxm = minm + maxm - 1 - extra ; height = maxn - minn + 1 ; width = maxm - minm + 1 ; xoffset = - (integer) minm ; yoffset = maxn ; } else { height = 0 ; width = 0 ; xoffset = 0 ; yoffset = 0 ; } putptr = 0 ; rowptr = 2 ; repeatflag = 0 ; state = true ; buff = 0 ; while ( row [rowptr ]== ( -99999L ) ) rowptr = rowptr + 1 ; while ( row [rowptr ]!= ( -99998L ) ) { i = rowptr ; if ( ( row [i ]!= ( -99999L ) ) && ( ( row [i ]!= extra ) || ( row [i + 1 ]!= width ) ) ) { j = i + 1 ; while ( row [j - 1 ]!= ( -99999L ) ) j = j + 1 ; while ( row [i ]== row [j ]) { if ( row [i ]== ( -99999L ) ) { repeatflag = repeatflag + 1 ; rowptr = i + 1 ; } i = i + 1 ; j = j + 1 ; } } if ( row [rowptr ]!= ( -99999L ) ) row [rowptr ]= row [rowptr ]- extra ; hbit = 0 ; while ( row [rowptr ]!= ( -99999L ) ) { hbit = hbit + row [rowptr ]; if ( state ) { buff = buff + row [rowptr ]; state = false ; } else if ( row [rowptr ]> 0 ) { { row [putptr ]= buff ; putptr = putptr + 1 ; if ( repeatflag > 0 ) { row [putptr ]= - (integer) repeatflag ; repeatflag = 0 ; putptr = putptr + 1 ; } } buff = row [rowptr ]; } else state = true ; rowptr = rowptr + 1 ; } if ( hbit < width ) if ( state ) buff = buff + width - hbit ; else { { row [putptr ]= buff ; putptr = putptr + 1 ; if ( repeatflag > 0 ) { row [putptr ]= - (integer) repeatflag ; repeatflag = 0 ; putptr = putptr + 1 ; } } buff = width - hbit ; state = true ; } else state = false ; rowptr = rowptr + 1 ; } if ( buff > 0 ) { row [putptr ]= buff ; putptr = putptr + 1 ; if ( repeatflag > 0 ) { row [putptr ]= - (integer) repeatflag ; repeatflag = 0 ; putptr = putptr + 1 ; } } { row [putptr ]= ( -99998L ) ; putptr = putptr + 1 ; if ( repeatflag > 0 ) { row [putptr ]= - (integer) repeatflag ; repeatflag = 0 ; putptr = putptr + 1 ; } } {register integer for_end; i = 1 ;for_end = 13 ; if ( i <= for_end) do deriv [i ]= 0 ; while ( i++ < for_end ) ;} i = 0 ; firston = row [i ]== 0 ; if ( firston ) i = i + 1 ; compsize = 0 ; while ( row [i ]!= ( -99998L ) ) { j = row [i ]; if ( j == -1 ) compsize = compsize + 1 ; else { if ( j < 0 ) { compsize = compsize + 1 ; j = - (integer) j ; } if ( j < 209 ) compsize = compsize + 2 ; else { k = j - 193 ; while ( k >= 16 ) { k = k / 16 ; compsize = compsize + 2 ; } compsize = compsize + 1 ; } if ( j < 14 ) deriv [j ]= deriv [j ]- 1 ; else if ( j < 209 ) deriv [( 223 - j ) / 15 ]= deriv [( 223 - j ) / 15 ]+ 1 ; else { k = 16 ; while ( ( k * 16 < j + 3 ) ) k = k * 16 ; if ( j - k <= 192 ) deriv [( 207 - j + k ) / 15 ]= deriv [( 207 - j + k ) / 15 ]+ 2 ; } } i = i + 1 ; } bcompsize = compsize ; dynf = 0 ; {register integer for_end; i = 1 ;for_end = 13 ; if ( i <= for_end) do { compsize = compsize + deriv [i ]; if ( compsize <= bcompsize ) { bcompsize = compsize ; dynf = i ; } } while ( i++ < for_end ) ;} compsize = ( bcompsize + 1 ) / 2 ; if ( ( compsize > ( height * width + 7 ) / 8 ) || ( height * width == 0 ) ) { compsize = ( height * width + 7 ) / 8 ; dynf = 14 ; } flagbyte = dynf * 16 ; if ( firston ) flagbyte = flagbyte + 8 ; if ( ( gfch != gfchmod256 ) || ( tfmwidth [gfchmod256 ]> 16777215L ) || ( tfmwidth [gfchmod256 ]< 0 ) || ( dy [gfchmod256 ]!= 0 ) || ( dx [ gfchmod256 ]< 0 ) || ( dx [gfchmod256 ]% 65536L != 0 ) || ( compsize > 196594L ) || ( width > 65535L ) || ( height > 65535L ) || ( xoffset > 32767 ) || ( yoffset > 32767 ) || ( xoffset < -32768L ) || ( yoffset < -32768L ) ) { flagbyte = flagbyte + 7 ; { putbyte ( flagbyte , pkfile ) ; pkloc = pkloc + 1 ; } compsize = compsize + 28 ; pkword ( compsize ) ; pkword ( gfch ) ; predpkloc = pkloc + compsize ; pkword ( tfmwidth [gfchmod256 ]) ; pkword ( dx [gfchmod256 ]) ; pkword ( dy [gfchmod256 ]) ; pkword ( width ) ; pkword ( height ) ; pkword ( xoffset ) ; pkword ( yoffset ) ; } else if ( ( dx [gfch ]> 16777215L ) || ( width > 255 ) || ( height > 255 ) || ( xoffset > 127 ) || ( yoffset > 127 ) || ( xoffset < -128 ) || ( yoffset < -128 ) || ( compsize > 1015 ) ) { compsize = compsize + 13 ; flagbyte = flagbyte + compsize / 65536L + 4 ; { putbyte ( flagbyte , pkfile ) ; pkloc = pkloc + 1 ; } pkhalfword ( compsize % 65536L ) ; { putbyte ( gfch , pkfile ) ; pkloc = pkloc + 1 ; } predpkloc = pkloc + compsize ; pkthreebytes ( tfmwidth [gfchmod256 ]) ; pkhalfword ( dx [gfchmod256 ]/ 65536L ) ; pkhalfword ( width ) ; pkhalfword ( height ) ; pkhalfword ( xoffset ) ; pkhalfword ( yoffset ) ; } else { compsize = compsize + 8 ; flagbyte = flagbyte + compsize / 256 ; { putbyte ( flagbyte , pkfile ) ; pkloc = pkloc + 1 ; } { putbyte ( compsize % 256 , pkfile ) ; pkloc = pkloc + 1 ; } { putbyte ( gfch , pkfile ) ; pkloc = pkloc + 1 ; } predpkloc = pkloc + compsize ; pkthreebytes ( tfmwidth [gfchmod256 ]) ; { putbyte ( dx [gfchmod256 ]/ 65536L , pkfile ) ; pkloc = pkloc + 1 ; } { putbyte ( width , pkfile ) ; pkloc = pkloc + 1 ; } { putbyte ( height , pkfile ) ; pkloc = pkloc + 1 ; } { putbyte ( xoffset , pkfile ) ; pkloc = pkloc + 1 ; } { putbyte ( yoffset , pkfile ) ; pkloc = pkloc + 1 ; } } if ( dynf != 14 ) { bitweight = 16 ; max2 = 208 - 15 * dynf ; i = 0 ; if ( row [i ]== 0 ) i = i + 1 ; while ( row [i ]!= ( -99998L ) ) { j = row [i ]; if ( j == -1 ) pknyb ( 15 ) ; else { if ( j < 0 ) { pknyb ( 14 ) ; j = - (integer) j ; } if ( j <= dynf ) pknyb ( j ) ; else if ( j <= max2 ) { j = j - dynf - 1 ; pknyb ( j / 16 + dynf + 1 ) ; pknyb ( j % 16 ) ; } else { j = j - max2 + 15 ; k = 16 ; while ( k <= j ) { k = k * 16 ; pknyb ( 0 ) ; } while ( k > 1 ) { k = k / 16 ; pknyb ( j / k ) ; j = j % k ; } } } i = i + 1 ; } if ( bitweight != 16 ) { putbyte ( outputbyte , pkfile ) ; pkloc = pkloc + 1 ; } } else if ( height > 0 ) { buff = 0 ; pbit = 8 ; i = 1 ; hbit = width ; on = false ; state = false ; count = row [0 ]; repeatflag = 0 ; while ( ( row [i ]!= ( -99998L ) ) || state || ( count > 0 ) ) { if ( state ) { count = rcount ; i = ri ; on = ron ; repeatflag = repeatflag - 1 ; } else { rcount = count ; ri = i ; ron = on ; } do { if ( count == 0 ) { if ( row [i ]< 0 ) { if ( ! state ) repeatflag = - (integer) row [i ]; i = i + 1 ; } count = row [i ]; i = i + 1 ; on = ! on ; } if ( ( count >= pbit ) && ( pbit < hbit ) ) { if ( on ) buff = buff + power [pbit ]- 1 ; { putbyte ( buff , pkfile ) ; pkloc = pkloc + 1 ; } buff = 0 ; hbit = hbit - pbit ; count = count - pbit ; pbit = 8 ; } else if ( ( count < pbit ) && ( count < hbit ) ) { if ( on ) buff = buff + power [pbit ]- power [pbit - count ]; pbit = pbit - count ; hbit = hbit - count ; count = 0 ; } else { if ( on ) buff = buff + power [pbit ]- power [pbit - hbit ]; count = count - hbit ; pbit = pbit - hbit ; hbit = width ; if ( pbit == 0 ) { { putbyte ( buff , pkfile ) ; pkloc = pkloc + 1 ; } buff = 0 ; pbit = 8 ; } } } while ( ! ( hbit == width ) ) ; if ( state && ( repeatflag == 0 ) ) { count = scount ; i = si ; on = son ; state = false ; } else if ( ! state && ( repeatflag > 0 ) ) { scount = count ; si = i ; son = on ; state = true ; } } if ( pbit != 8 ) { putbyte ( buff , pkfile ) ; pkloc = pkloc + 1 ; } } } void #ifdef HAVE_PROTOTYPES convertgffile ( void ) #else convertgffile ( ) #endif { integer i, j, k ; integer gfcom ; boolean dotherows ; boolean on ; boolean state ; integer extra ; boolean bad ; integer hppp, vppp ; integer q ; integer postloc ; opengffile () ; if ( gfbyte () != 247 ) { fprintf( stderr , "%s%s%c\n", "Bad GF file: " , "First byte is not preamble" , '!' ) ; uexit ( 1 ) ; } if ( gfbyte () != 131 ) { fprintf( stderr , "%s%s%c\n", "Bad GF file: " , "Identification byte is incorrect" , '!' ) ; uexit ( 1 ) ; } gflen = gflength () ; postloc = gflen - 4 ; do { if ( postloc == 0 ) { fprintf( stderr , "%s%s%c\n", "Bad GF file: " , "all 223's" , '!' ) ; uexit ( 1 ) ; } movetobyte ( postloc ) ; k = gfbyte () ; postloc = postloc - 1 ; } while ( ! ( k != 223 ) ) ; if ( k != 131 ) { fprintf( stderr , "%s%s%ld%c\n", "Bad GF file: " , "ID byte is " , (long)k , '!' ) ; uexit ( 1 ) ; } movetobyte ( postloc - 3 ) ; q = gfsignedquad () ; if ( ( q < 0 ) || ( q > postloc - 3 ) ) { fprintf( stderr , "%s%s%ld%c\n", "Bad GF file: " , "post pointer is " , (long)q , '!' ) ; uexit ( 1 ) ; } movetobyte ( q ) ; k = gfbyte () ; if ( k != 248 ) { fprintf( stderr , "%s%s%ld%s%c\n", "Bad GF file: " , "byte at " , (long)q , " is not post" , '!' ) ; uexit ( 1 ) ; } i = gfsignedquad () ; designsize = gfsignedquad () ; checksum = gfsignedquad () ; hppp = gfsignedquad () ; hmag = round ( hppp * 72.27 / ((double) 65536L ) ) ; vppp = gfsignedquad () ; if ( hppp != vppp ) if ( verbose ) fprintf( stdout , "%s\n", "Odd aspect ratio!" ) ; i = gfsignedquad () ; i = gfsignedquad () ; i = gfsignedquad () ; i = gfsignedquad () ; do { gfcom = gfbyte () ; switch ( gfcom ) {case 245 : case 246 : { gfch = gfbyte () ; if ( status [gfch ]!= 0 ) { fprintf( stderr , "%s%s%c\n", "Bad GF file: " , "Locator for this character already found." , '!' ) ; uexit ( 1 ) ; } if ( gfcom == 245 ) { dx [gfch ]= gfsignedquad () ; dy [gfch ]= gfsignedquad () ; } else { dx [gfch ]= gfbyte () * 65536L ; dy [gfch ]= 0 ; } tfmwidth [gfch ]= gfsignedquad () ; i = gfsignedquad () ; status [gfch ]= 1 ; } break ; case 239 : case 240 : case 241 : case 242 : { { putbyte ( gfcom + 1 , pkfile ) ; pkloc = pkloc + 1 ; } i = 0 ; {register integer for_end; j = 0 ;for_end = gfcom - 239 ; if ( j <= for_end) do { k = gfbyte () ; { putbyte ( k , pkfile ) ; pkloc = pkloc + 1 ; } i = i * 256 + k ; } while ( j++ < for_end ) ;} {register integer for_end; j = 1 ;for_end = i ; if ( j <= for_end) do { putbyte ( gfbyte () , pkfile ) ; pkloc = pkloc + 1 ; } while ( j++ < for_end ) ;} } break ; case 243 : { { putbyte ( 244 , pkfile ) ; pkloc = pkloc + 1 ; } pkword ( gfsignedquad () ) ; } break ; case 244 : ; break ; case 249 : ; break ; default: { fprintf( stderr , "%s%s%ld%s%c\n", "Bad GF file: " , "Unexpected " , (long)gfcom , " in postamble" , '!' ) ; uexit ( 1 ) ; } break ; } } while ( ! ( gfcom == 249 ) ) ; movetobyte ( 2 ) ; openpkfile () ; { putbyte ( 247 , pkfile ) ; pkloc = pkloc + 1 ; } { putbyte ( 89 , pkfile ) ; pkloc = pkloc + 1 ; } i = gfbyte () ; do { if ( i == 0 ) j = 46 ; else j = gfbyte () ; i = i - 1 ; } while ( ! ( j != 32 ) ) ; i = i + 1 ; if ( i == 0 ) k = -0 ; else k = i + 0 ; if ( k > 255 ) { putbyte ( 255 , pkfile ) ; pkloc = pkloc + 1 ; } else { putbyte ( k , pkfile ) ; pkloc = pkloc + 1 ; } {register integer for_end; k = 1 ;for_end = 0 ; if ( k <= for_end) do if ( ( i > 0 ) || ( k <= -0 ) ) { putbyte ( xord [comment [k ]], pkfile ) ; pkloc = pkloc + 1 ; } while ( k++ < for_end ) ;} if ( verbose ) putc ( '\'' , stdout ); {register integer for_end; k = 1 ;for_end = i ; if ( k <= for_end) do { if ( k > 1 ) j = gfbyte () ; if ( verbose ) putc ( xchr [j ], stdout ); if ( k < 256 ) { putbyte ( j , pkfile ) ; pkloc = pkloc + 1 ; } } while ( k++ < for_end ) ;} if ( verbose ) fprintf( stdout , "%c\n", '\'' ) ; pkword ( designsize ) ; pkword ( checksum ) ; pkword ( hppp ) ; pkword ( vppp ) ; do { gfcom = gfbyte () ; dotherows = false ; switch ( gfcom ) {case 67 : case 68 : { if ( gfcom == 67 ) { gfch = gfsignedquad () ; i = gfsignedquad () ; minm = gfsignedquad () ; maxm = gfsignedquad () ; minn = gfsignedquad () ; maxn = gfsignedquad () ; } else { gfch = gfbyte () ; i = gfbyte () ; maxm = gfbyte () ; minm = maxm - i ; i = gfbyte () ; maxn = gfbyte () ; minn = maxn - i ; } if ( gfch >= 0 ) gfchmod256 = gfch % 256 ; else gfchmod256 = 255 - ( ( - (integer) ( 1 + gfch ) ) % 256 ) ; if ( status [gfchmod256 ]== 0 ) { fprintf( stderr , "%s%s%ld%c\n", "Bad GF file: " , "no character locator for character " , (long)gfch , '!' ) ; uexit ( 1 ) ; } { bad = false ; rowptr = 2 ; on = false ; extra = 0 ; state = true ; do { gfcom = gfbyte () ; switch ( gfcom ) {case 0 : { state = ! state ; on = ! on ; } break ; case 1 : case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : case 8 : case 9 : case 10 : case 11 : case 12 : case 13 : case 14 : case 15 : case 16 : case 17 : case 18 : case 19 : case 20 : case 21 : case 22 : case 23 : case 24 : case 25 : case 26 : case 27 : case 28 : case 29 : case 30 : case 31 : case 32 : case 33 : case 34 : case 35 : case 36 : case 37 : case 38 : case 39 : case 40 : case 41 : case 42 : case 43 : case 44 : case 45 : case 46 : case 47 : case 48 : case 49 : case 50 : case 51 : case 52 : case 53 : case 54 : case 55 : case 56 : case 57 : case 58 : case 59 : case 60 : case 61 : case 62 : case 63 : case 64 : case 65 : case 66 : { if ( gfcom < 64 ) i = gfcom - 0 ; else { i = 0 ; {register integer for_end; j = 0 ;for_end = gfcom - 64 ; if ( j <= for_end) do i = i * 256 + gfbyte () ; while ( j++ < for_end ) ;} } if ( state ) { extra = extra + i ; state = false ; } else { { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= extra ; rowptr = rowptr + 1 ; } } extra = i ; } on = ! on ; } break ; case 70 : case 71 : case 72 : case 73 : { i = 0 ; {register integer for_end; j = 1 ;for_end = gfcom - 70 ; if ( j <= for_end) do i = i * 256 + gfbyte () ; while ( j++ < for_end ) ;} if ( on == state ) { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= extra ; rowptr = rowptr + 1 ; } } {register integer for_end; j = 0 ;for_end = i ; if ( j <= for_end) do { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= ( -99999L ) ; rowptr = rowptr + 1 ; } } while ( j++ < for_end ) ;} on = false ; extra = 0 ; state = true ; } break ; case 74 : case 75 : case 76 : case 77 : case 78 : case 79 : case 80 : case 81 : case 82 : case 83 : case 84 : case 85 : case 86 : case 87 : case 88 : case 89 : case 90 : case 91 : case 92 : case 93 : case 94 : case 95 : case 96 : case 97 : case 98 : case 99 : case 100 : case 101 : case 102 : case 103 : case 104 : case 105 : case 106 : case 107 : case 108 : case 109 : case 110 : case 111 : case 112 : case 113 : case 114 : case 115 : case 116 : case 117 : case 118 : case 119 : case 120 : case 121 : case 122 : case 123 : case 124 : case 125 : case 126 : case 127 : case 128 : case 129 : case 130 : case 131 : case 132 : case 133 : case 134 : case 135 : case 136 : case 137 : dotherows = true ; break ; case 138 : case 139 : case 140 : case 141 : case 142 : case 143 : case 144 : case 145 : case 146 : case 147 : case 148 : case 149 : case 150 : case 151 : case 152 : case 153 : case 154 : case 155 : case 156 : case 157 : case 158 : case 159 : case 160 : case 161 : case 162 : case 163 : case 164 : case 165 : case 166 : case 167 : case 168 : case 169 : case 170 : case 171 : case 172 : case 173 : case 174 : case 175 : case 176 : case 177 : case 178 : case 179 : case 180 : case 181 : case 182 : case 183 : case 184 : case 185 : case 186 : case 187 : case 188 : case 189 : case 190 : case 191 : case 192 : case 193 : case 194 : case 195 : case 196 : case 197 : case 198 : case 199 : case 200 : case 201 : dotherows = true ; break ; case 202 : case 203 : case 204 : case 205 : case 206 : case 207 : case 208 : case 209 : case 210 : case 211 : case 212 : case 213 : case 214 : case 215 : case 216 : case 217 : case 218 : case 219 : case 220 : case 221 : case 222 : case 223 : case 224 : case 225 : case 226 : case 227 : case 228 : case 229 : case 230 : case 231 : case 232 : case 233 : case 234 : case 235 : case 236 : case 237 : case 238 : dotherows = true ; break ; case 239 : case 240 : case 241 : case 242 : { { putbyte ( gfcom + 1 , pkfile ) ; pkloc = pkloc + 1 ; } i = 0 ; {register integer for_end; j = 0 ;for_end = gfcom - 239 ; if ( j <= for_end) do { k = gfbyte () ; { putbyte ( k , pkfile ) ; pkloc = pkloc + 1 ; } i = i * 256 + k ; } while ( j++ < for_end ) ;} {register integer for_end; j = 1 ;for_end = i ; if ( j <= for_end) do { putbyte ( gfbyte () , pkfile ) ; pkloc = pkloc + 1 ; } while ( j++ < for_end ) ;} } break ; case 243 : { { putbyte ( 244 , pkfile ) ; pkloc = pkloc + 1 ; } pkword ( gfsignedquad () ) ; } break ; case 244 : ; break ; case 69 : { if ( on == state ) { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= extra ; rowptr = rowptr + 1 ; } } if ( ( rowptr > 2 ) && ( row [rowptr - 1 ]!= ( -99999L ) ) ) { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= ( -99999L ) ; rowptr = rowptr + 1 ; } } { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= ( -99998L ) ; rowptr = rowptr + 1 ; } } if ( bad ) { fprintf( stderr , "%s\n", "Ran out of internal memory for row counts!" ) ; uexit ( 1 ) ; } packandsendcharacter () ; status [gfchmod256 ]= 2 ; if ( pkloc != predpkloc ) { fprintf( stderr , "%s\n", "Internal error while writing character!" ) ; uexit ( 1 ) ; } } break ; default: { fprintf( stderr , "%s%s%ld%s%c\n", "Bad GF file: " , "Unexpected " , (long)gfcom , " character in character definition" , '!' ) ; uexit ( 1 ) ; } break ; } if ( dotherows ) { dotherows = false ; if ( on == state ) { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= extra ; rowptr = rowptr + 1 ; } } { if ( rowptr > maxrow ) bad = true ; else { row [rowptr ]= ( -99999L ) ; rowptr = rowptr + 1 ; } } on = true ; extra = gfcom - 74 ; state = false ; } } while ( ! ( gfcom == 69 ) ) ; } } break ; case 239 : case 240 : case 241 : case 242 : { { putbyte ( gfcom + 1 , pkfile ) ; pkloc = pkloc + 1 ; } i = 0 ; {register integer for_end; j = 0 ;for_end = gfcom - 239 ; if ( j <= for_end) do { k = gfbyte () ; { putbyte ( k , pkfile ) ; pkloc = pkloc + 1 ; } i = i * 256 + k ; } while ( j++ < for_end ) ;} {register integer for_end; j = 1 ;for_end = i ; if ( j <= for_end) do { putbyte ( gfbyte () , pkfile ) ; pkloc = pkloc + 1 ; } while ( j++ < for_end ) ;} } break ; case 243 : { { putbyte ( 244 , pkfile ) ; pkloc = pkloc + 1 ; } pkword ( gfsignedquad () ) ; } break ; case 244 : ; break ; case 248 : ; break ; default: { fprintf( stderr , "%s%s%ld%s%c\n", "Bad GF file: " , "Unexpected " , (long)gfcom , " command between characters" , '!' ) ; uexit ( 1 ) ; } break ; } } while ( ! ( gfcom == 248 ) ) ; { putbyte ( 245 , pkfile ) ; pkloc = pkloc + 1 ; } while ( ( pkloc % 4 != 0 ) ) { putbyte ( 246 , pkfile ) ; pkloc = pkloc + 1 ; } } void mainbody() { initialize () ; convertgffile () ; {register integer for_end; i = 0 ;for_end = 255 ; if ( i <= for_end) do if ( status [i ]== 1 ) if ( verbose ) fprintf( stdout , "%s%ld%s\n", "Character " , (long)i , " missing raster information!" ) ; while ( i++ < for_end ) ;} if ( verbose ) fprintf( stdout , "%ld%s%ld%s\n", (long)gflen , " bytes packed to " , (long)pkloc , " bytes." ) ; }