diff options
Diffstat (limited to 'converter/pbm')
-rw-r--r-- | converter/pbm/atktopbm.c | 34 | ||||
-rw-r--r-- | converter/pbm/escp2topbm.c | 18 | ||||
-rw-r--r-- | converter/pbm/g3topbm.c | 11 | ||||
-rw-r--r-- | converter/pbm/mgrtopbm.c | 30 | ||||
-rw-r--r-- | converter/pbm/pbmtoatk.c | 31 | ||||
-rw-r--r-- | converter/pbm/pbmtoescp2.c | 23 | ||||
-rw-r--r-- | converter/pbm/pbmtomgr.c | 14 | ||||
-rw-r--r-- | converter/pbm/ybmtopbm.c | 6 |
8 files changed, 91 insertions, 76 deletions
diff --git a/converter/pbm/atktopbm.c b/converter/pbm/atktopbm.c index 807e4f4a..57782d91 100644 --- a/converter/pbm/atktopbm.c +++ b/converter/pbm/atktopbm.c @@ -44,7 +44,7 @@ #define dataobject_OBJECTCREATIONFAILED 4 #define dataobject_BADFORMAT 5 -/* ReadRow(file, row, length) +/* ReadRow(file, row, length) ** Reads from 'file' the encoding of bytes to fill in 'row'. Row will be ** truncated or padded (with WHITE) to exactly 'length' bytes. ** @@ -52,7 +52,7 @@ ** '|' correct end of line ** '\0' if the length was satisfied (before a terminator) ** EOF if the file ended -** '\' '{' other recognized ends. +** '\' '{' other recognized ends. ** The '|' is the expected end and pads the row with WHITE. ** The '\' and '{' are error conditions and may indicate the ** beginning of some other portion of the data stream. @@ -76,11 +76,11 @@ ReadRow(FILE * const file, 'file' is where to get them from. 'row' is where to put bytes. 'length' is how many bytes in row must be filled. - + Return the delimiter that marks the end of the row, or EOF if EOF marks the end of the row, or NUL in some cases. -----------------------------------------------------------------------------*/ - /* Each input character is processed by the central loop. There are + /* Each input character is processed by the central loop. There are ** some input codes which require two or three characters for ** completion; these are handled by advancing the state machine. ** Errors are not processed; instead the state machine is reset @@ -98,7 +98,7 @@ ReadRow(FILE * const file, RepeatAndDigit /* have seen repeat code and its first following digit */ }; - + enum StateCode InputState; /* current state */ int c; /* the current input character */ long repeatcount; /* current repeat value */ @@ -106,8 +106,8 @@ ReadRow(FILE * const file, long pendinghex; /* the first of a pair of hex characters */ int lengthRemaining; unsigned char * cursor; - - /* We cannot exit when length becomes zero because we need to check + + /* We cannot exit when length becomes zero because we need to check ** to see if a row ending character follows. Thus length is checked ** only when we get a data generating byte. If length then is ** zero, we ungetc the byte. @@ -148,7 +148,7 @@ ReadRow(FILE * const file, while (lengthRemaining-- > 0) *cursor++ = WHITEBYTE; return c; - + CASE1(0x21): CASE6(0x22): CASE8(0x28): @@ -227,9 +227,9 @@ ReadRow(FILE * const file, break; store: - /* generate byte(s) into the output row + /* generate byte(s) into the output row Use repeatcount, depending on state. */ - if (lengthRemaining < repeatcount) + if (lengthRemaining < repeatcount) /* reduce repeat count if it would exceed available space */ repeatcount = lengthRemaining; @@ -269,7 +269,7 @@ ReadATKRaster(FILE * const ifP) { pm_error ("input file not Andrew raster object"); fscanf(ifP, " %d ", &version); - if (version < 2) + if (version < 2) pm_error ("version too old to parse"); { @@ -277,8 +277,8 @@ ReadATKRaster(FILE * const ifP) { long xscale, yscale; long xoffset, yoffset, subwidth, subheight; /* ignore all these features: */ - fscanf(ifP, " %u %ld %ld %ld %ld %ld %ld", - &options, &xscale, &yscale, &xoffset, + fscanf(ifP, " %u %ld %ld %ld %ld %ld %ld", + &options, &xscale, &yscale, &xoffset, &yoffset, &subwidth, &subheight); } /* scan to end of line in case this is actually something beyond V2 */ @@ -291,8 +291,12 @@ ReadATKRaster(FILE * const ifP) { fscanf(ifP, " %d %d %d ", &objectid, &width, &height); - if (width < 1 || height < 1 || width > 1000000 || height > 1000000) + if (width < 1 || height < 1 || width > 1000000 || height > 1000000) pm_error("bad width or height"); + /* Note: Whether these values are upper limits set by the author of + the original version of this program, or come from the official + file format specification is unknown. + */ pbm_writepbminit(stdout, width, height, 0); bitrow = pbm_allocrow_packed(width); @@ -302,7 +306,7 @@ ReadATKRaster(FILE * const ifP) { long const nextChar = ReadRow(ifP, bitrow, rowlen); switch (nextChar) { - case '|': + case '|': pbm_writepbmrow_packed(stdout, bitrow, width, 0); break; case EOF: diff --git a/converter/pbm/escp2topbm.c b/converter/pbm/escp2topbm.c index 8acd13d6..de3ea931 100644 --- a/converter/pbm/escp2topbm.c +++ b/converter/pbm/escp2topbm.c @@ -104,7 +104,7 @@ readChar(FILE * const ifP) { -static void +static void readStripeHeader(unsigned int * const widthThisStripeP, unsigned int * const rowsThisStripeP, unsigned int * const compressionP, @@ -120,7 +120,7 @@ readStripeHeader(unsigned int * const widthThisStripeP, compression = stripeHeader[0]; /* verticalResolution = stripeHeader[1]; */ /* horizontalResolution = stripeHeader[2]; */ - rowsThisStripe = stripeHeader[3]; + rowsThisStripe = stripeHeader[3]; widthThisStripe = stripeHeader[5] * 256 + stripeHeader[4]; if (widthThisStripe == 0 || rowsThisStripe == 0) @@ -143,7 +143,7 @@ readStripeHeader(unsigned int * const widthThisStripeP, /* RLE decoder */ static void -decEpsonRLE(unsigned int const blockSize, +decEpsonRLE(unsigned int const blockSize, unsigned char * const outBuffer, FILE * const ifP) { @@ -174,7 +174,7 @@ decEpsonRLE(unsigned int const blockSize, unsigned int i; for (i = 0; i < runLength; ++i) - outBuffer[dpos + i] = repeatChar; + outBuffer[dpos + i] = repeatChar; dpos += runLength; } } @@ -191,7 +191,7 @@ processStripeRaster(unsigned char ** const bitarray, unsigned int const compression, FILE * const ifP, unsigned int * const rowIdxP) { - + unsigned int const initialRowIdx = *rowIdxP; unsigned int const widthInBytes = pbm_packed_bytes(width); unsigned int const blockSize = rowsThisStripe * widthInBytes; @@ -237,7 +237,7 @@ expandBitarray(unsigned char *** const bitarrayP, if (*bitarraySizeP > heightMax) pm_error("Error: Image too tall"); else - REALLOCARRAY_NOFAIL(*bitarrayP, *bitarraySizeP); + REALLOCARRAY_NOFAIL(*bitarrayP, *bitarraySizeP); } @@ -253,7 +253,7 @@ writePbmImage(unsigned char ** const bitarray, pm_error("No image"); pbm_writepbminit(stdout, width, height, 0); - + for (row = 0; row < height; ++row) { pbm_cleanrowend_packed(bitarray[row], width); pbm_writepbmrow_packed(stdout, bitarray[row], width, 0); @@ -309,7 +309,7 @@ main(int argc, unsigned int compression; unsigned int rowsThisStripe; unsigned int widthThisStripe; - + readStripeHeader(&widthThisStripe, &rowsThisStripe, &compression, ifP); @@ -320,7 +320,7 @@ main(int argc, /* The official Epson manual says valid values are 1, 8, 24 but we just print a warning message and continue if other values are detected. - */ + */ pm_message("Abnormal data block height value: %u " "(ignoring)", rowsThisStripe); diff --git a/converter/pbm/g3topbm.c b/converter/pbm/g3topbm.c index 5d98fcb2..5db507a3 100644 --- a/converter/pbm/g3topbm.c +++ b/converter/pbm/g3topbm.c @@ -552,12 +552,11 @@ readFaxRow(struct BitStream * const bitStreamP, curcode = (curcode << 1) | bit; ++curlen; - if (curlen > 11 && curcode == 0x00) { - if (++fillbits > MAXFILLBITS) - pm_error("Encountered %u consecutive fill bits. " - "Aborting", fillbits); - } - else if (curlen - fillbits > 13) { + if (curlen > 11 && curcode == 0x00) { + if (++fillbits > MAXFILLBITS) + pm_error("Encountered %u consecutive fill bits. " + "Aborting", fillbits); + } else if (curlen - fillbits > 13) { formatBadCodeException(exceptionP, col, curlen, curcode); done = TRUE; } else if (curcode != 0) { diff --git a/converter/pbm/mgrtopbm.c b/converter/pbm/mgrtopbm.c index 712e3be9..e0a88883 100644 --- a/converter/pbm/mgrtopbm.c +++ b/converter/pbm/mgrtopbm.c @@ -58,12 +58,12 @@ interpHdrHeight(struct b_header const head, static void -readMgrHeader(FILE * const ifP, - unsigned int * const colsP, - unsigned int * const rowsP, - unsigned int * const depthP, +readMgrHeader(FILE * const ifP, + unsigned int * const colsP, + unsigned int * const rowsP, + unsigned int * const depthP, unsigned int * const padrightP ) { - + struct b_header head; unsigned int pad; size_t bytesRead; @@ -73,10 +73,10 @@ readMgrHeader(FILE * const ifP, pm_error("Unable to read 1st byte of file. " "fread() returns errno %d (%s)", errno, strerror(errno)); - if (head.magic[0] == 'y' && head.magic[1] == 'z') { + if (head.magic[0] == 'y' && head.magic[1] == 'z') { /* new style bitmap */ size_t bytesRead; - bytesRead = fread(&head.depth, + bytesRead = fread(&head.depth, sizeof(head) - sizeof(struct old_b_header), 1, ifP); if (bytesRead != 1 ) pm_error("Unable to read header after 1st byte. " @@ -84,11 +84,11 @@ readMgrHeader(FILE * const ifP, errno, strerror(errno)); *depthP = (int) head.depth - ' '; pad = 8; - } else if (head.magic[0] == 'x' && head.magic[1] == 'z') { + } else if (head.magic[0] == 'x' && head.magic[1] == 'z') { /* old style bitmap with 32-bit padding */ *depthP = 1; pad = 32; - } else if (head.magic[0] == 'z' && head.magic[1] == 'z') { + } else if (head.magic[0] == 'z' && head.magic[1] == 'z') { /* old style bitmap with 16-bit padding */ *depthP = 1; pad = 16; @@ -104,8 +104,8 @@ readMgrHeader(FILE * const ifP, interpHdrWidth (head, colsP); interpHdrHeight(head, rowsP); - - *padrightP = ( ( *colsP + pad - 1 ) / pad ) * pad - *colsP; + + *padrightP = ((*colsP + pad - 1) / pad) * pad - *colsP; } @@ -131,7 +131,7 @@ main(int argc, inputFileName = argv[1]; else inputFileName = "-"; - + ifP = pm_openr(inputFileName); readMgrHeader(ifP, &cols, &rows, &depth, &padright); @@ -141,7 +141,7 @@ main(int argc, pbm_writepbminit(stdout, cols, rows, 0); bitrow = pbm_allocrow_packed(cols + padright); - + itemCount = (cols + padright ) / 8; for (row = 0; row < rows; ++row) { @@ -166,9 +166,9 @@ main(int argc, Changed bitrow from plain to raw, read function from getc() to fread(), write function from pbm_writepbmrow() to pbm_writepbmrow_packed(). Retired bitwise transformation functions. - + NOT tested for old-style format files. Only one zz file in mgrsrc-0.69 . - + */ diff --git a/converter/pbm/pbmtoatk.c b/converter/pbm/pbmtoatk.c index ea5b7abe..5f2b625c 100644 --- a/converter/pbm/pbmtoatk.c +++ b/converter/pbm/pbmtoatk.c @@ -22,8 +22,8 @@ static void -write_atk_bytes(FILE * const file, - unsigned char const curbyte, +write_atk_bytes(FILE * const file, + unsigned char const curbyte, unsigned int const startcount) { /* codes for data stream */ @@ -37,7 +37,7 @@ write_atk_bytes(FILE * const file, #define BLACKBYTE 0xFF /* WriteRow table for conversion of a byte value to two character - hex representation + hex representation */ static unsigned char hex[16] = { @@ -82,10 +82,10 @@ write_atk_bytes(FILE * const file, static void -process_atk_byte(int * const pcurcount, - unsigned char * const pcurbyte, - FILE * const file, - unsigned char const newbyte, +process_atk_byte(int * const pcurcount, + unsigned char * const pcurbyte, + FILE * const file, + unsigned char const newbyte, int const eolflag) { int curcount; @@ -93,7 +93,7 @@ process_atk_byte(int * const pcurcount, curcount = *pcurcount; /* initial value */ curbyte = *pcurbyte; /* initial value */ - + if (curcount < 1) { *pcurbyte = curbyte = newbyte; *pcurcount = curcount = 1; @@ -139,6 +139,17 @@ main(int argc, const char ** argv) { } pbm_readpbminit(ifP, &cols, &rows, &format); + /* Note: atktopbm imposes limits: cols <= 1000000 rows <= 1000000 + Whether these values are defined in the official file format + specification is unknown. We issue warning messages when large + values are encountered. + */ + + if (cols > 1000000) + pm_message("Proceeding with extremely large width value: %u", cols); + if (rows > 1000000) + pm_message("Proceeding with extremely large height value: %u", rows); + bitrow = pbm_allocrow_packed(cols); printf("\\begindata{raster,%d}\n", 1); @@ -152,7 +163,7 @@ main(int argc, const char ** argv) { pbm_readpbmrow_packed(ifP, bitrow, cols, format); pbm_cleanrowend_packed(bitrow, cols); - + for (i = 0, curbyte = 0, curcount = 0; i < byteCt; ++i) { process_atk_byte(&curcount, &curbyte, stdout, bitrow[i], @@ -162,7 +173,7 @@ main(int argc, const char ** argv) { pbm_freerow_packed(bitrow); pm_close(ifP); - + printf("\\enddata{raster, %d}\n", 1); return 0; diff --git a/converter/pbm/pbmtoescp2.c b/converter/pbm/pbmtoescp2.c index 6f284f3c..942ecec9 100644 --- a/converter/pbm/pbmtoescp2.c +++ b/converter/pbm/pbmtoescp2.c @@ -18,6 +18,7 @@ * * ESC/P Reference Manual (1997) * ftp://download.epson-europe.com/pub/download/182/epson18162eu.zip +* See Part 1 "ESC ." Print Raster Graphics */ #include <string.h> @@ -28,7 +29,7 @@ #include "runlength.h" #include "pbm.h" - +#define MAXCOLS (127 * 256 + 255) /* Limit in official Epson manual */ static char const esc = 033; @@ -57,19 +58,19 @@ parseCommandLine(int argc, const char ** argv, opt.opt_table = option_def; opt.short_allowed = FALSE; opt.allowNegNum = FALSE; - OPTENT3(0, "compress", OPT_UINT, &cmdlineP->compress, + OPTENT3(0, "compress", OPT_UINT, &cmdlineP->compress, &compressSpec, 0); - OPTENT3(0, "resolution", OPT_UINT, &cmdlineP->resolution, + OPTENT3(0, "resolution", OPT_UINT, &cmdlineP->resolution, &resolutionSpec, 0); - OPTENT3(0, "stripeheight", OPT_UINT, &cmdlineP->stripeHeight, + OPTENT3(0, "stripeheight", OPT_UINT, &cmdlineP->stripeHeight, &stripeHeightSpec, 0); - OPTENT3(0, "raw", OPT_FLAG, NULL, + OPTENT3(0, "raw", OPT_FLAG, NULL, &rawSpec, 0); - OPTENT3(0, "formfeed", OPT_FLAG, NULL, + OPTENT3(0, "formfeed", OPT_FLAG, NULL, &formfeedSpec, 0); - + pm_optParseOptions3(&argc, (char **)argv, opt, sizeof(opt), 0); - + if (argc-1 > 1) pm_error("Too many arguments: %d. " "Only argument is the filename", argc-1); @@ -155,7 +156,7 @@ main(int argc, const char * argv[]) { unsigned char * bitrow[256]; unsigned char * compressedData; struct CmdlineInfo cmdline; - + pm_proginit(&argc, argv); parseCommandLine(argc, argv, &cmdline); @@ -164,7 +165,7 @@ main(int argc, const char * argv[]) { pbm_readpbminit(ifP, &cols, &rows, &format); - if (cols / 256 > 127) /* Limit in official Epson manual */ + if (cols > MAXCOLS) pm_error("Image width is too large"); outColByteCt = pbm_packed_bytes(cols); @@ -229,7 +230,7 @@ main(int argc, const char * argv[]) { } } - free(inBuff); + free(inBuff); free(compressedData); pm_close(ifP); diff --git a/converter/pbm/pbmtomgr.c b/converter/pbm/pbmtomgr.c index 0e529740..faa56d8f 100644 --- a/converter/pbm/pbmtomgr.c +++ b/converter/pbm/pbmtomgr.c @@ -33,7 +33,7 @@ putinit(unsigned int const rows, head._reserved = ' '; writtenCount = fwrite(&head, sizeof(head), 1, stdout); if (writtenCount != 1) - pm_error("fwrite() failed to write the MGR header."); + pm_error("fwrite() failed to write the MGR header."); } @@ -63,7 +63,7 @@ main(int argc, inputFileName = argv[1]; else inputFileName = "-"; - + ifP = pm_openr(inputFileName); pbm_readpbminit(ifP, &cols, &rows, &format); @@ -71,14 +71,14 @@ main(int argc, pm_error("Image width too large: %u (max: %u)", cols, maxDimension); if (rows > maxDimension) pm_error("Image height too large: %u (max: %u)", rows, maxDimension); - + bitrow = pbm_allocrow_packed(cols); bytesPerRow = pbm_packed_bytes(cols); putinit(rows, cols); - + for (row = 0; row < rows; ++row) { - /* The raster formats are identical. + /* The raster formats are identical. The row end pad bits are set to 0 in mgr. */ size_t bytesWritten; @@ -89,7 +89,7 @@ main(int argc, bytesWritten = fwrite(bitrow, 1, bytesPerRow, stdout); if (bytesWritten != bytesPerRow ) pm_error("fwrite() failed to write MGR bitmap " - "to Standard Output."); + "to Standard Output."); } pm_close(ifP); return 0; @@ -102,7 +102,7 @@ main(int argc, pbm_readpbmrow_packed(), write function from putc() to fwrite(). Retired bitwise transformation functions. - + Produces only new style bitmap (8 bit padding.) See mgrtopbm.c . */ diff --git a/converter/pbm/ybmtopbm.c b/converter/pbm/ybmtopbm.c index ea7e66a7..36f2dee7 100644 --- a/converter/pbm/ybmtopbm.c +++ b/converter/pbm/ybmtopbm.c @@ -19,7 +19,7 @@ static short const ybmMagic = ( ( '!' << 8 ) | '!' ); static void -getinit(FILE * const ifP, +getinit(FILE * const ifP, unsigned int * const colsP, unsigned int * const rowsP, int * const depthP) { @@ -80,7 +80,7 @@ main(int argc, const char * argv[]) { getinit(ifP, &cols, &rows, &depth); if (depth != 1) pm_error("YBM file has depth of %u, must be 1", (unsigned int) depth); - + pbm_writepbminit(stdout, cols, rows, 0); bitrow = pbm_allocrow_packed(cols + 8); @@ -95,7 +95,7 @@ main(int argc, const char * argv[]) { for (i = 0; i < itemCt; ++i) { short int item; pm_readbigshort(ifP, &item); - itemrow[i] = (uint16_t) item; + itemrow[i] = (uint16_t) item; } for (i = 0; i < pbm_packed_bytes(cols); ++i) |