diff options
author | Roberto C. Sanchez <roberto@connexer.com> | 2014-03-29 10:53:52 -0400 |
---|---|---|
committer | Roberto C. Sanchez <roberto@connexer.com> | 2014-03-29 10:53:52 -0400 |
commit | 148bd343f3e7e32d141f66b5b5c9b98b2975b0b3 (patch) | |
tree | 31078963b85110d57310759016e60e8d26ccb1e6 /src/modules/common/zverse.cpp | |
parent | 8c8aa6b07e595cfac56838b5964ab3e96051f1b2 (diff) |
Imported Upstream version 1.5.8
Diffstat (limited to 'src/modules/common/zverse.cpp')
-rw-r--r-- | src/modules/common/zverse.cpp | 538 |
1 files changed, 0 insertions, 538 deletions
diff --git a/src/modules/common/zverse.cpp b/src/modules/common/zverse.cpp deleted file mode 100644 index 1f7f25d..0000000 --- a/src/modules/common/zverse.cpp +++ /dev/null @@ -1,538 +0,0 @@ -/****************************************************************************** - * zverse.h - code for class 'zVerse'- a module that reads raw text - * files: ot and nt using indexs ??.bks ??.cps ??.vss - * and provides lookup and parsing functions based on - * class VerseKey for compressed modules - */ - - -#include <ctype.h> -#include <stdio.h> -#include <fcntl.h> -#include <errno.h> -#include <stdlib.h> - -#ifndef __GNUC__ -#include <io.h> -#else -#include <unistd.h> -#endif - -#include <utilfuns.h> -#include <versekey.h> -#include <zverse.h> -#include <sysdata.h> -#include <swbuf.h> - - -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -SWORD_NAMESPACE_START - -/****************************************************************************** - * zVerse Statics - */ - -int zVerse::instance = 0; - -const char zVerse::uniqueIndexID[] = {'X', 'r', 'v', 'c', 'b'}; - -/****************************************************************************** - * zVerse Constructor - Initializes data for instance of zVerse - * - * ENT: ipath - path of the directory where data and index files are located. - * be sure to include the trailing separator (e.g. '/' or '\') - * (e.g. 'modules/texts/rawtext/webster/') - * fileMode - open mode for the files (O_RDONLY, etc.) - * blockType - verse, chapter, book, etc. - */ - -zVerse::zVerse(const char *ipath, int fileMode, int blockType, SWCompress *icomp) -{ - char buf[127]; - - nl = '\n'; - path = 0; - cacheBufIdx = -1; - cacheTestament = 0; - cacheBuf = 0; - dirtyCache = false; - stdstr(&path, ipath); - - if ((path[strlen(path)-1] == '/') || (path[strlen(path)-1] == '\\')) - path[strlen(path)-1] = 0; - - compressor = (icomp) ? icomp : new SWCompress(); - - if (fileMode == -1) { // try read/write if possible - fileMode = O_RDWR; - } - - sprintf(buf, "%s/ot.%czs", path, uniqueIndexID[blockType]); - idxfp[0] = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, true); - - sprintf(buf, "%s/nt.%czs", path, uniqueIndexID[blockType]); - idxfp[1] = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, true); - - sprintf(buf, "%s/ot.%czz", path, uniqueIndexID[blockType]); - textfp[0] = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, true); - - sprintf(buf, "%s/nt.%czz", path, uniqueIndexID[blockType]); - textfp[1] = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, true); - - sprintf(buf, "%s/ot.%czv", path, uniqueIndexID[blockType]); - compfp[0] = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, true); - - sprintf(buf, "%s/nt.%czv", path, uniqueIndexID[blockType]); - compfp[1] = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, true); - - instance++; -} - - -/****************************************************************************** - * zVerse Destructor - Cleans up instance of zVerse - */ - -zVerse::~zVerse() -{ - int loop1; - - if (cacheBuf) { - flushCache(); - free(cacheBuf); - } - - if (path) - delete [] path; - - if (compressor) - delete compressor; - - --instance; - - for (loop1 = 0; loop1 < 2; loop1++) { - FileMgr::systemFileMgr.close(idxfp[loop1]); - FileMgr::systemFileMgr.close(textfp[loop1]); - FileMgr::systemFileMgr.close(compfp[loop1]); - } -} - - -/****************************************************************************** - * zVerse::findoffset - Finds the offset of the key verse from the indexes - * - * - * - * ENT: testmt - testament to find (0 - Bible/module introduction) - * book - book to find (0 - testament introduction) - * chapter - chapter to find (0 - book introduction) - * verse - verse to find (0 - chapter introduction) - * start - address to store the starting offset - * size - address to store the size of the entry - */ - -void zVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *size) -{ - // set start to offset in - // set size to - // set - unsigned long ulBuffNum=0; // buffer number - unsigned long ulVerseStart=0; // verse offset within buffer - unsigned short usVerseSize=0; // verse size - unsigned long ulCompOffset=0; // compressed buffer start - unsigned long ulCompSize=0; // buffer size compressed - unsigned long ulUnCompSize=0; // buffer size uncompressed - char *pcCompText=NULL; // compressed text - - *start = *size = 0; - //printf ("Finding offset %ld\n", idxoff); - idxoff *= 10; - if (!testmt) { - testmt = ((idxfp[0]) ? 1:2); - } - - // assert we have and valid file descriptor - if (compfp[testmt-1]->getFd() < 1) - return; - - long newOffset = lseek(compfp[testmt-1]->getFd(), idxoff, SEEK_SET); - if (newOffset == idxoff) { - if (read(compfp[testmt-1]->getFd(), &ulBuffNum, 4) != 4) { - printf ("Error reading ulBuffNum\n"); - return; - } - } - else return; - - ulBuffNum = swordtoarch32(ulBuffNum); - - if (read(compfp[testmt-1]->getFd(), &ulVerseStart, 4) < 2) - { - printf ("Error reading ulVerseStart\n"); - return; - } - if (read(compfp[testmt-1]->getFd(), &usVerseSize, 2) < 2) - { - printf ("Error reading usVerseSize\n"); - return; - } - - *start = swordtoarch32(ulVerseStart); - *size = swordtoarch16(usVerseSize); - - if (*size) { - if (((long) ulBuffNum == cacheBufIdx) && (testmt == cacheTestament) && (cacheBuf)) { - // have the text buffered - return; - } - - //printf ("Got buffer number{%ld} versestart{%ld} versesize{%d}\n", ulBuffNum, ulVerseStart, usVerseSize); - - - if (lseek(idxfp[testmt-1]->getFd(), ulBuffNum*12, SEEK_SET)!=(long) ulBuffNum*12) - { - printf ("Error seeking compressed file index\n"); - return; - } - if (read(idxfp[testmt-1]->getFd(), &ulCompOffset, 4)<4) - { - printf ("Error reading ulCompOffset\n"); - return; - } - if (read(idxfp[testmt-1]->getFd(), &ulCompSize, 4)<4) - { - printf ("Error reading ulCompSize\n"); - return; - } - if (read(idxfp[testmt-1]->getFd(), &ulUnCompSize, 4)<4) - { - printf ("Error reading ulUnCompSize\n"); - return; - } - - ulCompOffset = swordtoarch32(ulCompOffset); - ulCompSize = swordtoarch32(ulCompSize); - ulUnCompSize = swordtoarch32(ulUnCompSize); - - if (lseek(textfp[testmt-1]->getFd(), ulCompOffset, SEEK_SET)!=(long)ulCompOffset) - { - printf ("Error: could not seek to right place in compressed text\n"); - return; - } - SWBuf pcCompText; - pcCompText.setSize(ulCompSize+5); - - if (read(textfp[testmt-1]->getFd(), pcCompText.getRawData(), ulCompSize)<(long)ulCompSize) { - printf ("Error reading compressed text\n"); - return; - } - pcCompText.setSize(ulCompSize); - rawZFilter(pcCompText, 0); // 0 = decipher - - compressor->zBuf(&ulCompSize, pcCompText.getRawData()); - - if (cacheBuf) { - flushCache(); - free(cacheBuf); - } - - unsigned long len = 0; - compressor->Buf(0, &len); - cacheBuf = (char *)calloc(len + 1, 1); - memcpy(cacheBuf, compressor->Buf(), len); - - cacheTestament = testmt; - cacheBufIdx = ulBuffNum; - } -} - - -/****************************************************************************** - * zVerse::zreadtext - gets text at a given offset - * - * ENT: testmt - testament file to search in (0 - Old; 1 - New) - * start - starting offset where the text is located in the file - * size - size of text entry + 1 (null) - * buf - buffer to store text - * - */ - -void zVerse::zReadText(char testmt, long start, unsigned short size, SWBuf &inBuf) { - inBuf = ""; - inBuf.setFillByte(0); - inBuf.setSize(size+1); - if (size > 0) { - if (cacheBuf) - strncpy(inBuf.getRawData(), &(cacheBuf[start]), size); - } - inBuf.setSize(strlen(inBuf.c_str())); -} - - -/****************************************************************************** - * zVerse::settext - Sets text for current offset - * - * ENT: testmt - testament to find (0 - Bible/module introduction) - * idxoff - offset into .vss - * buf - buffer to store - * len - length of buffer (0 - null terminated) - */ - -void zVerse::doSetText(char testmt, long idxoff, const char *buf, long len) { - - len = (len < 0) ? strlen(buf) : len; - if (!testmt) - testmt = ((idxfp[0]) ? 1:2); - if ((!dirtyCache) || (cacheBufIdx < 0)) { - cacheBufIdx = lseek(idxfp[testmt-1]->getFd(), 0, SEEK_END) / 12; - cacheTestament = testmt; - if (cacheBuf) - free(cacheBuf); - cacheBuf = (char *)calloc(len + 1, 1); - } - else cacheBuf = (char *)((cacheBuf)?realloc(cacheBuf, strlen(cacheBuf)+(len + 1)):calloc((len + 1), 1)); - - dirtyCache = true; - - unsigned long start, outstart; - unsigned long outBufIdx = cacheBufIdx; - unsigned short size; - unsigned short outsize; - - idxoff *= 10; - size = outsize = len; - - start = strlen(cacheBuf); - - if (!size) - start = outBufIdx = 0; - - outBufIdx = archtosword32(outBufIdx); - outstart = archtosword32(start); - outsize = archtosword16(size); - - lseek(compfp[testmt-1]->getFd(), idxoff, SEEK_SET); - write(compfp[testmt-1]->getFd(), &outBufIdx, 4); - write(compfp[testmt-1]->getFd(), &outstart, 4); - write(compfp[testmt-1]->getFd(), &outsize, 2); - strcat(cacheBuf, buf); -} - - -void zVerse::flushCache() { - if (dirtyCache) { - unsigned long idxoff; - unsigned long start, outstart; - unsigned long size, outsize; - unsigned long zsize, outzsize; - - idxoff = cacheBufIdx * 12; - if (cacheBuf) { - size = outsize = zsize = outzsize = strlen(cacheBuf); - if (size) { - // if (compressor) { - // delete compressor; - // compressor = new LZSSCompress(); - // } - compressor->Buf(cacheBuf); - compressor->zBuf(&zsize); - outzsize = zsize; - - SWBuf buf; - buf.setSize(zsize + 5); - memcpy(buf.getRawData(), compressor->zBuf(&zsize), zsize); - buf.setSize(zsize); - rawZFilter(buf, 1); // 1 = encipher - - start = outstart = lseek(textfp[cacheTestament-1]->getFd(), 0, SEEK_END); - - outstart = archtosword32(start); - outsize = archtosword32(size); - outzsize = archtosword32(zsize); - - write(textfp[cacheTestament-1]->getFd(), buf, zsize); - - lseek(idxfp[cacheTestament-1]->getFd(), idxoff, SEEK_SET); - write(idxfp[cacheTestament-1]->getFd(), &outstart, 4); - write(idxfp[cacheTestament-1]->getFd(), &outzsize, 4); - write(idxfp[cacheTestament-1]->getFd(), &outsize, 4); - } - free(cacheBuf); - cacheBuf = 0; - } - dirtyCache = false; - } -} - -/****************************************************************************** - * RawVerse::linkentry - links one entry to another - * - * ENT: testmt - testament to find (0 - Bible/module introduction) - * destidxoff - dest offset into .vss - * srcidxoff - source offset into .vss - */ - -void zVerse::doLinkEntry(char testmt, long destidxoff, long srcidxoff) { - long bufidx; - long start; - unsigned short size; - - destidxoff *= 10; - srcidxoff *= 10; - - if (!testmt) - testmt = ((idxfp[1]) ? 1:2); - - // get source - lseek(compfp[testmt-1]->getFd(), srcidxoff, SEEK_SET); - read(compfp[testmt-1]->getFd(), &bufidx, 4); - read(compfp[testmt-1]->getFd(), &start, 4); - read(compfp[testmt-1]->getFd(), &size, 2); - - // write dest - lseek(compfp[testmt-1]->getFd(), destidxoff, SEEK_SET); - write(compfp[testmt-1]->getFd(), &bufidx, 4); - write(compfp[testmt-1]->getFd(), &start, 4); - write(compfp[testmt-1]->getFd(), &size, 2); -} - - -/****************************************************************************** - * RawVerse::CreateModule - Creates new module files - * - * ENT: path - directory to store module files - * RET: error status - */ - -char zVerse::createModule(const char *ipath, int blockBound) -{ - char *path = 0; - char *buf = new char [ strlen (ipath) + 20 ]; - FileDesc *fd, *fd2; - - stdstr(&path, ipath); - - if ((path[strlen(path)-1] == '/') || (path[strlen(path)-1] == '\\')) - path[strlen(path)-1] = 0; - - sprintf(buf, "%s/ot.%czs", path, uniqueIndexID[blockBound]); - unlink(buf); - fd = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); - fd->getFd(); - FileMgr::systemFileMgr.close(fd); - - sprintf(buf, "%s/nt.%czs", path, uniqueIndexID[blockBound]); - unlink(buf); - fd = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); - fd->getFd(); - FileMgr::systemFileMgr.close(fd); - - sprintf(buf, "%s/ot.%czz", path, uniqueIndexID[blockBound]); - unlink(buf); - fd = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); - fd->getFd(); - FileMgr::systemFileMgr.close(fd); - - sprintf(buf, "%s/nt.%czz", path, uniqueIndexID[blockBound]); - unlink(buf); - fd2 = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); - fd2->getFd(); - FileMgr::systemFileMgr.close(fd); - - sprintf(buf, "%s/ot.%czv", path, uniqueIndexID[blockBound]); - unlink(buf); - fd = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); - fd->getFd(); - - sprintf(buf, "%s/nt.%czv", path, uniqueIndexID[blockBound]); - unlink(buf); - fd2 = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); - fd2->getFd(); - - VerseKey vk; - vk.Headings(1); - long offset = 0; - short size = 0; - for (vk = TOP; !vk.Error(); vk++) { - write((vk.Testament() == 1) ? fd->getFd() : fd2->getFd(), &offset, 4); //compBufIdxOffset - write((vk.Testament() == 1) ? fd->getFd() : fd2->getFd(), &offset, 4); - write((vk.Testament() == 1) ? fd->getFd() : fd2->getFd(), &size, 2); - } - - FileMgr::systemFileMgr.close(fd); - FileMgr::systemFileMgr.close(fd2); - - delete [] path; - delete [] buf; -/* - RawVerse rv(path); - VerseKey mykey("Rev 22:21"); -*/ - - return 0; -} - - -/****************************************************************************** - * zVerse::preptext - Prepares the text before returning it to external - * objects - * - * ENT: buf - buffer where text is stored and where to store the prep'd - * text. - */ - -void zVerse::prepText(SWBuf &buf) { - unsigned int to, from; - char space = 0, cr = 0, realdata = 0, nlcnt = 0; - char *rawBuf = buf.getRawData(); - for (to = from = 0; rawBuf[from]; from++) { - switch (rawBuf[from]) { - case 10: - if (!realdata) - continue; - space = (cr) ? 0 : 1; - cr = 0; - nlcnt++; - if (nlcnt > 1) { -// *to++ = nl; - rawBuf[to++] = 10; -// *to++ = nl[1]; -// nlcnt = 0; - } - continue; - case 13: - if (!realdata) - continue; -// *to++ = nl[0]; - rawBuf[to++] = 10; - space = 0; - cr = 1; - continue; - } - realdata = 1; - nlcnt = 0; - if (space) { - space = 0; - if (rawBuf[from] != ' ') { - rawBuf[to++] = ' '; - from--; - continue; - } - } - rawBuf[to++] = rawBuf[from]; - } - buf.setSize(to); - - while (to > 1) { // remove trailing excess - to--; - if ((rawBuf[to] == 10) || (rawBuf[to] == ' ')) - buf.setSize(to); - else break; - } -} - - -SWORD_NAMESPACE_END |