From 4c233fcfb54b386fcd96f71deb1e88e10d635825 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 27 Mar 2010 19:22:22 +0000 Subject: Release 10.50.00 - copied from trunk git-svn-id: http://svn.code.sf.net/p/netpbm/code/advanced@1162 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- converter/pbm/pbmtoybm.c | 173 +++++++++++++++++++++++++++-------------------- 1 file changed, 101 insertions(+), 72 deletions(-) (limited to 'converter/pbm/pbmtoybm.c') diff --git a/converter/pbm/pbmtoybm.c b/converter/pbm/pbmtoybm.c index 508e8e92..3fdd805d 100644 --- a/converter/pbm/pbmtoybm.c +++ b/converter/pbm/pbmtoybm.c @@ -9,100 +9,129 @@ ** copyright notice and this permission notice appear in supporting ** documentation. This software is provided "as is" without express or ** implied warranty. +** +** Feb 2010 afu +** Added dimension check to prevent short int from overflowing +** Changed code style (ANSI-style function definitions, etc.) */ #include + +#include "pm.h" #include "pbm.h" #define YBM_MAGIC ( ( '!' << 8 ) | '!' ) +#define INT16MAX 32767 -static void putinit ARGS(( int cols, int rows )); -static void putbit ARGS(( bit b )); -static void putrest ARGS(( void )); -static void putitem ARGS(( void )); +static long item; +static int bitsperitem, bitshift; -int -main( argc, argv ) - int argc; - char* argv[]; - { - FILE* ifp; - bit* bitrow; - register bit* bP; - int rows, cols, format, padright, row, col; - - - pbm_init( &argc, argv ); - - if ( argc > 2 ) - pm_usage( "[pbmfile]" ); - if ( argc == 2 ) - ifp = pm_openr( argv[1] ); - else - ifp = stdin; - - pbm_readpbminit( ifp, &cols, &rows, &format ); - bitrow = pbm_allocrow( cols ); - - /* Compute padding to round cols up to the nearest multiple of 16. */ - padright = ( ( cols + 15 ) / 16 ) * 16 - cols; - putinit( cols, rows ); - for ( row = 0; row < rows; ++row ) - { - pbm_readpbmrow( ifp, bitrow, cols, format ); - for ( col = 0, bP = bitrow; col < cols; ++col, ++bP ) - putbit( *bP ); - for ( col = 0; col < padright; ++col ) - putbit( 0 ); - } +static void +putitem(void) { - if ( ifp != stdin ) - fclose( ifp ); + pm_writebigshort(stdout, item); - putrest( ); + item = 0; + bitsperitem = 0; + bitshift = 0; +} - exit( 0 ); - } -static long item; -static int bitsperitem, bitshift; static void -putinit( cols, rows ) - int cols, rows; - { - pm_writebigshort( stdout, YBM_MAGIC ); - pm_writebigshort( stdout, cols ); - pm_writebigshort( stdout, rows ); - item = 0; +putinit(int const cols, + int const rows) { + + pm_writebigshort(stdout, YBM_MAGIC); + pm_writebigshort(stdout, cols); + pm_writebigshort(stdout, rows); + + item = 0; bitsperitem = 0; - bitshift = 0; - } + bitshift = 0; +} + + static void -putbit( bit b ) - { - if ( bitsperitem == 16 ) - putitem( ); +putbit(bit const b) { + + if (bitsperitem == 16) + putitem(); + ++bitsperitem; - if ( b == PBM_BLACK ) - item += 1 << bitshift; + + if (b == PBM_BLACK) + item += 1 << bitshift; + ++bitshift; - } +} + + static void -putrest( ) - { - if ( bitsperitem > 0 ) - putitem( ); +putrest(void) { + + if (bitsperitem > 0) + putitem(); +} + + + +int +main(int argc, const char *argv[]) { + + FILE * ifP; + bit * bitrow; + int rows; + int cols; + int format; + unsigned int padright; + unsigned int row; + const char * inputFile; + + pm_proginit(&argc, argv); + + if (argc-1 < 1) + inputFile = "-"; + else { + inputFile = argv[1]; + + if (argc-1 > 2) + pm_error("Too many arguments. The only argument is the optional " + "input file name"); } -static void -putitem( ) - { - pm_writebigshort( stdout, item ); - item = 0; - bitsperitem = 0; - bitshift = 0; + ifP = pm_openr(inputFile); + + pbm_readpbminit(ifP, &cols, &rows, &format); + + if (rows > INT16MAX || cols > INT16MAX) + pm_error("Input image is too large."); + + bitrow = pbm_allocrow(cols); + + /* Compute padding to round cols up to the nearest multiple of 16. */ + padright = ((cols + 15) / 16) * 16 - cols; + + putinit(cols, rows); + for (row = 0; row < rows; ++row) { + unsigned int col; + + pbm_readpbmrow(ifP, bitrow, cols, format); + + for (col = 0; col < cols; ++col) + putbit(bitrow[col]); + + for (col = 0; col < padright; ++col) + putbit(0); } + + if (ifP != stdin) + fclose(ifP); + + putrest(); + + return 0; +} -- cgit 1.4.1