static uchar* unsqzseg(int fd, uchar *wp, long ns, ulong top) { Squeeze sq3, sq4; if(ns == 0) return wp; if(rdtab(fd, &sq3, 0) < 0) return nil; if(rdtab(fd, &sq4, 8) < 0) return nil; fprint(2, "tables: %d %d\n", sq3.n, sq4.n); if(read(fd, bigb, ns) != ns) return nil; return unsqueeze(wp, bigb, bigb+ns, &sq3, &sq4, top); }
dsk_err_t sq_open(COMPRESS_DATA *self) { SQ_COMPRESS_DATA *sq_self; dsk_err_t err; unsigned short magic; /* Sanity check: Is this meant for our driver? */ if (self->cd_class != &cc_sq) return DSK_ERR_BADPTR; sq_self = (SQ_COMPRESS_DATA *)self; sq_self->sq_truename = NULL; sq_self->fp_in = NULL; sq_self->fp_out = NULL; /* Open the file to decompress */ err = comp_fopen(self, &sq_self->fp_in); if (err) return DSK_ERR_NOTME; /* Check for SQ signature */ err = readu(sq_self, &magic); if (err) /* v1.1.11 Don't leak file handles */ { fclose(sq_self->fp_in); return err; } if (magic != MAGIC) { fclose(sq_self->fp_in); return DSK_ERR_NOTME; } /* OK. This is a Squeezed file. Decompress it. */ rewind(sq_self->fp_in); err = comp_mktemp(self, &sq_self->fp_out); if (!err) err = unsqueeze(sq_self); fclose(sq_self->fp_in); if (sq_self->fp_out) fclose(sq_self->fp_out); if (err && sq_self->sq_truename) free(sq_self->sq_truename); return err; }