void *ice_load(istream_t *is, int *ulen) { char header[12], *inbuf = 0, * outbuf = 0; int dsize, csize; const char * fname; fname = istream_filename(is); if (istream_read(is,header,12) != 12) { SC68error_add("ice_load(%s) : no header", fname); goto error; } csize = 0; dsize = unice68_get_depacked_size(header, &csize); if (dsize < 0) { SC68error_add("ice_load(%s) : not ICE!", fname); goto error; } inbuf = SC68alloc(csize + 12); if (!inbuf) { SC68error_add("ice_load(%s) : alloc input buffer failed", fname); goto error; } memcpy(inbuf,header,12); if (istream_read(is,inbuf+12,csize) != csize) { SC68error_add("ice_load(%s) : read failed", fname); goto error; } outbuf = SC68alloc(dsize); if (!outbuf) { SC68error_add("ice_load(%s) : alloc output buffer failed", fname); goto error; } if (!unice68_depacker(outbuf, inbuf)) { goto success; } error: SC68free(outbuf); outbuf = 0; dsize = 0; success: SC68free(inbuf); if (ulen) { *ulen = dsize; } return outbuf; }
static void isf_destroy(istream_t * istream) { SC68free(istream); }
void *gzip_load(const char *fname, int *ptr_ulen) { int fd, err; gzFile f = 0; int ulen = 0; void * uncompr = 0; off_t len; const int omode = O_RDONLY | _O_BINARY; fd = open(fname, omode); if (fd == -1) { //SC68error_add("gzip_load(%s) : %s", fname, strerror(errno)); goto error; } len = lseek(fd, 0, SEEK_END); if (len == (off_t) -1) { //SC68error_add("gzip_load(%s) : %s", fname, strerror(errno)); goto error; } if (lseek(fd, 0, SEEK_SET) != 0) { //SC68error_add("gzip_load(%s) : %s", fname, strerror(errno)); goto error; } ulen = is_gz(fd, len); if (ulen == -1) { ulen = len; } f = gzdopen(fd, "rb"); if (!f) { //SC68error_add("gzip_load(%s) : %s", fname, gzerror(f, &err)); goto error; } fd = 0; /* $$$ Closed by gzclose(). Verify fdopen() rules. */ uncompr = SC68alloc(ulen); if (!uncompr) { //SC68error_add("gzip_load(%s) : alloc (%d) failed", fname, ulen); goto error; } len = gzread(f, uncompr, ulen); if (len != ulen) { //SC68error_add("gzip_load(%s) : read : %s",fname, gzerror (f, &err)); goto error; } goto end; error: if (uncompr) { SC68free(uncompr); uncompr = 0; ulen = 0; } end: if (fd) { close(fd); } if (f) { gzclose(f); } if (ptr_ulen) { *ptr_ulen = ulen; } return uncompr; }