00001 #include <stdio.h>
00002 #include <string.h>
00003 #include "ztxt.h"
00004 #include "my_list.h"
00005 #include "Bkmks.h"
00006
00007 ztxt::ztxt() : bInit(false), expandedtextbuffer(NULL), compressedtextbuffer(NULL) { }
00008
00009
00010 int ztxt::OpenFile(const char *src)
00011 {
00012 if (!Cpdb::openpdbfile(src))
00013 {
00014 return -1;
00015 }
00016
00017
00018
00019 if (head.type != ZTXT_ID) return -1;
00020
00021 gotorecordnumber(0);
00022 fread(&hdr0, 1, sizeof(hdr0), fin);
00023
00024 buffersize = ntohl(hdr0.size);
00025 compressedtextbuffer = new UInt8[buffersize];
00026 expandedtextbuffer = new UInt8[buffersize];
00027
00028
00029 home();
00030
00031
00032
00033
00034 return 0;
00035 }
00036
00037 int ztxt::getch()
00038 {
00039 if (bufferpos >= buffercontent)
00040 {
00041 size_t reclen = recordlength(++bufferrec);
00042 if (reclen == 0) return -1;
00043 gotorecordnumber(bufferrec);
00044 fread(compressedtextbuffer, reclen, sizeof(char), fin);
00045
00046 zstream.next_in = compressedtextbuffer;
00047 zstream.next_out = expandedtextbuffer;
00048 zstream.avail_out = buffersize;
00049 zstream.avail_in = reclen;
00050
00051 int ret = inflate(&zstream, Z_SYNC_FLUSH);
00052 buffercontent = buffersize - zstream.avail_out;
00053 bufferpos = 0;
00054
00055 }
00056 currentpos++;
00057 return expandedtextbuffer[bufferpos++];
00058 }
00059
00060 unsigned int ztxt::locate()
00061 {
00062 return currentpos;
00063 }
00064
00065 void ztxt::locate(unsigned int n)
00066 {
00067
00068 if (hasrandomaccess())
00069 {
00070 unsuspend();
00071 bufferrec = n / ntohs(hdr0.recordSize) + 1;
00072 if (bufferrec == 1)
00073 {
00074 inflateEnd(&zstream);
00075 }
00076 size_t reclen = recordlength(bufferrec);
00077 if (reclen == 0) return;
00078 gotorecordnumber(bufferrec);
00079 fread(compressedtextbuffer, reclen, sizeof(char), fin);
00080
00081 zstream.next_in = compressedtextbuffer;
00082 zstream.next_out = expandedtextbuffer;
00083 zstream.avail_out = buffersize;
00084 zstream.avail_in = reclen;
00085
00086 if (bufferrec == 1)
00087 {
00088 zstream.zalloc = Z_NULL;
00089 zstream.zfree = Z_NULL;
00090 zstream.opaque = Z_NULL;
00091
00092 inflateInit(&zstream);
00093 }
00094
00095
00096 int ret = inflate(&zstream, Z_SYNC_FLUSH);
00097 buffercontent = buffersize - zstream.avail_out;
00098 bufferpos = 0;
00099 currentpos = n - n % ntohs(hdr0.recordSize);
00100 while (currentpos < n) getch();
00101 }
00102 else
00103 {
00104 home();
00105 while (currentpos < n && getch() != EOF);
00106 }
00107 }
00108
00109 void ztxt::home()
00110 {
00111 unsuspend();
00112 if (bInit)
00113 {
00114 inflateEnd(&zstream);
00115 }
00116 bInit = true;
00117 size_t reclen = recordlength(1);
00118 gotorecordnumber(1);
00119 fread(compressedtextbuffer, reclen, sizeof(char), fin);
00120
00121 zstream.next_in = compressedtextbuffer;
00122 zstream.next_out = expandedtextbuffer;
00123 zstream.avail_out = buffersize;
00124 zstream.avail_in = reclen;
00125
00126 zstream.zalloc = Z_NULL;
00127 zstream.zfree = Z_NULL;
00128 zstream.opaque = Z_NULL;
00129
00130
00131
00132 inflateInit(&zstream);
00133
00134 int ret = inflate(&zstream, Z_SYNC_FLUSH);
00135
00136 bufferpos = 0;
00137 bufferrec = 1;
00138 currentpos = 0;
00139 buffercontent = buffersize - zstream.avail_out;
00140
00141 }
00142
00143 CList<Bkmk>* ztxt::getbkmklist()
00144 {
00145 UInt16 recno = ntohs(hdr0.bookmarkRecord);
00146
00147
00148
00149 if (recno == 0) return NULL;
00150
00151 CList<Bkmk>* t = new CList<Bkmk>;
00152 unsuspend();
00153 size_t cur = ftell(fin);
00154 gotorecordnumber(recno);
00155 for (int i = 0; i < ntohs(hdr0.numBookmarks); i++)
00156 {
00157 zTXTbkmk bkmk;
00158 if (fread(&bkmk, sizeof(bkmk), 1, fin) != 1) break;
00159
00160 tchar title[MAX_BMRK_LENGTH];
00161 for (int j = 0; j < MAX_BMRK_LENGTH; j++)
00162 {
00163 title[j] = bkmk.title[j];
00164 }
00165 t->push_back(Bkmk(title, NULL, ntohl(bkmk.offset)));
00166 }
00167 fseek(fin, cur, SEEK_SET);
00168 return t;
00169 }
00170
00171 #ifndef __STATIC
00172 extern "C"
00173 {
00174 CExpander* newcodec() { return new ztxt; }
00175 }
00176 #endif