/* See if a file can be decompressed */ static dsk_err_t comp_iopen(COMPRESS_DATA **cd, const char *filename, int nc) { COMPRESS_CLASS *cc = classes[nc]; dsk_err_t err; if (!cc) return DSK_ERR_BADPTR; (*cd) = dsk_malloc(cc->cc_selfsize); if (!*cd) return DSK_ERR_NOMEM; memset((*cd), 0, cc->cc_selfsize); err = comp_construct(*cd, filename); (*cd)->cd_class = cc; if (err == DSK_ERR_OK) { char *s = dsk_malloc(strlen(cc->cc_description) + 50); if (s) { sprintf(s, "Checking compression: %s...", cc->cc_description); dsk_report(s); dsk_free(s); } else dsk_report("Checking compression..."); err = (cc->cc_open)(*cd); dsk_report_end(); } if (err == DSK_ERR_OK) return err; comp_free (*cd); *cd = NULL; return err; }
dsk_err_t comp_abort(COMPRESS_DATA **self) { dsk_err_t e; if (!self || (!(*self)) || (!(*self)->cd_class)) return DSK_ERR_BADPTR; e = ((*self)->cd_class->cc_abort)(*self); if ((*self)->cd_ufilename) remove((*self)->cd_ufilename); comp_free (*self); *self = NULL; return e; }
dsk_err_t comp_commit(COMPRESS_DATA **self) { dsk_err_t e; if (!self || (!(*self)) || (!(*self)->cd_class)) return DSK_ERR_BADPTR; dsk_report("Compressing..."); e = ((*self)->cd_class->cc_commit)(*self); dsk_report_end(); if ((*self)->cd_ufilename) remove((*self)->cd_ufilename); comp_free (*self); *self = NULL; return e; }
/* See if a file can be decompressed */ static dsk_err_t comp_icreat(COMPRESS_DATA **cd, const char *filename, int nc) { COMPRESS_CLASS *cc = classes[nc]; dsk_err_t err; FILE *fp; if (!cc) return DSK_ERR_BADPTR; (*cd) = dsk_malloc(cc->cc_selfsize); if (!*cd) return DSK_ERR_NOMEM; memset((*cd), 0, cc->cc_selfsize); err = comp_construct(*cd, filename); (*cd)->cd_class = cc; if (err == DSK_ERR_OK) err = (cc->cc_creat)(*cd); /* Stake out our claim to the temporary file. */ if (err == DSK_ERR_OK) err = comp_mktemp(*cd, &fp); if (fp) fclose(fp); if (err == DSK_ERR_OK) return err; comp_free (*cd); *cd = NULL; return err; }
static void comp_free__(void *__comp) { comp_type *comp = (comp_type *) __comp; comp_free(comp); }