]> git.draconx.ca Git - liblbx.git/commitdiff
liblbx: Update lbximg_fopen to work like lbx_fopen.
authorNick Bowler <nbowler@draconx.ca>
Wed, 10 Feb 2010 04:24:56 +0000 (23:24 -0500)
committerNick Bowler <nbowler@draconx.ca>
Wed, 10 Feb 2010 04:24:56 +0000 (23:24 -0500)
src/image.c
src/image.h
src/lbximg.c

index 5f3a6e320c51f62010d12f24ac8fac28a0d9bd63..78cb8a5d38c50ce41fae3c778a6daab0d0bdc7d2 100644 (file)
@@ -159,9 +159,41 @@ struct lbx_image *lbximg_open(void *f, const struct lbx_file_ops *fops,
        return img;
 }
 
-struct lbx_image *lbximg_fopen(FILE *f)
+static int pipe_close(void *f)
 {
-       return lbximg_open(f, &lbx_default_fops, NULL);
+       struct lbx_pipe_state *p = f;
+       int rc;
+
+       rc = fclose(p->f);
+       free(p);
+       return rc;
+}
+
+static int file_close(void *f)
+{
+       return fclose((FILE *)f);
+}
+
+struct lbx_image *lbximg_fopen(const char *file)
+{
+       struct lbx_pipe_state *p;
+       FILE *f;
+
+       f = fopen(file, "rb");
+       if (!f)
+               return NULL;
+
+       if (fseek(f, 0, SEEK_CUR) == 0)
+               return lbximg_open(f, &lbx_default_fops, file_close);
+
+       p = malloc(sizeof *p);
+       if (!p) {
+               fclose(f);
+               return NULL;
+       }
+
+       *p = (struct lbx_pipe_state) { .f = f };
+       return lbximg_open(p, &lbx_pipe_fops, pipe_close);
 }
 
 static int _lbx_drawrow(int first, struct lbx_image *img)
index 9bd41eb1ac1aa35b3ff93a9dc2275b6a0569eb4b..c1ca3ba25b54738596b82418b0c0331337501cbd 100644 (file)
@@ -21,7 +21,7 @@ struct lbx_imginfo {
 
 LBX_IMG *lbximg_open(void *f, const struct lbx_file_ops *fops,
                      int (*destructor)(void *));
-LBX_IMG *lbximg_fopen(FILE *f);
+LBX_IMG *lbximg_fopen(const char *file);
 int      lbximg_close(LBX_IMG *img);
 
 unsigned char **lbximg_getframe(LBX_IMG *img, int frame);
index a2b74058069aa48ad984c45e276e5422f1fe4cb4..1173538856b94ae4781a78aedd86795d18719433 100644 (file)
@@ -234,7 +234,7 @@ err:
 
 static int loadoverride(FILE *f, struct lbx_colour palette[static 256])
 {
-       LBX_IMG *overimg = lbximg_fopen(f);
+       LBX_IMG *overimg = lbximg_open(f, &lbx_default_fops, NULL);
        struct lbx_imginfo info;
 
        if (!overimg) {