Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ztxt.cpp

Go to the documentation of this file.
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) { /*printf("constructing:%x\n",fin);*/ }
00008 
00009 
00010 int ztxt::OpenFile(const char *src)
00011 {
00012     if (!Cpdb::openpdbfile(src))
00013     {
00014         return -1;
00015     }
00016 
00017 //printf("Okay %u\n", 4);
00018 
00019     if (head.type != ZTXT_ID) return -1;
00020 
00021     gotorecordnumber(0);
00022     fread(&hdr0, 1, sizeof(hdr0), fin);
00023 //printf("Okay %u\n", 5);
00024     buffersize = ntohl(hdr0.size);
00025     compressedtextbuffer = new UInt8[buffersize];
00026     expandedtextbuffer = new UInt8[buffersize];
00027 //printf("Okay %u\n", 6);
00028 
00029     home();
00030 //printf("Okay %u\n", 7);
00031 
00032 //  printf("Returning 0\n");
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 //  printf("Initialising\n");
00131   
00132     inflateInit(&zstream);
00133 
00134     int ret = inflate(&zstream, Z_SYNC_FLUSH);
00135 //  printf("Inflate : %d\n", ret);
00136     bufferpos = 0;
00137     bufferrec = 1;
00138     currentpos = 0;
00139     buffercontent = buffersize - zstream.avail_out;
00140 //      printf("buffercontent:%u\n", buffercontent);
00141 }
00142 
00143 CList<Bkmk>* ztxt::getbkmklist()
00144 {
00145   UInt16 recno = ntohs(hdr0.bookmarkRecord);
00146 
00147 //  printf("Bookmarks - record %d contains %d\n", recno, ntohs(hdr0.numBookmarks));
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 //      printf("Bookmark number:%d:%.20s\n", i, bkmk.title);
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

Generated on Sat Nov 5 16:16:59 2005 for OPIE by  doxygen 1.4.2