]> git.draconx.ca Git - liblbx.git/blobdiff - src/lbx.c
liblbx: Implement improved error reporting mechanism.
[liblbx.git] / src / lbx.c
index 0e26315fc8652acdc922a7f526140d5288463ab9..26a59bd66604141855773c4f7b80772d4c6ba045 100644 (file)
--- a/src/lbx.c
+++ b/src/lbx.c
 
 #include "pack.h"
 #include "misc.h"
+#include "error.h"
 #include "lbx.h"
 
 #define LBX_MAGIC    0x0000fead
 #define LBX_HDR_SIZE 8
 
-int lbx_errno = 0;
-
 struct lbx_state {
        char *name;
 
@@ -62,13 +61,13 @@ static struct lbx_state *lbx_init(unsigned char hdr[static LBX_HDR_SIZE])
        struct lbx_state *lbx;
 
        if (magic != LBX_MAGIC) {
-               lbx_errno = -LBX_EMAGIC;
+               lbx_error_raise(LBX_EMAGIC);
                return NULL;
        }
 
        lbx = malloc(sizeof *lbx + sizeof lbx->offsets[0] * (nfiles+1));
        if (!lbx) {
-               lbx_errno = -errno;
+               lbx_error_raise(LBX_ENOMEM);
                return NULL;
        }
 
@@ -98,12 +97,13 @@ struct lbx_state *lbx_open(void *f, const struct lbx_file_ops *fops,
 
        dupname = str_dup(name);
        if (!dupname) {
-               lbx_errno = -errno;
+               lbx_error_raise(LBX_ENOMEM);
                goto err;
        }
 
        if (fops->read(hdr_buf, sizeof hdr_buf, f) != sizeof hdr_buf) {
-               lbx_errno = -errno;
+               if (fops->eof(f))
+                       lbx_error_raise(LBX_EEOF);
                goto err;
        }
 
@@ -120,9 +120,8 @@ struct lbx_state *lbx_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);
                        goto err;
                }
 
@@ -196,8 +195,8 @@ lbx_file_stat(struct lbx_state *lbx, unsigned fileno, struct lbx_statbuf *buf)
        static char str[256]; /* FIXME */
 
        if (fileno >= lbx->nfiles) {
+               lbx_error_raise(LBX_ENOENT);
                buf->name = NULL;
-               lbx_errno = LBX_ERANGE;
                return -1;
        }
 
@@ -224,19 +223,18 @@ struct lbx_file_state *lbx_file_open(struct lbx_state *lbx, unsigned fileno)
        struct lbx_file_state *state;
 
        if (fileno >= lbx->nfiles) {
-               lbx_errno = LBX_ERANGE;
+               lbx_error_raise(LBX_ENOENT);
                return NULL;
        }
 
        lbx->last_file = NULL;
        if (lbx->fops->seek(lbx->f, lbx->offsets[fileno], SEEK_SET) != 0) {
-               lbx_errno = -errno;
                return NULL;
        }
 
        state = malloc(sizeof *state);
        if (!state) {
-               lbx_errno = -errno;
+               lbx_error_raise(LBX_ENOMEM);
                return NULL;
        }
 
@@ -318,19 +316,3 @@ void lbx_file_close(struct lbx_file_state *f)
                f->lbx->last_file = NULL;
        free(f);
 }
-
-const char *lbx_strerror(void)
-{
-       if (lbx_errno < 0)
-               return strerror(-lbx_errno);
-
-       switch (lbx_errno) {
-       case LBX_ESUCCESS: return "Success";
-       case LBX_EMAGIC:   return "Bad magic number";
-       case LBX_EEOF:     return "Unexpected end-of-file";
-       case LBX_ERANGE:   return "Index out of range";
-       case LBX_EFORMAT:  return "Invalid file format";
-       }
-
-       return "Unknown error";
-}