Lines Matching defs:unpackd
99 unpack_descriptor_fini(unpack_descriptor_t *unpackd)
102 free(unpackd->symbolsin);
103 free(unpackd->inodesin);
104 free(unpackd->symbol);
105 free(unpackd->tree);
107 fclose(unpackd->fpIn);
108 fclose(unpackd->fpOut);
115 unpackd_fill_inodesin(const unpack_descriptor_t *unpackd, int level)
123 if (level < unpackd->treelevels) {
124 unpackd_fill_inodesin(unpackd, level + 1);
125 unpackd->inodesin[level] = (unpackd->inodesin[level + 1] +
126 unpackd->symbolsin[level + 1]) / 2;
128 unpackd->inodesin[level] = 0;
150 unpack_descriptor_t *unpackd)
169 unpackd->uncompressed_size = 0;
171 unpackd->uncompressed_size <<= 8;
172 unpackd->uncompressed_size |= hdr[i];
176 unpackd->treelevels = hdr[6];
177 if (unpackd->treelevels > HTREE_MAXLEVEL || unpackd->treelevels < 1)
181 if ((unpackd->fpIn = fdopen(in, "r")) == NULL)
183 if ((unpackd->fpOut = fdopen(out, "w")) == NULL)
187 unpackd->inodesin =
188 calloc(unpackd->treelevels, sizeof(*(unpackd->inodesin)));
189 unpackd->symbolsin =
190 calloc(unpackd->treelevels, sizeof(*(unpackd->symbolsin)));
191 unpackd->tree =
192 calloc(unpackd->treelevels, (sizeof (*(unpackd->tree))));
193 if (unpackd->inodesin == NULL || unpackd->symbolsin == NULL ||
194 unpackd->tree == NULL)
198 unpackd->treelevels--;
201 unpackd->symbol_size = 1; /* EOB */
202 for (i = 0; i <= unpackd->treelevels; i++) {
203 if ((thisbyte = fgetc(unpackd->fpIn)) == EOF)
205 unpackd->symbolsin[i] = (unsigned char)thisbyte;
206 unpackd->symbol_size += unpackd->symbolsin[i];
208 accepted_bytes(bytes_in, unpackd->treelevels);
209 if (unpackd->symbol_size > 256)
211 infile_newdata(unpackd->treelevels);
214 unpackd->symbol_eob = unpackd->symbol = calloc(1, unpackd->symbol_size);
215 if (unpackd->symbol == NULL)
227 unpackd->symbolsin[unpackd->treelevels]++;
228 for (i = 0; i <= unpackd->treelevels; i++) {
229 unpackd->tree[i] = unpackd->symbol_eob;
230 for (j = 0; j < unpackd->symbolsin[i]; j++) {
231 if ((thisbyte = fgetc(unpackd->fpIn)) == EOF)
233 *unpackd->symbol_eob++ = (char)thisbyte;
235 infile_newdata(unpackd->symbolsin[i]);
236 accepted_bytes(bytes_in, unpackd->symbolsin[i]);
240 unpackd->symbolsin[unpackd->treelevels]++;
246 unpackd_fill_inodesin(unpackd, 0);
253 unpack_decode(const unpack_descriptor_t *unpackd, off_t *bytes_in)
271 while ((thisbyte = fgetc(unpackd->fpIn)) != EOF) {
285 if (thiscode >= unpackd->inodesin[thislevel]) {
287 thiscode - unpackd->inodesin[thislevel];
288 if (inlevelindex > unpackd->symbolsin[thislevel])
292 &(unpackd->tree[thislevel][inlevelindex]);
293 if ((thissymbol == unpackd->symbol_eob) &&
294 (bytes_out == unpackd->uncompressed_size))
297 fputc((*thissymbol), unpackd->fpOut);
304 if (thislevel > unpackd->treelevels)
311 if (bytes_out != unpackd->uncompressed_size)
319 unpack_descriptor_t unpackd;
321 unpack_parse_header(dup(in), dup(out), pre, prelen, bytes_in, &unpackd);
322 unpack_decode(&unpackd, bytes_in);
323 unpack_descriptor_fini(&unpackd);
326 return (unpackd.uncompressed_size);