#include <string.h>
#include <stdlib.h>
#include <zlib.h>
-#include <bzlib.h>
+#ifndef _WIN32
+#define CALLBACK
+#include <dlfcn.h>
+#else
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
#include "cdrcimg.h"
static int cd_compression;
static FILE *cd_file;
+static int (*pBZ2_bzBuffToBuffDecompress)(char *dest, unsigned int *destLen, char *source,
+ unsigned int sourceLen, int small, int verbosity);
+
static struct {
unsigned char raw[16][CD_FRAMESIZE_RAW];
unsigned char compressed[CD_FRAMESIZE_RAW * 16 + 100];
static int current_block, current_sect_in_blk;
struct CdrStat;
-extern long CDR__getStatus(struct CdrStat *stat);
+extern long CALLBACK CDR__getStatus(struct CdrStat *stat);
struct CdrStat
{
- unsigned long Type;
- unsigned long Status;
+ unsigned int Type;
+ unsigned int Status;
unsigned char Time[3]; // current playing time
};
return 0;
}
-int uncompress2(void *out, unsigned long *out_size, void *in, unsigned long in_size)
+static int uncompress2_pcsx(void *out, unsigned long *out_size, void *in, unsigned long in_size)
{
static z_stream z;
int ret = 0;
ret = uncompress(cdbuffer->raw[0], &cdbuffer_size, cdbuffer->compressed, size);
break;
case CDRC_ZLIB2:
- ret = uncompress2(cdbuffer->raw[0], &cdbuffer_size, cdbuffer->compressed, size);
+ ret = uncompress2_pcsx(cdbuffer->raw[0], &cdbuffer_size, cdbuffer->compressed, size);
break;
case CDRC_BZ:
- ret = BZ2_bzBuffToBuffDecompress((char *)cdbuffer->raw, (unsigned int *)&cdbuffer_size,
+ ret = pBZ2_bzBuffToBuffDecompress((char *)cdbuffer->raw, (unsigned int *)&cdbuffer_size,
(char *)cdbuffer->compressed, size, 0, 0);
break;
default:
}
if (cdbuffer_size != sizeof(cdbuffer->raw[0]) * cd_sectors_per_blk)
err("cdbuffer_size: %lu != %d, sector %d\n", cdbuffer_size,
- sizeof(cdbuffer->raw[0]) * cd_sectors_per_blk, sector);
+ (int)sizeof(cdbuffer->raw[0]) * cd_sectors_per_blk, sector);
// done at last!
current_block = block;
return -1;
}
}
+#ifndef _WIN32
+ if (pBZ2_bzBuffToBuffDecompress == NULL) {
+ void *h = dlopen("/usr/lib/libbz2.so.1", RTLD_LAZY);
+ if (h == NULL)
+ h = dlopen("./lib/libbz2.so.1", RTLD_LAZY);
+ if (h != NULL) {
+ pBZ2_bzBuffToBuffDecompress = dlsym(h, "BZ2_bzBuffToBuffDecompress");
+ if (pBZ2_bzBuffToBuffDecompress == NULL) {
+ err("dlsym bz2: %s", dlerror());
+ dlclose(h);
+ }
+ }
+ }
+#endif
return 0;
}
snprintf(table_fname, sizeof(table_fname), "%s.table", cd_fname);
}
else if (strcasecmp(ext, ".bz") == 0) {
+ if (pBZ2_bzBuffToBuffDecompress == NULL) {
+ err("libbz2 unavailable for .bz2 handling\n");
+ return -1;
+ }
cd_compression = CDRC_BZ;
tabentry_size = sizeof(u.bztab_entry);
snprintf(table_fname, sizeof(table_fname), "%s.index", cd_fname);