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) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-reader/iSilo.cpp17
1 files changed, 9 insertions, 8 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
@@ -1,52 +1,52 @@
#include "iSilo.h"
-#ifdef _WINDOWS
-#include <winsock.h>
-#endif
+#ifdef _WINDOWS
+#include <winsock.h>
+#endif
u_int8_t *rodata = (u_int8_t *)
"\x10\x11\x12\x00\x08\x07\x09\x06\x0a\x05\x0b\x04\x0c\x03\x0d\x02\x0e\x01\x0f";
u_int16_t *rsize_min = (u_int16_t *)
"\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0d"
"\x00\x0f\x00\x11\x00\x13\x00\x17\x00\x1b\x00\x1f\x00\x23\x00\x2b\x00\x33\x00"
"\x3b\x00\x43\x00\x53\x00\x63\x00\x73\x00\x83\x00\xa3\x00\xc3\x00\xe3\x00\x02"
"\x01";
u_int8_t *rsize_delta = (u_int8_t *)
"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x02\x02\x02\x02\x03\x03\x03"
"\x03\x04\x04\x04\x04\x05\x05\x05\x05\x00";
u_int16_t *rpos_min = (u_int16_t *)
"\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x07\x00\x09\x00\x0d\x00\x11\x00\x19"
"\x00\x21\x00\x31\x00\x41\x00\x61\x00\x81\x00\xc1\x00\x01\x01\x81\x01\x01\x02"
"\x01\x03\x01\x04\x01\x06\x01\x08\x01\x0c\x01\x10\x01\x18\x01\x20\x01\x30\x01"
"\x40\x01\x60";
u_int8_t *rpos_delta = (u_int8_t *)
"\x00\x00\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07"
"\x08\x08\x09\x09\x0a\x0a\x0b\x0b\x0c\x0c\x0d\x0d";
void iSilo::init_tables(void)
{
int i;
u_int16_t j;
return;
for (i = 0; i < 3; i++)
rodata[i] = 0x10 + i;
rodata[3] = 0;
for (i = 4; i < 19; i = i + 2)
rodata[i] = 8 + (i-4)/2;
for (i = 5; i < 19; i = i + 2)
rodata[i] = 7 - (i-5)/2;
memset(rsize_delta, 0, 29);
for (i = 4; i < 29; i++) {
rsize_delta[i] = (i - 4) >> 2;
}
memset(rpos_delta, 0, 30);
for (i = 2; i < 30; i++) {
rpos_delta[i] = (i - 2) >> 1;
}
j = 3;
for (i = 0; i < 29; i++) {
rsize_min[i] = j;
j += 1 << rsize_delta[i];
@@ -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;
@@ -516,102 +517,102 @@ int iSilo::OpenFile(const char* src)
return -1;
}
if (head.creator != 0x6F476F54 // 'ToGo'
|| head.type != 0x6F476F54) // 'ToGo')
{
return -1;
}
qDebug("There is %u records in this PDB file", ntohs(head.recordList.numRecords));
init_tables();
gotorecordnumber(0);
fread(buffer,1,12,fin);
fread(&textsize, sizeof(textsize), 1, fin);
textsize = ntohl(textsize);
fread(buffer,1,4,fin);
fread(&attr_start,sizeof(attr_start),1,fin);
attr_start = ntohs(attr_start);
fread(buffer,1,2,fin);
fread(&attr_end,sizeof(attr_end),1,fin);
attr_end = ntohs(attr_end);
attr_rec = attr_start;
attr = NULL;
pos_hi = 0xffff;
last_pos = 0xffff;
last_value = 0xffff;
read_attr();
return 0;
}
void iSilo::read_attr()
{
// qDebug("read_attr:<%u, %u, %u>", attr_rec, attr_start, attr_end);
current_attr = 0;
if (attr != NULL)
{
delete [] attr;
attr = NULL;
}
if (attr_rec >= attr_start && attr_rec < attr_end)
{
gotorecordnumber(attr_rec);
fread(buffer, 1, 4, fin);
fread(&attr_num, sizeof(attr_num), 1, fin);
attr_num = ntohs(attr_num)+1;
attr = new s_attrib[attr_num];
for (int j = 0; j < attr_num; j++)
{
fread(&attr[j].offset, 2, 1, fin);
attr[j].offset = htons(attr[j].offset);
- }
+ }
#ifdef _WINDOWS
- for (j = 0; j < attr_num; j++)
-#else
- for (int j = 0; j < attr_num; j++)
-#endif
+ for (j = 0; j < attr_num; j++)
+#else
+ for (int j = 0; j < attr_num; j++)
+#endif
{
fread(&attr[j].value, 2, 1, fin);
if (attr[j].offset < last_pos)
{
pos_hi++;
}
if ((attr[j].offset == last_pos) && (attr[j].value == last_value))
{
pos_hi++;
}
last_pos = attr[j].offset;
attr[j].offset |= ((u_int32_t)pos_hi) << 16;
last_value = attr[j].value;
}
current_attr = 0;
// last_value = attr[attr_num-1].value;
// qDebug("Next attr:%u (%u)", attr[current_attr].offset, filepos);
// qDebug("Next attr:%x (%x)", attr[current_attr].offset, filepos);
}
}
void iSilo::locate(unsigned int n)
{
// qDebug("Locating %u", n);
if (n >= textsize) n = 0;
pos = 0;
buffer_size = 4096;
current_pos = 0;
bsize = 0;
/* Brute force
cur_rec = 0;
filepos = 0;
*/ // Fast
filepos = n - n % (8*buffer_size);
cur_rec = 9*(n/(8*buffer_size));
// End of fast
pos_hi = 0xffff;
last_pos = 0xffff;
last_value = 0xffff;
attr_rec = attr_start;
read_attr();
// While loop added for fast locate
while (attr != NULL && attr[attr_num-1].offset < filepos)
{
attr_rec++;
read_attr();