diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-29 16:19:20 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-29 16:19:20 +0000 |
commit | 89973760e357aaf87b834f93e133ffb76b157d4b (patch) | |
tree | 2c24ce7e2601af9836726b0d5b91af8ef204c134 /lib/libpamwrite.c | |
parent | 3821270a4899d4d9915bcc9f105b65b849467a3f (diff) | |
download | netpbm-mirror-89973760e357aaf87b834f93e133ffb76b157d4b.tar.gz netpbm-mirror-89973760e357aaf87b834f93e133ffb76b157d4b.tar.xz netpbm-mirror-89973760e357aaf87b834f93e133ffb76b157d4b.zip |
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
Diffstat (limited to 'lib/libpamwrite.c')
-rw-r--r-- | lib/libpamwrite.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/lib/libpamwrite.c b/lib/libpamwrite.c index 9184a4b5..83f0f41b 100644 --- a/lib/libpamwrite.c +++ b/lib/libpamwrite.c @@ -308,22 +308,33 @@ writePamRawRow(const struct pam * const pamP, Write mutiple ('count') copies of the same row ('tuplerow') to the file, in raw (not plain) format. -----------------------------------------------------------------------------*/ + jmp_buf jmpbuf; + jmp_buf * origJmpbufP; unsigned int rowImageSize; - unsigned char * outbuf; /* malloc'ed */ - unsigned int i; outbuf = pnm_allocrowimage(pamP); pnm_formatpamrow(pamP, tuplerow, outbuf, &rowImageSize); - for (i = 0; i < count; ++i) { - size_t bytesWritten; - - bytesWritten = fwrite(outbuf, 1, rowImageSize, pamP->file); - if (bytesWritten != rowImageSize) - pm_error("fwrite() failed to write an image row to the file. " - "errno=%d (%s)", errno, strerror(errno)); + if (setjmp(jmpbuf) != 0) { + pnm_freerowimage(outbuf); + pm_setjmpbuf(origJmpbufP); + pm_longjmp(); + } else { + unsigned int i; + + pm_setjmpbufsave(&jmpbuf, &origJmpbufP); + + for (i = 0; i < count; ++i) { + size_t bytesWritten; + + bytesWritten = fwrite(outbuf, 1, rowImageSize, pamP->file); + if (bytesWritten != rowImageSize) + pm_error("fwrite() failed to write an image row to the file. " + "errno=%d (%s)", errno, strerror(errno)); + } + pm_setjmpbuf(origJmpbufP); } pnm_freerowimage(outbuf); } |