summaryrefslogtreecommitdiff
path: root/src/modules/loaders/loader_bz2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/loaders/loader_bz2.c')
-rw-r--r--src/modules/loaders/loader_bz2.c100
1 files changed, 33 insertions, 67 deletions
diff --git a/src/modules/loaders/loader_bz2.c b/src/modules/loaders/loader_bz2.c
index 66575bc..6d9b0f2 100644
--- a/src/modules/loaders/loader_bz2.c
+++ b/src/modules/loaders/loader_bz2.c
@@ -6,94 +6,60 @@
#define INBUF_SIZE 1024
static int
-uncompress_file(FILE * fp, int dest)
+uncompress_file(const void *fdata, unsigned int fsize, int dest)
{
- BZFILE *bf;
- DATA8 outbuf[OUTBUF_SIZE];
- int bytes, error, ret = 1;
+ int ok;
+ bz_stream strm = { 0 };
+ int ret, bytes;
+ char outbuf[OUTBUF_SIZE];
- bf = BZ2_bzReadOpen(&error, fp, 0, 0, NULL, 0);
+ ok = 0;
- if (error != BZ_OK)
- {
- BZ2_bzReadClose(NULL, bf);
- return 0;
- }
+ ret = BZ2_bzDecompressInit(&strm, 0, 0);
+ if (ret != BZ_OK)
+ return ok;
+
+ strm.next_in = (void *)fdata;
+ strm.avail_in = fsize;
- while (1)
+ for (;;)
{
- bytes = BZ2_bzRead(&error, bf, &outbuf, OUTBUF_SIZE);
+ strm.next_out = outbuf;
+ strm.avail_out = sizeof(outbuf);
+
+ ret = BZ2_bzDecompress(&strm);
+
+ if (ret != BZ_OK && ret != BZ_STREAM_END)
+ goto quit;
- if (error == BZ_OK || error == BZ_STREAM_END)
- if (write(dest, outbuf, bytes) != bytes)
- break;
+ bytes = sizeof(outbuf) - strm.avail_out;
+ if (write(dest, outbuf, bytes) != bytes)
+ goto quit;
- if (error == BZ_STREAM_END)
+ if (ret == BZ_STREAM_END)
break;
- else if (error != BZ_OK)
- {
- ret = 0;
- break;
- }
}
- BZ2_bzReadClose(&error, bf);
+ ok = 1;
- return ret;
+ quit:
+ BZ2_bzDecompressEnd(&strm);
+
+ return ok;
}
+static const char *const list_formats[] = { "bz2" };
+
int
load2(ImlibImage * im, int load_data)
{
- int rc;
- ImlibLoader *loader;
- int dest, res;
- const char *s, *p, *q;
- char tmp[] = "/tmp/imlib2_loader_bz2-XXXXXX";
- char *real_ext;
-
- rc = LOAD_FAIL;
-
- /* make sure this file ends in ".bz2" and that there's another ext
- * (e.g. "foo.png.bz2") */
- for (p = s = im->real_file, q = NULL; *s; s++)
- {
- if (*s != '.' && *s != '/')
- continue;
- q = p;
- p = s + 1;
- }
- if (!q || strcasecmp(p, "bz2"))
- return rc;
-
- if (!(real_ext = strndup(q, p - q - 1)))
- return rc;
-
- loader = __imlib_FindBestLoaderForFormat(real_ext, 0);
- free(real_ext);
- if (!loader)
- return rc;
-
- if ((dest = mkstemp(tmp)) < 0)
- return rc;
-
- res = uncompress_file(im->fp, dest);
- close(dest);
-
- if (!res)
- goto quit;
-
- res = __imlib_LoadEmbedded(loader, im, tmp, load_data);
-
- quit:
- unlink(tmp);
- return res;
+ return decompress_load(im, load_data, list_formats, ARRAY_SIZE(list_formats),
+ uncompress_file);
}
void
formats(ImlibLoader * l)
{
- static const char *const list_formats[] = { "bz2" };
__imlib_LoaderSetFormats(l, list_formats, ARRAY_SIZE(list_formats));
}