Example #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;
}
Example #2
0
istream_t * istream_file_create(const char * fname, int mode)
{
  istream_file_t *isf;
  int len;

  if (!fname || !fname[0]) {
    return 0;
  }

  /* Don't need 0, because 1 byte already allocated in the
   * istream_file_t::fname.
   */
  len = strlen(fname);
  isf = SC68alloc(sizeof(istream_file_t) + len);
  if (!isf) {
    return 0;
  }

  /* Copy istream functions. */
  memcpy(&isf->istream, &istream_file, sizeof(istream_file));
  /* Clean file handle. */
  isf->f = 0;
  isf->mode = mode & (ISTREAM_OPEN_READ|ISTREAM_OPEN_WRITE);
  
  /* Copy filename. */
  /* $$$ May be later, we should add a check for relative path and add
   * CWD ... */
  strcpy(isf->name, fname);
  return &isf->istream;
}
Example #3
0
istream_t * istream_null_create(const char * name)
{
    istream_null_t *ism;
    int size;
    static const char hd[] = "null://";

    if (!name) {
        name = "default";
    }

    size = sizeof(istream_null_t) + sizeof(hd)-1 + strlen(name);

    ism = SC68alloc(size);
    if (!ism) {
        return 0;
    }

    ism->istream = istream_null;
    ism->size = 0;
    ism->pos = 0;
    ism->open = 0;
    strcpy(ism->name,hd);
    strcat(ism->name,name);

    return &ism->istream;
}
Example #4
0
istream_t * istream_mem_create(const void * addr, int len, int mode)
{
  istream_mem_t *ism;

  if (len < 0 || (!addr && len)) {
    return 0;
  }

  ism = (istream_mem_t*)SC68alloc(sizeof(istream_mem_t));
  if (!ism) {
    return 0;
  }

  ism->istream = istream_mem;
  ism->buffer = (char *)addr;
  ism->size = len;
  ism->mode = mode & (ISTREAM_OPEN_READ|ISTREAM_OPEN_WRITE);
  ism->open = 0;
  ism->pos = 0;
  sprintf(ism->name,"mem://%p:%p", addr, (char *)addr+len);

  return &ism->istream;
}
Example #5
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;
}