/*************************************** * MSPACK_DESTROY_CAB_DECOMPRESSOR *************************************** * destructor */ void mspack_destroy_cab_decompressor(struct mscab_decompressor *base) { struct mscab_decompressor_p *this = (struct mscab_decompressor_p *) base; if (this) { struct mspack_system *sys = this->system; cabd_free_decomp(this); if (this->d) { if (this->d->infh) sys->close(this->d->infh); sys->free(this->d); } sys->free(this); } }
void mspack_destroy_cab_decompressor(struct mscab_decompressor *base) { struct mscab_decompressor_p *handle = (struct mscab_decompressor_p *) base; if (handle) { struct mspack_system *sys = handle->system; cabd_free_decomp(handle); if (handle->d) { if (handle->d->infh) sys->close(handle->d->infh); sys->free(handle->d); } sys->free(handle); } }
static int cabd_init_decomp(struct mscab_decompressor_p *handle, unsigned int ct) { struct mspack_file *fh = (struct mspack_file *) handle; if (!handle || !handle->d) { return handle->error = MSPACK_ERR_ARGS; } cabd_free_decomp(handle); handle->d->comp_type = ct; switch (ct & cffoldCOMPTYPE_MASK) { case cffoldCOMPTYPE_MSZIP: handle->d->decompress = (int (*)(void *, off_t)) &mszipd_decompress; handle->d->state = mszipd_init(&handle->d->sys, fh, fh, handle->param[MSCABD_PARAM_DECOMPBUF], handle->param[MSCABD_PARAM_FIXMSZIP]); break; default: return handle->error = MSPACK_ERR_DATAFORMAT; } return handle->error = (handle->d->state) ? MSPACK_ERR_OK : MSPACK_ERR_NOMEMORY; }
/*************************************** * CABD_CLOSE *************************************** * frees all memory associated with a given mscabd_cabinet. */ static void cabd_close(struct mscab_decompressor *base, struct mscabd_cabinet *origcab) { struct mscab_decompressor_p *this = (struct mscab_decompressor_p *) base; struct mscabd_folder_data *dat, *ndat; struct mscabd_cabinet *cab, *ncab; struct mscabd_folder *fol, *nfol; struct mscabd_file *fi, *nfi; struct mspack_system *sys; if (!base) return; sys = this->system; this->error = MSPACK_ERR_OK; while (origcab) { /* free files */ for (fi = origcab->files; fi; fi = nfi) { nfi = fi->next; sys->free(fi->filename); sys->free(fi); } /* free folders */ for (fol = origcab->folders; fol; fol = nfol) { nfol = fol->next; /* free folder decompression state if it has been decompressed */ if (this->d && (this->d->folder == (struct mscabd_folder_p *) fol)) { if (this->d->infh) sys->close(this->d->infh); cabd_free_decomp(this); sys->free(this->d); this->d = NULL; } /* free folder data segments */ for (dat = ((struct mscabd_folder_p *)fol)->data.next; dat; dat = ndat) { ndat = dat->next; sys->free(dat); } sys->free(fol); } /* free predecessor cabinets (and the original cabinet's strings) */ for (cab = origcab; cab; cab = ncab) { ncab = cab->prevcab; sys->free(cab->prevname); sys->free(cab->nextname); sys->free(cab->previnfo); sys->free(cab->nextinfo); if (cab != origcab) sys->free(cab); } /* free successor cabinets */ for (cab = origcab->nextcab; cab; cab = ncab) { ncab = cab->nextcab; sys->free(cab->prevname); sys->free(cab->nextname); sys->free(cab->previnfo); sys->free(cab->nextinfo); sys->free(cab); } /* free actual cabinet structure */ cab = origcab->next; sys->free(origcab); /* repeat full procedure again with the cab->next pointer (if set) */ origcab = cab; } }
static void cabd_close(struct mscab_decompressor *base, struct mscabd_cabinet *origcab) { struct mscab_decompressor_p *handle = (struct mscab_decompressor_p *) base; struct mscabd_folder_data *dat, *ndat; struct mscabd_cabinet *cab, *ncab; struct mscabd_folder *fol, *nfol; struct mscabd_file *fi, *nfi; struct mspack_system *sys; if (!base) return; sys = handle->system; handle->error = MSPACK_ERR_OK; while (origcab) { /* free files */ for (fi = origcab->files; fi; fi = nfi) { nfi = fi->next; sys->free(fi->filename); sys->free(fi); } for (fol = origcab->folders; fol; fol = nfol) { nfol = fol->next; if (handle->d && (handle->d->folder == (struct mscabd_folder_p *) fol)) { if (handle->d->infh) sys->close(handle->d->infh); cabd_free_decomp(handle); sys->free(handle->d); handle->d = NULL; } for (dat = ((struct mscabd_folder_p *)fol)->data.next; dat; dat = ndat) { ndat = dat->next; sys->free(dat); } sys->free(fol); } for (cab = origcab; cab; cab = ncab) { ncab = cab->prevcab; sys->free(cab->prevname); sys->free(cab->nextname); sys->free(cab->previnfo); sys->free(cab->nextinfo); if (cab != origcab) sys->free(cab); } for (cab = origcab->nextcab; cab; cab = ncab) { ncab = cab->nextcab; sys->free(cab->prevname); sys->free(cab->nextname); sys->free(cab->previnfo); sys->free(cab->nextinfo); sys->free(cab); } cab = origcab->next; sys->free(origcab); origcab = cab; } }