summaryrefslogtreecommitdiff
path: root/jpg2ff.c
diff options
context:
space:
mode:
Diffstat (limited to 'jpg2ff.c')
-rw-r--r--jpg2ff.c53
1 files changed, 19 insertions, 34 deletions
diff --git a/jpg2ff.c b/jpg2ff.c
index 9ed9258..eaed74b 100644
--- a/jpg2ff.c
+++ b/jpg2ff.c
@@ -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;
}