author | llornkcor <llornkcor> | 2002-07-01 23:24:08 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-07-01 23:24:08 (UTC) |
commit | 59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2 (patch) (side-by-side diff) | |
tree | f148d4858859dac3b413e675c760acfdab24b8e6 /noncore/apps/opie-reader/ztxt.cpp | |
parent | c08be8ae22dcc1bfb83cfdec807149b161d770f5 (diff) | |
download | opie-59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2.zip opie-59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2.tar.gz opie-59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2.tar.bz2 |
initial
Diffstat (limited to 'noncore/apps/opie-reader/ztxt.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/ztxt.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/noncore/apps/opie-reader/ztxt.cpp b/noncore/apps/opie-reader/ztxt.cpp new file mode 100644 index 0000000..c30e4fd --- a/dev/null +++ b/noncore/apps/opie-reader/ztxt.cpp @@ -0,0 +1,159 @@ +#include <stdio.h> +#include <string.h> +#include "ztxt.h" + +ztxt::ztxt() : bInit(false), expandedtextbuffer(NULL), compressedtextbuffer(NULL) { /*printf("constructing:%x\n",fin);*/ } + + +int ztxt::openfile(const char *src) +{ + if (!Cpdb::openfile(src)) + { + return -1; + } + +//printf("Okay %u\n", 4); + + if (head.type != ZTXT_ID) return -1; + + gotorecordnumber(0); + fread(&hdr0, 1, sizeof(hdr0), fin); +//printf("Okay %u\n", 5); + buffersize = ntohl(hdr0.size); + compressedtextbuffer = new UInt8[buffersize]; + expandedtextbuffer = new UInt8[buffersize]; +//printf("Okay %u\n", 6); + + home(); +//printf("Okay %u\n", 7); + +// printf("Returning 0\n"); + + return 0; +} + +int ztxt::getch() +{ + if (bufferpos >= buffercontent) + { + size_t reclen = recordlength(++bufferrec); + if (reclen == 0) return -1; + gotorecordnumber(bufferrec); + fread(compressedtextbuffer, reclen, sizeof(char), fin); + + zstream.next_in = compressedtextbuffer; + zstream.next_out = expandedtextbuffer; + zstream.avail_out = buffersize; + zstream.avail_in = reclen; + + int ret = inflate(&zstream, Z_SYNC_FLUSH); + buffercontent = buffersize - zstream.avail_out; + bufferpos = 0; + + } + currentpos++; + return expandedtextbuffer[bufferpos++]; +} + +unsigned int ztxt::locate() +{ + return currentpos; +} + +void ztxt::locate(unsigned int n) +{ + + if (hasrandomaccess()) + { + bufferrec = n / ntohs(hdr0.recordSize) + 1; + if (bufferrec == 1) + { + inflateEnd(&zstream); + } + size_t reclen = recordlength(bufferrec); + if (reclen == 0) return; + gotorecordnumber(bufferrec); + fread(compressedtextbuffer, reclen, sizeof(char), fin); + + zstream.next_in = compressedtextbuffer; + zstream.next_out = expandedtextbuffer; + zstream.avail_out = buffersize; + zstream.avail_in = reclen; + + if (bufferrec == 1) + { + zstream.zalloc = Z_NULL; + zstream.zfree = Z_NULL; + zstream.opaque = Z_NULL; + + inflateInit(&zstream); + } + + + int ret = inflate(&zstream, Z_SYNC_FLUSH); + buffercontent = buffersize - zstream.avail_out; + bufferpos = 0; + currentpos = n - n % ntohs(hdr0.recordSize); + while (currentpos < n) getch(); + } + else + { + home(); + while (currentpos < n && getch() != EOF); + } +} + +void ztxt::home() +{ + if (bInit) + { + inflateEnd(&zstream); + } + bInit = true; + size_t reclen = recordlength(1); + gotorecordnumber(1); + fread(compressedtextbuffer, reclen, sizeof(char), fin); + + zstream.next_in = compressedtextbuffer; + zstream.next_out = expandedtextbuffer; + zstream.avail_out = buffersize; + zstream.avail_in = reclen; + + zstream.zalloc = Z_NULL; + zstream.zfree = Z_NULL; + zstream.opaque = Z_NULL; + +// printf("Initialising\n"); + + inflateInit(&zstream); + + int ret = inflate(&zstream, Z_SYNC_FLUSH); +// printf("Inflate : %d\n", ret); + bufferpos = 0; + bufferrec = 1; + currentpos = 0; + buffercontent = buffersize - zstream.avail_out; +// printf("buffercontent:%u\n", buffercontent); +} + +CList<Bkmk>* ztxt::getbkmklist() +{ + UInt16 recno = ntohs(hdr0.bookmarkRecord); + +// printf("Bookmarks - record %d contains %d\n", recno, ntohs(hdr0.numBookmarks)); + + if (recno == 0) return NULL; + + CList<Bkmk>* t = new CList<Bkmk>; + size_t cur = ftell(fin); + gotorecordnumber(recno); + for (int i = 0; i < ntohs(hdr0.numBookmarks); i++) + { + zTXTbkmk bkmk; + if (fread(&bkmk, sizeof(bkmk), 1, fin) != 1) break; +// printf("Bookmark number:%d:%.20s\n", i, bkmk.title); + t->push_back(Bkmk(bkmk.title, ntohl(bkmk.offset))); + } + fseek(fin, cur, SEEK_SET); + return t; +} |