]> git.draconx.ca Git - liblbx.git/blobdiff - src/lbximg.c
tools: Add some smarter error printing routines.
[liblbx.git] / src / lbximg.c
index 43406f1d8ae61de012c393de7890b68a9db23772..ff38c89b71f998f0dff387f5f2404e4ffb0783cf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  2ooM: The Master of Orion II Reverse Engineering Project
  *  Simple command-line tool to convert an LBX image to a set of PNGs.
- *  Copyright (C) 2006-2010 Nick Bowler
+ *  Copyright © 2006-2011, 2013 Nick Bowler
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -50,31 +50,26 @@ static void printhelp(void)
        puts("For now, see the man page for detailed help.");
 }
 
-static const char *progname;
-#define errmsg(fmt, ...) (\
-       fprintf(stderr, "%s: " fmt, progname, __VA_ARGS__)\
-)
-
 enum {
        MODE_NONE,
        MODE_DECODE,
        MODE_IDENT,
 };
 
-int parserange(struct lbx_imginfo *info, char *str, unsigned char *bits)
+int parserange(unsigned frames, char *str, unsigned char *bits)
 {
        unsigned long start, end;
        unsigned int i;
        char *endptr;
 
        start = strtoul(str, &endptr, 0);
-       if (start >= info->nframes) {
-               errmsg("frame %lu out of range.\n", start);
+       if (start >= frames) {
+               tool_err(-1, "frame %lu out of range.", start);
                return -1;
        }
 
        if (endptr == str) {
-               errmsg("invalid frame range: %s.\n", str);
+               tool_err(-1, "invalid frame range: %s.", str);
                return -1;
        }
 
@@ -84,21 +79,21 @@ int parserange(struct lbx_imginfo *info, char *str, unsigned char *bits)
                break;
        case '-':
                end = strtoul(endptr+1, &endptr, 0);
-               if (end >= info->nframes) {
-                       errmsg("frame %lu out of range.\n", end);
+               if (end >= frames) {
+                       tool_err(-1, "frame %lu out of range.", end);
                        return -1;
                }
 
                if (endptr == str)
-                       end = info->nframes - 1;
+                       end = frames - 1;
                break;
        default:
-               errmsg("invalid frame range: %s.\n", str);
+               tool_err(-1, "invalid frame range: %s.", str);
                return -1;
        }
 
        if (end < start) {
-               errmsg("invalid frame range: %s.\n", str);
+               tool_err(-1, "invalid frame range: %s.", str);
                return -1;
        }
 
@@ -139,26 +134,25 @@ int outpng(unsigned int frameno,
 
        row = malloc(4 * width);
        if (!row) {
-               errmsg("failed to allocate row buffer: %s\n", strerror(errno));
+               tool_err(0, "failed to allocate row buffer");
                return -1;
        }
 
        of = fopen(name, "wb");
        if (!of) {
-               errmsg("failed to open %s: %s.\n", name, strerror(errno));
-               free(row);
+               tool_err(0, "failed to open %s", name);
                return -1;
        }
 
        png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
        if (!png) {
-               errmsg("failed to init libpng.\n", 0);
+               tool_err(-1, "failed to init libpng.");
                goto err;
        }
 
        info = png_create_info_struct(png);
        if (!info) {
-               errmsg("failed to init libpng.\n", 0);
+               tool_err(-1, "failed to init libpng.");
                png_destroy_write_struct(&png, NULL);
                goto err;
        }
@@ -239,19 +233,19 @@ static int loadoverride(FILE *f, struct lbx_colour palette[static 256])
        struct lbx_imginfo info;
 
        if (!overimg) {
-               errmsg("failed to open override image: %s\n", lbx_errmsg());
+               tool_err(-1, "failed to open override image: %s", lbx_errmsg());
                return -1;
        }
        lbx_img_getinfo(overimg, &info);
 
        if (!info.palettesz) {
-               errmsg("override image has no palette.\n", 0);
+               tool_err(-1, "override image has no palette.");
                lbx_img_close(overimg);
                return -1;
        }
 
        if (lbx_img_getpalette(overimg, palette) == -1) {
-               errmsg("error reading override palette: %s\n", lbx_errmsg());
+               tool_err(-1, "error reading override palette: %s", lbx_errmsg());
                lbx_img_close(overimg);
                return -1;
        }
@@ -277,7 +271,7 @@ static int loadpalette(struct lbx_image *img, struct lbx_imginfo *info,
 
        /* For sanity. */
        if (!palf && !info->palettesz && !override) {
-               errmsg("no palette available.\n", 0);
+               tool_err(-1, "no palette available.");
                return -1;
        }
 
@@ -288,13 +282,13 @@ static int loadpalette(struct lbx_image *img, struct lbx_imginfo *info,
 
        /* Read the external palette, if any. */
        if (palf && lbx_img_loadpalette(palf, &lbx_default_fops, palette) != 0) {
-               errmsg("error reading external palette: %s\n", lbx_errmsg());
+               tool_err(-1, "error reading external palette: %s", lbx_errmsg());
                return -1;
        }
 
        /* Read the embedded palette, if any. */
        if (info->palettesz && lbx_img_getpalette(img, palette) == -1) {
-               errmsg("error reading embedded palette: %s\n", lbx_errmsg());
+               tool_err(-1, "error reading embedded palette: %s", lbx_errmsg());
                return -1;
        }
 
@@ -316,7 +310,7 @@ int decode(struct lbx_image *img, FILE *palf, FILE *override, char **argv)
 
        lbx_img_getinfo(img, &info);
 
-       framebits = calloc(1, info.nframes / CHAR_BIT + 1);
+       framebits = calloc(1, img->frames / CHAR_BIT + 1);
        if (!framebits) {
                return EXIT_FAILURE;
        }
@@ -324,10 +318,10 @@ int decode(struct lbx_image *img, FILE *palf, FILE *override, char **argv)
        /* Figure out what images we're extracting. */
        if (!argv[0]) {
                /* extract all images by default. */
-               memset(framebits, -1, info.nframes / CHAR_BIT + 1);
+               memset(framebits, -1, img->frames / CHAR_BIT + 1);
        } else {
                for (i = 0; argv[i]; i++) {
-                       parserange(&info, argv[i], framebits);
+                       parserange(img->frames, argv[i], framebits);
                }
        }
 
@@ -336,7 +330,7 @@ int decode(struct lbx_image *img, FILE *palf, FILE *override, char **argv)
        }
 
        /* Extract the images, in order. */
-       for (i = 0; i < info.nframes; i++) {
+       for (i = 0; i < img->frames; i++) {
                unsigned char **data;
                unsigned char **mask;
 
@@ -345,19 +339,19 @@ int decode(struct lbx_image *img, FILE *palf, FILE *override, char **argv)
 
                data = lbx_img_getframe(img, i);
                if (!data) {
-                       errmsg("error in frame %u: %s\n", i, lbx_errmsg());
+                       tool_err(-1, "error in frame %u: %s", i, lbx_errmsg());
                        continue;
                }
 
                mask = lbx_img_getmask(img);
 
-               if (!outpng(i, data, mask, info.width, info.height, palette)) {
+               if (!outpng(i, data, mask, img->width, img->height, palette)) {
                        extracted = 1;
                }
        }
 
        if (!extracted) {
-               errmsg("no frames extracted.\n", 0);
+               tool_err(-1, "no frames extracted.");
                goto err;
        }
 
@@ -394,7 +388,7 @@ int main(int argc, char **argv)
                { 0 }
        };
 
-       progname = "lbximg"; /* argv[0]; */
+       tool_init("lbximg", argc, argv);
        while ((opt = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) {
                switch(opt) {
                case 'i':
@@ -415,7 +409,7 @@ int main(int argc, char **argv)
                case 'p':
                        palf = fopen(optarg, "rb");
                        if (!palf) {
-                               errmsg("failed to open %s: %m\n", optarg);
+                               tool_err(0, "failed to open %s", optarg);
                                return EXIT_FAILURE;
                        }
 
@@ -423,12 +417,12 @@ int main(int argc, char **argv)
                case 'O':
                        overf = fopen(optarg, "rb");
                        if (!overf) {
-                               errmsg("failed to open %s: %m\n", optarg);
+                               tool_err(0, "failed to open %s", optarg);
                                return EXIT_FAILURE;
                        }
                        break;
                case 'V':
-                       puts(VERSION_BOILERPLATE("lbximg"));
+                       tool_version();
                        return EXIT_SUCCESS;
                case 'U':
                        printusage();
@@ -443,7 +437,7 @@ int main(int argc, char **argv)
        }
 
        if (mode == MODE_NONE) {
-               errmsg("you must specify a mode.\n", 0);
+               tool_err(-1, "you must specify a mode.");
                return EXIT_FAILURE;
        }
 
@@ -453,7 +447,7 @@ int main(int argc, char **argv)
                img = lbx_img_open(&stdin_handle, &lbx_pipe_fops, NULL);
 
        if (!img) {
-               errmsg("failed to open image: %s.\n", lbx_errmsg());
+               tool_err(-1, "failed to open image: %s.", lbx_errmsg());
                return EXIT_FAILURE;
        }
 
@@ -465,9 +459,9 @@ int main(int argc, char **argv)
 
                lbx_img_getinfo(img, &info);
                printf("%s is %ux%u LBX image, %u frame(s)%s%s\n",
-                      file, info.width, info.height, info.nframes,
+                      file, img->width, img->height, img->frames,
                       info.palettesz ? ", embedded palette" : "",
-                      info.chunk     ? ", chunked" : "",
+                      img->chunk     ? ", chunked" : "",
                       info.looping   ? ", loops" : "");
        }