Beispiel #1
0
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;
}
Beispiel #2
0
static void isf_destroy(istream_t * istream)
{
  SC68free(istream);
}
Beispiel #3
0
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;
}