Diffstat (limited to 'noncore/apps/opie-reader/iSilo.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/iSilo.cpp | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/noncore/apps/opie-reader/iSilo.cpp b/noncore/apps/opie-reader/iSilo.cpp index 5f14b96..1f727fe 100644 --- a/noncore/apps/opie-reader/iSilo.cpp +++ b/noncore/apps/opie-reader/iSilo.cpp @@ -249,96 +249,97 @@ int iSilo::read_tree(struct s_huffman *prev, struct s_huffman *curr) { } bool iSilo::reset_trees() { get_bits(0); /* flush buffer */ /* This is a Table record so we reload the tables */ kill_huffman(lz); kill_huffman(text); kill_huffman(master); master = huffman_create(19); text = huffman_create(get_swapped(5) + 257); lz = huffman_create(get_swapped(5) + 1); int rdmax = get_swapped(4) + 4; for (int i = 0; i < rdmax; i++) { master->size[rodata[i]] = get_swapped(3); } if (size2code(master) == -1) { qDebug("size2code(master) error: size-table is incompatible"); return false; } code2tree(master); if (read_tree(master, text) == -1) { qDebug("read_tree() failed (format incorrect?)"); return false; } if (read_tree(master, lz) == -1) { qDebug("read_tree() failed (format incorrect?)"); return false;; } return true; } u_int32_t iSilo::get_bits(int num) { int i, r; u_int32_t result = 0; if (num == 0) { pos = 0; return(0); } for (i = 0; i < num; i++) { if (pos == 0) { + unsuspend(); r = fread(buf, sizeof(u_int32_t), 256, fin); if (r <= 0) { qDebug("ERROR: Unexpected end of file"); exit(-1); /* FIXME */ } pos = 32*256; } pos--; result <<= 1; result |= (ntohl(buf[255 - (pos/32)]) >> (31-(pos % 32))) & 1; } return(result); } u_int32_t iSilo::get_swapped(int num) { return(swap_bits(get_bits(num),num)); } int iSilo::read_text() { u_int32_t *j; u_int32_t k, l, bp, idx; for (bp = 0; bp < buffer_size;) { j = huffman_get(text); if (j == NULL) return(-1); if (*j == 256) { break; } if (*j >= 257) { idx = *j - 257; k = rsize_min[idx]; if (rsize_delta[idx] != 0) { k += get_swapped(rsize_delta[idx]); } j = huffman_get(lz); if (j == NULL) return(-1); l = rpos_min[*j]; if (rpos_delta[*j] != 0) { l += get_swapped(rpos_delta[*j]); } if (k <= l) { memcpy(buffer + bp, buffer + bp - l, k); } else { mymemcpy(buffer + bp, buffer + bp - l, k); } bp += k; } else { buffer[bp] = *j; |