/*************************************** * SZDDD_DECOMPRESS *************************************** * unpacks directly from input to output */ static int szddd_decompress(struct msszdd_decompressor *self, char *input, char *output) { struct msszdd_decompressor_p *this = (struct msszdd_decompressor_p *) self; struct msszddd_header_p szdd; struct mspack_system *sys; struct mspack_file *fh; int error = MSPACK_ERR_OK; if (!this) return MSPACK_ERR_ARGS; sys = this->system; if ((fh = sys->open(sys, input, MSPACK_SYS_OPEN_READ))) { szdd.fh = fh; error = szddd_read_headers(sys, fh, (struct msszddd_header *) &szdd); if (error == MSPACK_ERR_OK) { error = szddd_extract(self, (struct msszddd_header *) &szdd, output); } sys->close(fh); } else { error = MSPACK_ERR_OPEN; } return this->error = error; }
/*************************************** * SZDDD_OPEN *************************************** * opens an SZDD file without decompressing, reads header */ static struct msszddd_header *szddd_open(struct msszdd_decompressor *self, char *filename) { struct msszdd_decompressor_p *this = (struct msszdd_decompressor_p *) self; struct msszddd_header_p *szdd = NULL; struct mspack_system *sys; struct mspack_file *fh; int error; if (!this) return NULL; sys = this->system; if ((fh = sys->open(sys, filename, MSPACK_SYS_OPEN_READ))) { if ((szdd = sys->alloc(sys, sizeof(struct msszddd_header_p)))) { szdd->fh = fh; error = szddd_read_headers(sys, fh, (struct msszddd_header *) szdd); if (error) { szddd_close(self, (struct msszddd_header *) szdd); szdd = NULL; } this->error = error; } else { this->error = MSPACK_ERR_NOMEMORY; } sys->close(fh); } else { this->error = MSPACK_ERR_OPEN; } return (struct msszddd_header *) szdd; }
/*************************************** * SZDDD_OPEN *************************************** * opens an SZDD file without decompressing, reads header */ static struct msszddd_header *szddd_open(struct msszdd_decompressor *base, const char *filename) { struct msszdd_decompressor_p *self = (struct msszdd_decompressor_p *) base; struct msszddd_header *hdr; struct mspack_system *sys; struct mspack_file *fh; if (!self) return NULL; sys = self->system; fh = sys->open(sys, filename, MSPACK_SYS_OPEN_READ); hdr = (struct msszddd_header *) sys->alloc(sys, sizeof(struct msszddd_header_p)); if (fh && hdr) { ((struct msszddd_header_p *) hdr)->fh = fh; self->error = szddd_read_headers(sys, fh, hdr); } else { if (!fh) self->error = MSPACK_ERR_OPEN; if (!hdr) self->error = MSPACK_ERR_NOMEMORY; } if (self->error) { if (fh) sys->close(fh); sys->free(hdr); hdr = NULL; } return hdr; }