diff options
Diffstat (limited to 'Build/source/texk/web2c/pdftexdir/pkin.c')
-rw-r--r-- | Build/source/texk/web2c/pdftexdir/pkin.c | 580 |
1 files changed, 296 insertions, 284 deletions
diff --git a/Build/source/texk/web2c/pdftexdir/pkin.c b/Build/source/texk/web2c/pdftexdir/pkin.c index 3bece2124ad..7d7c863b7a4 100644 --- a/Build/source/texk/web2c/pdftexdir/pkin.c +++ b/Build/source/texk/web2c/pdftexdir/pkin.c @@ -26,10 +26,10 @@ $Id: //depot/Build/source.development/TeX/texk/web2c/pdftexdir/pkin.c#4 $ * DESCRIPTION * This implementation of readchar() uses parts of the program dvips * written by Tomas Rokicki--the inventor of the pkformat--(loadfont.c, - * download.c and unpack.c). Dvips in turn is derived from pktype. - * Pktype(TeX) is described in debt in ``The PKtype processor'', + * download.c and unpack.c). Dvips in turn is derived from pktype. + * Pktype(TeX) is described in debt in ``The PKtype processor'', * which is available as pktype.weave as part of the METAFONTware. - * What was needed to implement readchar() is rearranged in pkfile.c to + * What was needed to implement readchar() is rearranged in pkfile.c to * get more modularity in the style of MODULA2. * BUGFIXES * May 1997: Eric Delaunay <delaunay@lix.polytechnique.fr> reports a @@ -60,47 +60,47 @@ extern FILE *t3_file; static shalfword pkbyte(void) { - register shalfword i ; + register shalfword i; - if ((i=xgetc(pkfile))==EOF) - pdftex_fail("unexpected eof in pk file") ; - return(i) ; + if ((i = xgetc(pkfile)) == EOF) + pdftex_fail("unexpected eof in pk file"); + return (i); } static integer pkduo(void) { - register integer i ; + register integer i; - i = pkbyte() ; + i = pkbyte(); if (i > 127) - i -= 256 ; - i = i * 256 + pkbyte() ; - return(i) ; + i -= 256; + i = i * 256 + pkbyte(); + return (i); } static integer pktrio(void) { - register integer i ; - - i = pkbyte() ; - if (i > 127) - i -= 256 ; - i = i * 256 + pkbyte() ; - i = i * 256 + pkbyte() ; - return(i) ; + register integer i; + + i = pkbyte(); + if (i > 127) + i -= 256; + i = i * 256 + pkbyte(); + i = i * 256 + pkbyte(); + return (i); } static integer pkquad(void) { - register integer i ; - - i = pkbyte() ; - if (i > 127) - i -= 256 ; - i = i * 256 + pkbyte() ; - i = i * 256 + pkbyte() ; - i = i * 256 + pkbyte() ; - return(i) ; + register integer i; + + i = pkbyte(); + if (i > 127) + i -= 256; + i = i * 256 + pkbyte(); + i = i * 256 + pkbyte(); + i = i * 256 + pkbyte(); + return (i); } /* @@ -112,106 +112,111 @@ static integer pkquad(void) * packed data structure. */ -static halfword inputbyte, flagbyte ; -static halfword bitweight ; -static halfword dynf ; -static halfword repeatcount ; +static halfword inputbyte, flagbyte; +static halfword bitweight; +static halfword dynf; +static halfword repeatcount; static shalfword getnyb(void) -{ halfword temp; - if ( bitweight == 0 ) - { bitweight = 16 ; - inputbyte = pkbyte(); - temp = inputbyte >> 4 ; +{ + halfword temp; + if (bitweight == 0) { + bitweight = 16; + inputbyte = pkbyte(); + temp = inputbyte >> 4; } else { - bitweight = 0 ; - temp = inputbyte & 15 ; + bitweight = 0; + temp = inputbyte & 15; } - return(temp); -} + return (temp); +} static boolean getbit(void) { - bitweight >>= 1 ; - if ( bitweight == 0 ) - { inputbyte = pkbyte(); - bitweight = 128 ; - } - return(inputbyte & bitweight) ; + bitweight >>= 1; + if (bitweight == 0) { + inputbyte = pkbyte(); + bitweight = 128; + } + return (inputbyte & bitweight); } -static halfword (*realfunc)(void) ; -long pk_remainder ; -static halfword handlehuge(halfword i, halfword k); - -static halfword pkpackednum(void) { -register halfword i, j ; - i = getnyb () ; - if ( i == 0 ) - { do { j = getnyb () ; - i++ ; - } while ( ! ( j != 0 ) ) ; - if ( i > 3 ) { +static halfword(*realfunc) (void); +long pk_remainder; +static halfword handlehuge(halfword i, halfword k); + +static halfword pkpackednum(void) +{ + register halfword i, j; + i = getnyb(); + if (i == 0) { + do { + j = getnyb(); + i++; + } while (!(j != 0)); + if (i > 3) { /* * Damn, we got a huge count! We *fake* it by giving an artificially * large repeat count. */ - return(handlehuge(i, j)) ; - } else { - while ( i > 0 ) - { j = j * 16 + getnyb () ; - i-- ; - } - return ( j - 15 + ( 13 - dynf ) * 16 + dynf ) ; - } - } - else if ( i <= dynf ) return ( i ) ; - else if ( i < 14 ) return ( ( i - dynf - 1 ) * 16 + getnyb () + dynf + 1 - ) ; - else - { if ( i == 14 ) repeatcount = pkpackednum () ; - else repeatcount = 1 ; + return (handlehuge(i, j)); + } else { + while (i > 0) { + j = j * 16 + getnyb(); + i--; + } + return (j - 15 + (13 - dynf) * 16 + dynf); + } + } else if (i <= dynf) + return (i); + else if (i < 14) + return ((i - dynf - 1) * 16 + getnyb() + dynf + 1); + else { + if (i == 14) + repeatcount = pkpackednum(); + else + repeatcount = 1; #ifdef DEBUG - printf("[%d]", repeatcount); + printf("[%d]", (int) repeatcount); #endif - return ( (*realfunc)() ) ; - } - } + return ((*realfunc) ()); + } +} static halfword rest(void) { - halfword i ; - - if (pk_remainder < 0) { - pk_remainder = - pk_remainder ; - return ( 0 ) ; - } else if (pk_remainder > 0) { - if (pk_remainder > 4000) { - pk_remainder = 4000 - pk_remainder ; - return ( 4000 ) ; - } else { - i = pk_remainder ; - pk_remainder = 0 ; - realfunc = pkpackednum ; - return ( i ) ; - } - } else { - pdftex_fail("shouldn't happen") ; - return 0; /*NOTREACHED*/ - } + halfword i; + + if (pk_remainder < 0) { + pk_remainder = -pk_remainder; + return (0); + } else if (pk_remainder > 0) { + if (pk_remainder > 4000) { + pk_remainder = 4000 - pk_remainder; + return (4000); + } else { + i = pk_remainder; + pk_remainder = 0; + realfunc = pkpackednum; + return (i); + } + } else { + pdftex_fail("shouldn't happen"); + return 0; + /*NOTREACHED*/} } -static halfword handlehuge(halfword i, halfword k) +static halfword handlehuge(halfword i, halfword k) { - register long j = k ; - - while (i) { - j = (j << 4L) + getnyb() ; - i-- ; - } - pk_remainder = j - 15 + ( 13 - dynf ) * 16 + dynf ; - realfunc = rest ; - return ( rest() ) ; + register long j = k; + + while (i) { + j = (j << 4L) + getnyb(); + i--; + } + pk_remainder = j - 15 + (13 - dynf) * 16 + dynf; + realfunc = rest; + return (rest()); } /* @@ -219,102 +224,104 @@ static halfword handlehuge(halfword i, halfword k) */ static halfword gpower[17] = { 0, 1, 3, 7, 15, 31, 63, 127, - 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535 } ; - -static void unpack(chardesc *cd) -{ - register integer i, j ; - register halfword word, wordweight ; - halfword *raster; - shalfword rowsleft ; - boolean turnon ; - shalfword hbit ; - halfword count ; - shalfword wordwidth ; - - wordwidth = (cd->cwidth + 15) / 16 ; - i = 2 * cd->cheight * (long)wordwidth ; - if (i <= 0) - i = 2 ; - if (i > cd->rastersize) { + 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535 +}; + +static void unpack(chardesc * cd) +{ + register integer i, j; + register halfword word, wordweight; + halfword *raster; + shalfword rowsleft; + boolean turnon; + shalfword hbit; + halfword count; + shalfword wordwidth; + + wordwidth = (cd->cwidth + 15) / 16; + i = 2 * cd->cheight * (long) wordwidth; + if (i <= 0) + i = 2; + if (i > cd->rastersize) { xfree(cd->raster); cd->rastersize = i; cd->raster = xtalloc(cd->rastersize, halfword); - } - raster = cd->raster; - realfunc = pkpackednum ; - dynf = flagbyte / 16 ; - turnon = flagbyte & 8 ; - if ( dynf == 14 ) - { bitweight = 0 ; - for ( i = 1 ; i <= cd->cheight ; i ++ ) - { word = 0 ; - wordweight = 32768 ; - for ( j = 1 ; j <= cd->cwidth ; j ++ ) - { if ( getbit () ) word += wordweight ; - wordweight >>= 1 ; - if ( wordweight == 0 ) - { *raster++ = word ; - word = 0 ; - wordweight = 32768 ; - } - } - if ( wordweight != 32768 ) - *raster++ = word ; - } - } else { - rowsleft = cd->cheight ; - hbit = cd->cwidth ; - repeatcount = 0 ; - wordweight = 16 ; - word = 0 ; - bitweight = 0 ; - while ( rowsleft > 0 ) - { count = (*realfunc)() ; + } + raster = cd->raster; + realfunc = pkpackednum; + dynf = flagbyte / 16; + turnon = flagbyte & 8; + if (dynf == 14) { + bitweight = 0; + for (i = 1; i <= cd->cheight; i++) { + word = 0; + wordweight = 32768; + for (j = 1; j <= cd->cwidth; j++) { + if (getbit()) + word += wordweight; + wordweight >>= 1; + if (wordweight == 0) { + *raster++ = word; + word = 0; + wordweight = 32768; + } + } + if (wordweight != 32768) + *raster++ = word; + } + } else { + rowsleft = cd->cheight; + hbit = cd->cwidth; + repeatcount = 0; + wordweight = 16; + word = 0; + bitweight = 0; + while (rowsleft > 0) { + count = (*realfunc) (); #ifdef DEBUG - if (turnon) printf("(%d) ",count); - else printf("%d ",count); + if (turnon) + printf("(%d) ", (int) count); + else + printf("%d ", (int) count); #endif - while ( count != 0 ) - { if ( ( count < wordweight ) && ( count < hbit ) ) - { if ( turnon ) word += gpower [ wordweight ] - gpower - [ wordweight - count ] ; - hbit -= count ; - wordweight -= count ; - count = 0 ; - } - else if ( ( count >= hbit ) && ( hbit <= wordweight ) ) - { if ( turnon ) - word += gpower [ wordweight ] - gpower - [ wordweight - hbit ] ; - *raster++ = word ; - for ( i = 1 ; i <= repeatcount ; i ++ ) { - for ( j = 1 ; j <= wordwidth ; j ++ ) { - *raster = *(raster - wordwidth) ; - raster++ ; + while (count != 0) { + if ((count < wordweight) && (count < hbit)) { + if (turnon) + word += gpower[wordweight] - gpower[wordweight - count]; + hbit -= count; + wordweight -= count; + count = 0; + } else if ((count >= hbit) && (hbit <= wordweight)) { + if (turnon) + word += gpower[wordweight] - gpower[wordweight - hbit]; + *raster++ = word; + for (i = 1; i <= repeatcount; i++) { + for (j = 1; j <= wordwidth; j++) { + *raster = *(raster - wordwidth); + raster++; + } } - } - rowsleft -= repeatcount + 1 ; - repeatcount = 0 ; - word = 0 ; - wordweight = 16 ; - count -= hbit ; - hbit = cd->cwidth ; - } - else - { if ( turnon ) word += gpower [ wordweight ] ; - *raster++ = word ; - word = 0 ; - count -= wordweight ; - hbit -= wordweight ; - wordweight = 16 ; - } - } - turnon = ! turnon ; - } - if ( ( rowsleft != 0 ) || ( (integer)hbit != cd->cwidth ) ) - pdftex_fail("error while unpacking; more bits than required"); - } + rowsleft -= repeatcount + 1; + repeatcount = 0; + word = 0; + wordweight = 16; + count -= hbit; + hbit = cd->cwidth; + } else { + if (turnon) + word += gpower[wordweight]; + *raster++ = word; + word = 0; + count -= wordweight; + hbit -= wordweight; + wordweight = 16; + } + } + turnon = !turnon; + } + if ((rowsleft != 0) || ((integer) hbit != cd->cwidth)) + pdftex_fail("error while unpacking; more bits than required"); + } } /* @@ -330,98 +337,103 @@ static void unpack(chardesc *cd) * return EOF if no character definition is available */ -int readchar(boolean check_preamble, chardesc *cd) +int readchar(boolean check_preamble, chardesc * cd) { - register shalfword i ; - register integer k ; - register integer length=0 ; + register shalfword i; + register integer k; + register integer length = 0; /* * Check the preamble of the pkfile */ - if (check_preamble) { - if (pkbyte()!=247) - pdftex_fail("bad pk file, expected pre") ; - if (pkbyte()!=89) - pdftex_fail("bad version of pk file") ; - for(i=pkbyte(); i>0; i--) /* creator of pkfile */ - (void)pkbyte() ; - (void)pkquad(); /* design size */ - k = pkquad() ; /* checksum */ - k = pkquad() ; /* hppp */ - k = pkquad() ; /* vppp */ - } + if (check_preamble) { + if (pkbyte() != 247) + pdftex_fail("bad pk file, expected pre"); + if (pkbyte() != 89) + pdftex_fail("bad version of pk file"); + for (i = pkbyte(); i > 0; i--) /* creator of pkfile */ + (void) pkbyte(); + (void) pkquad(); /* design size */ + k = pkquad(); /* checksum */ + k = pkquad(); /* hppp */ + k = pkquad(); /* vppp */ + } /* * Now we skip to the desired character definition */ - while ((flagbyte=pkbyte())!=245) { - if (flagbyte < 240) { - switch (flagbyte & 7) { -case 0: case 1: case 2: case 3: - length = (flagbyte & 7) * 256 + pkbyte() - 3; - cd->charcode = pkbyte() ; - (void) pktrio() ; /* TFMwidth */ - cd->xescape = pkbyte() ; /* pixel width */ - cd->cwidth = pkbyte() ; - cd->cheight = pkbyte() ; - cd->xoff = pkbyte() ; - cd->yoff = pkbyte() ; - if (cd->xoff > 127) - cd->xoff -= 256 ; - if (cd->yoff > 127) - cd->yoff -= 256 ; - break ; -case 4: case 5: case 6: - length = (flagbyte & 3) * 65536L + pkbyte() * 256L ; - length = length + pkbyte() - 4L ; - cd->charcode = pkbyte() ; - (void) pktrio() ; /* TFMwidth */ - cd->xescape = pkduo() ; /* pixelwidth */ - cd->cwidth = pkduo() ; - cd->cheight = pkduo() ; - cd->xoff = pkduo() ; - cd->yoff = pkduo() ; - break ; -case 7: - length = pkquad() - 9L; - cd->charcode = pkquad(); - (void) pkquad() ; /* TFMwidth */ - cd->xescape = pkquad(); /* pixelwidth */ - k = pkquad() ; - cd->cwidth = pkquad(); - cd->cheight = pkquad(); - cd->xoff = pkquad(); - cd->yoff = pkquad(); - } - if (length <= 0) - pdftex_fail("packet length (%i) too small", (int)length) ; - unpack(cd); - return 1; - } else { - k = 0 ; - switch (flagbyte) { -case 243: - k = pkbyte() ; - if (k > 127) - k -= 256 ; -case 242: - k = k * 256 + pkbyte() ; -case 241: - k = k * 256 + pkbyte() ; -case 240: - k = k * 256 + pkbyte() ; - while (k-- > 0) - i = pkbyte() ; - break ; -case 244: - k = pkquad() ; - break ; -case 246: - break ; -default: - pdftex_fail("unexpected command (%i)", (int)flagbyte) ; - } - } - } - return 0; /* character not found */ + while ((flagbyte = pkbyte()) != 245) { + if (flagbyte < 240) { + switch (flagbyte & 7) { + case 0: + case 1: + case 2: + case 3: + length = (flagbyte & 7) * 256 + pkbyte() - 3; + cd->charcode = pkbyte(); + (void) pktrio(); /* TFMwidth */ + cd->xescape = pkbyte(); /* pixel width */ + cd->cwidth = pkbyte(); + cd->cheight = pkbyte(); + cd->xoff = pkbyte(); + cd->yoff = pkbyte(); + if (cd->xoff > 127) + cd->xoff -= 256; + if (cd->yoff > 127) + cd->yoff -= 256; + break; + case 4: + case 5: + case 6: + length = (flagbyte & 3) * 65536L + pkbyte() * 256L; + length = length + pkbyte() - 4L; + cd->charcode = pkbyte(); + (void) pktrio(); /* TFMwidth */ + cd->xescape = pkduo(); /* pixelwidth */ + cd->cwidth = pkduo(); + cd->cheight = pkduo(); + cd->xoff = pkduo(); + cd->yoff = pkduo(); + break; + case 7: + length = pkquad() - 9L; + cd->charcode = pkquad(); + (void) pkquad(); /* TFMwidth */ + cd->xescape = pkquad(); /* pixelwidth */ + k = pkquad(); + cd->cwidth = pkquad(); + cd->cheight = pkquad(); + cd->xoff = pkquad(); + cd->yoff = pkquad(); + } + if (length <= 0) + pdftex_fail("packet length (%i) too small", (int) length); + unpack(cd); + return 1; + } else { + k = 0; + switch (flagbyte) { + case 243: + k = pkbyte(); + if (k > 127) + k -= 256; + case 242: + k = k * 256 + pkbyte(); + case 241: + k = k * 256 + pkbyte(); + case 240: + k = k * 256 + pkbyte(); + while (k-- > 0) + i = pkbyte(); + break; + case 244: + k = pkquad(); + break; + case 246: + break; + default: + pdftex_fail("unexpected command (%i)", (int) flagbyte); + } + } + } + return 0; /* character not found */ } |