diff options
Diffstat (limited to 'jpg2ff.c')
-rw-r--r-- | jpg2ff.c | 53 |
1 files changed, 19 insertions, 34 deletions
@@ -6,17 +6,17 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <setjmp.h> #include <jpeglib.h> -static jmp_buf error_jump; +static char *argv0; METHODDEF(void) jpeg_error(j_common_ptr cinfo) { + fprintf(stderr, "%s: libjpeg: ", argv0); (*cinfo->err->output_message)(cinfo); - longjmp(error_jump, 1); + exit(1); } int @@ -25,23 +25,20 @@ main(int argc, char *argv[]) struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; uint32_t width, height, val_be; - uint16_t *ff_row = NULL; + uint16_t *ff_row; size_t jpeg_row_len, ff_row_len, i, dx, sx; - int ret = 1; JSAMPARRAY buffer; /* output row buffer */ + argv0 = argv[0], argc--, argv++; + if (argc > 1) { - fprintf(stderr, "usage: %s\n", argv[0]); + fprintf(stderr, "usage: %s\n", argv0); return 1; } /* load jpg */ cinfo.err = jpeg_std_error(&jerr); - jerr.error_exit = jpeg_error; - if (setjmp(error_jump)) { - goto cleanup; - } jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, stdin); @@ -62,16 +59,18 @@ main(int argc, char *argv[]) JPOOL_IMAGE, jpeg_row_len, 1); ff_row_len = strlen("RGBA") * sizeof(uint16_t) * width; if(!(ff_row = malloc(ff_row_len))) { - fprintf(stderr, "%s: malloc: out of memory\n", argv[0]); + fprintf(stderr, "%s: malloc: out of memory\n", argv0); return 1; } /* write header */ fprintf(stdout, "farbfeld"); val_be = htonl(width); - fwrite(&val_be, sizeof(uint32_t), 1, stdout); + if (fwrite(&val_be, sizeof(uint32_t), 1, stdout) != 1) + goto writerr; val_be = htonl(height); - fwrite(&val_be, sizeof(uint32_t), 1, stdout); + if (fwrite(&val_be, sizeof(uint32_t), 1, stdout) != 1) + goto writerr; while (cinfo.output_scanline < cinfo.output_height) { /* jpeg_read_scanlines expects an array of pointers to scanlines. @@ -87,29 +86,15 @@ main(int argc, char *argv[]) } /* write data */ - if (fwrite(ff_row, 1, ff_row_len, stdout) != ff_row_len) { - fprintf(stderr, "%s: fwrite: ", argv[0]); - perror(NULL); - goto cleanup; - } + if (fwrite(ff_row, 1, ff_row_len, stdout) != ff_row_len) + goto writerr; } jpeg_finish_decompress(&cinfo); - ret = 0; - - /* flush output */ - if (fflush(stdout)) { - fprintf(stderr, "%s: fflush stdout: ", argv[0]); - perror(NULL); - ret = 1; - } - if (fclose(stdout) && !ret) { - fprintf(stderr, "%s: fclose stdout: ", argv[0]); - perror(NULL); - ret = 1; - } -cleanup: - free(ff_row); jpeg_destroy_decompress(&cinfo); - return ret; + return 0; +writerr: + fprintf(stderr, "%s: fwrite: ", argv0); + perror(NULL); + return 1; } |