]> git.draconx.ca Git - liblbx.git/blobdiff - src/image.c
liblbx: Implement improved error reporting mechanism.
[liblbx.git] / src / image.c
index 69d4ebb4b8e9fc71713768365e1ad19401c6e127..a5a4bffcc2a4f9cf5956c4c4da719f46eac97b59 100644 (file)
@@ -28,6 +28,7 @@
 #include "pack.h"
 #include "misc.h"
 #include "lbx.h"
+#include "error.h"
 #include "image.h"
 
 #define FLAG_RAW       0x0100 /* Image is stored as a flat array of bytes. */
@@ -67,7 +68,7 @@ static struct lbx_image *lbximg_init(unsigned char hdr[static HDR_LEN])
 
        img = malloc(sizeof *img + sizeof img->offsets[0] * (nframes+1));
        if (!img) {
-               lbx_errno = -errno;
+               lbx_error_raise(LBX_ENOMEM);
                return NULL;
        }
 
@@ -94,9 +95,8 @@ struct lbx_image *lbximg_open(void *f, const struct lbx_file_ops *fops,
        struct lbx_image *img;
 
        if (fops->read(hdr_buf, sizeof hdr_buf, f) != sizeof hdr_buf) {
-               lbx_errno = -errno;
                if (fops->eof(f))
-                       lbx_errno = LBX_EEOF;
+                       lbx_error_raise(LBX_EEOF);
                return NULL;
        }
 
@@ -124,9 +124,8 @@ struct lbx_image *lbximg_open(void *f, const struct lbx_file_ops *fops,
                unsigned char buf[4];
 
                if (fops->read(buf, sizeof buf, f) != sizeof buf) {
-                       lbx_errno = -errno;
                        if (fops->eof(f))
-                               lbx_errno = LBX_EEOF;
+                               lbx_error_raise(LBX_EEOF);
                        free(img);
                        return NULL;
                }
@@ -138,9 +137,8 @@ struct lbx_image *lbximg_open(void *f, const struct lbx_file_ops *fops,
                unsigned char buf[4];
 
                if (fops->read(buf, sizeof buf, f) != sizeof buf) {
-                       lbx_errno = -errno;
                        if (fops->eof(f))
-                               lbx_errno = LBX_EEOF;
+                               lbx_error_raise(LBX_EEOF);
                        free(img);
                        return NULL;
                }
@@ -150,7 +148,7 @@ struct lbx_image *lbximg_open(void *f, const struct lbx_file_ops *fops,
                img->paloff   = fops->tell(f);
 
                if (img->palstart + img->palcount > 256) {
-                       lbx_errno = LBX_EFORMAT;
+                       lbx_error_raise(LBX_EFORMAT);
                        free(img);
                        return NULL;
                }
@@ -231,7 +229,7 @@ static int _lbx_drawrow(int first, struct lbx_image *img)
 
                /* Ensure that the row fits in the image. */
                if (img->height - img->currenty <= yval || xval >= img->width) {
-                       lbx_errno = LBX_EFORMAT;
+                       lbx_error_raise(LBX_EFORMAT);
                        return -1;
                }
 
@@ -241,7 +239,7 @@ static int _lbx_drawrow(int first, struct lbx_image *img)
                xval = unpack_16_le(buf+2);
 
                if (img->width - img->currentx <= xval) {
-                       lbx_errno = LBX_EFORMAT;
+                       lbx_error_raise(LBX_EFORMAT);
                        return -1;
                }
                img->currentx += xval;
@@ -250,7 +248,7 @@ static int _lbx_drawrow(int first, struct lbx_image *img)
        }
 
        if (count > img->width - img->currentx) {
-               lbx_errno = LBX_EFORMAT;
+               lbx_error_raise(LBX_EFORMAT);
                return -1;
        }
 
@@ -270,9 +268,8 @@ static int _lbx_drawrow(int first, struct lbx_image *img)
 
        return 0;
 readerr:
-       lbx_errno = -errno;
        if (img->fops->eof(img->f))
-               lbx_errno = LBX_EEOF;
+               lbx_error_raise(LBX_EEOF);
        return -1;
 }
 
@@ -283,13 +280,13 @@ static unsigned char **allocframebuffer(size_t width, size_t height)
 
        tmp = calloc(height, width);
        if (!tmp) {
-               lbx_errno = -errno;
+               lbx_error_raise(LBX_ENOMEM);
                return NULL;
        }
 
        new = malloc(height * sizeof *new);
        if (!new) {
-               lbx_errno = -errno;
+               lbx_error_raise(LBX_ENOMEM);
                free(tmp);
                return NULL;
        }
@@ -308,20 +305,18 @@ static unsigned char **read_raw_frame(struct lbx_image *img, int frame)
        assert(img->flags & FLAG_RAW);
 
        if (img->fops->seek(img->f, img->offsets[frame], SEEK_SET)) {
-               lbx_errno = -errno;
                return NULL;
        }
 
        if (img->fops->read(img->framedata[0], size, img->f) != size) {
-               lbx_errno = -errno;
                if (img->fops->eof(img->f))
-                       lbx_errno = LBX_EEOF;
+                       lbx_error_raise(LBX_EEOF);
                return NULL;
        }
        memset(img->mask[0], 1, size);
 
        if (img->fops->tell(img->f) > img->offsets[frame+1]) {
-               lbx_errno = LBX_EFORMAT;
+               lbx_error_raise(LBX_EFORMAT);
                return NULL;
        }
 
@@ -331,7 +326,7 @@ static unsigned char **read_raw_frame(struct lbx_image *img, int frame)
 unsigned char **lbximg_getframe(struct lbx_image *img, int frame)
 {
        if (frame >= img->frames || frame < 0) {
-               lbx_errno = LBX_ERANGE;
+               lbx_error_raise(LBX_ENOENT);
                return NULL;
        }
 
@@ -374,7 +369,6 @@ unsigned char **lbximg_getframe(struct lbx_image *img, int frame)
                int rc, first = 1;
 
                if (img->fops->seek(img->f, img->offsets[frame], SEEK_SET)) {
-                       lbx_errno = -errno;
                        return NULL;
                }
 
@@ -385,7 +379,7 @@ unsigned char **lbximg_getframe(struct lbx_image *img, int frame)
                        first = 0;
 
                        if (img->fops->tell(img->f) > img->offsets[frame+1]) {
-                               lbx_errno = LBX_EFORMAT;
+                               lbx_error_raise(LBX_EFORMAT);
                                return NULL;
                        }
                } while (!rc);
@@ -404,12 +398,13 @@ lbximg_loadpalette(void *f, const struct lbx_file_ops *fops,
 
        for (i = 0; i < 256; i++) {
                if (fops->read(entry, sizeof entry, f) != sizeof entry) {
-                       lbx_errno = (fops->eof(f)) ? LBX_EEOF : -errno;
+                       if (fops->eof(f))
+                               lbx_error_raise(LBX_EEOF);
                        return -1;
                }
 
                if (entry[0] != 1) {
-                       lbx_errno = LBX_EFORMAT;
+                       lbx_error_raise(LBX_EFORMAT);
                        return -1;
                }
 
@@ -436,7 +431,6 @@ lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256])
                return 0;
 
        if (img->fops->seek(img->f, img->paloff, SEEK_SET)) {
-               lbx_errno = -errno;
                return -1;
        }
 
@@ -447,7 +441,7 @@ lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256])
                }
 
                if (entry[0] != 0) {
-                       lbx_errno = LBX_EFORMAT;
+                       lbx_error_raise(LBX_EFORMAT);
                        return -1;
                }
 
@@ -461,7 +455,8 @@ lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256])
 
        return 0;
 readerr:
-       lbx_errno = img->fops->eof(img->f) ? LBX_EEOF : -errno;
+       if (img->fops->eof(img->f))
+               lbx_error_raise(LBX_EEOF);
        return -1;
 }