summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/iSilo.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/opie-reader/iSilo.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-reader/iSilo.cpp1
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;