Ejemplo n.º 1
0
static int szddd_read_headers(struct mspack_system *sys,
			      struct mspack_file *fh,
			      struct msszddd_header *hdr)
{
    unsigned char buf[8];

    /* read and check signature */
    if (sys->read(fh, buf, 8) != 8) return MSPACK_ERR_READ;

    if ((mspack_memcmp(buf, szdd_signature_expand, 8) == 0)) {
	/* common SZDD */
	hdr->format = MSSZDD_FMT_NORMAL;

	/* read the rest of the header */
	if (sys->read(fh, buf, 6) != 6) return MSPACK_ERR_READ;
	if (buf[0] != 0x41) return MSPACK_ERR_DATAFORMAT;
	hdr->missing_char = buf[1];
	hdr->length = EndGetI32(&buf[2]);
    }
    else if ((mspack_memcmp(buf, szdd_signature_qbasic, 8) == 0)) {
	/* special QBasic SZDD */
	hdr->format = MSSZDD_FMT_QBASIC;
	if (sys->read(fh, buf, 4) != 4) return MSPACK_ERR_READ;
	hdr->missing_char = '\0';
	hdr->length = EndGetI32(buf);
    }
    else {
	return MSPACK_ERR_SIGNATURE;
    }
    return MSPACK_ERR_OK;
}
Ejemplo n.º 2
0
static int szddd_read_headers(struct mspack_system *sys,
			      struct mspack_file *fh,
			      struct msszddd_header *szdd)
{
  unsigned char buf[szddhead_SIZEOF];

  szdd->length = 0;
  szdd->missing_char = '\0';

  /* read header */
  if (sys->read(fh, &buf[0], szddhead_SIZEOF) != szddhead_SIZEOF) {
    return MSPACK_ERR_READ;
  }

  /* check signature */
  if ((mspack_memcmp(&buf[szddhead_Signature], &szdd_signature[0], 8) != 0)) {
    return MSPACK_ERR_SIGNATURE;
  }

  /* check compression method */
  if (buf[szddhead_CompType] != SZDD_COMPTYPE_A) {
    return MSPACK_ERR_DATAFORMAT;
  }

  /* read missing character from filename */
  szdd->missing_char = buf[szddhead_FileChar];

  /* read decompressed length of file */
  szdd->length = EndGetI32(&buf[szddhead_FileLength]);
  return MSPACK_ERR_OK;
}