From 89973760e357aaf87b834f93e133ffb76b157d4b Mon Sep 17 00:00:00 2001 From: giraffedata Date: Tue, 29 Aug 2006 16:19:20 +0000 Subject: Add pm_errormsg(), pm_setusererrormsg(), pm_setusermessage(), release memory before longjmping git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@30 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- lib/libpnm2.c | 102 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 74 insertions(+), 28 deletions(-) (limited to 'lib/libpnm2.c') diff --git a/lib/libpnm2.c b/lib/libpnm2.c index aae78d52..7e4f7e2a 100644 --- a/lib/libpnm2.c +++ b/lib/libpnm2.c @@ -55,6 +55,74 @@ pnm_writepnminit(FILE * const fileP, +static void +writepgmrow(FILE * const fileP, + xel * const xelrow, + unsigned int const cols, + xelval const maxval, + int const format, + bool const plainFormat) { + + jmp_buf jmpbuf; + jmp_buf * origJmpbufP; + gray * grayrow; + + grayrow = pgm_allocrow(cols); + + if (setjmp(jmpbuf) != 0) { + pgm_freerow(grayrow); + pm_setjmpbuf(origJmpbufP); + pm_longjmp(); + } else { + unsigned int col; + + pm_setjmpbufsave(&jmpbuf, &origJmpbufP); + + for (col = 0; col < cols; ++col) + grayrow[col] = PNM_GET1(xelrow[col]); + + pgm_writepgmrow(fileP, grayrow, cols, (gray) maxval, plainFormat); + + pm_setjmpbuf(origJmpbufP); + } + pgm_freerow(grayrow); +} + + + +static void +writepbmrow(FILE * const fileP, + xel * const xelrow, + unsigned int const cols, + bool const plainFormat) { + + jmp_buf jmpbuf; + jmp_buf * origJmpbufP; + bit * bitrow; + + bitrow = pbm_allocrow(cols); + + if (setjmp(jmpbuf) != 0) { + pbm_freerow(bitrow); + pm_setjmpbuf(origJmpbufP); + pm_longjmp(); + } else { + unsigned int col; + + pm_setjmpbufsave(&jmpbuf, &origJmpbufP); + + for (col = 0; col < cols; ++col) + bitrow[col] = PNM_GET1(xelrow[col]) == 0 ? PBM_BLACK : PBM_WHITE; + + pbm_writepbmrow(fileP, bitrow, cols, plainFormat); + + pm_setjmpbuf(origJmpbufP); + } + pbm_freerow(bitrow); +} + + + void pnm_writepnmrow(FILE * const fileP, xel * const xelrow, @@ -71,35 +139,13 @@ pnm_writepnmrow(FILE * const fileP, plainFormat); break; - case PGM_TYPE: { - gray* grayrow; - unsigned int col; - - grayrow = pgm_allocrow(cols); - - for (col = 0; col < cols; ++col) - grayrow[col] = PNM_GET1(xelrow[col]); - - pgm_writepgmrow(fileP, grayrow, cols, (gray) maxval, plainFormat); - - pgm_freerow( grayrow ); - } - break; - - case PBM_TYPE: { - bit* bitrow; - unsigned int col; - - bitrow = pbm_allocrow(cols); - - for (col = 0; col < cols; ++col) - bitrow[col] = PNM_GET1(xelrow[col]) == 0 ? PBM_BLACK : PBM_WHITE; - - pbm_writepbmrow(fileP, bitrow, cols, plainFormat); + case PGM_TYPE: + writepgmrow(fileP, xelrow, cols, maxval, format, plainFormat); + break; - pbm_freerow(bitrow); - } - break; + case PBM_TYPE: + writepbmrow(fileP, xelrow, cols, plainFormat); + break; default: pm_error("invalid format argument received by pnm_writepnmrow(): %d" -- cgit 1.4.1