diff options
Diffstat (limited to 'src/modules/texts/ztext/ztext.cpp')
-rw-r--r-- | src/modules/texts/ztext/ztext.cpp | 83 |
1 files changed, 54 insertions, 29 deletions
diff --git a/src/modules/texts/ztext/ztext.cpp b/src/modules/texts/ztext/ztext.cpp index b461d49..61b3008 100644 --- a/src/modules/texts/ztext/ztext.cpp +++ b/src/modules/texts/ztext/ztext.cpp @@ -1,9 +1,24 @@ /****************************************************************************** * ztext.cpp - code for class 'zText'- a module that reads compressed text * files: ot and nt using indexs ??.vss + * + * + * Copyright 2009 CrossWire Bible Society (http://www.crosswire.org) + * CrossWire Bible Society + * P. O. Box 2528 + * Tempe, AZ 85280-2528 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * */ - #include <ctype.h> #include <stdio.h> #include <fcntl.h> @@ -29,8 +44,8 @@ SWORD_NAMESPACE_START * idisp - Display object to use for displaying */ -zText::zText(const char *ipath, const char *iname, const char *idesc, int iblockType, SWCompress *icomp, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang) - : zVerse(ipath, FileMgr::RDWR, iblockType, icomp), SWText(iname, idesc, idisp, enc, dir, mark, ilang) { +zText::zText(const char *ipath, const char *iname, const char *idesc, int iblockType, SWCompress *icomp, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char *ilang, const char *versification) + : zVerse(ipath, FileMgr::RDWR, iblockType, icomp), SWText(iname, idesc, idisp, enc, dir, mark, ilang, versification) { blockType = iblockType; lastWriteKey = 0; } @@ -62,14 +77,15 @@ bool zText::isWritable() { return ((idxfp[0]->getFd() > 0) && ((idxfp[0]->mode & SWBuf &zText::getRawEntryBuf() { long start = 0; unsigned short size = 0; + unsigned long buffnum = 0; VerseKey &key = getVerseKey(); - findOffset(key.Testament(), key.Index(), &start, &size); + findOffset(key.Testament(), key.TestamentIndex(), &start, &size, &buffnum); entrySize = size; // support getEntrySize call entryBuf = ""; - zReadText(key.Testament(), start, size, entryBuf); - + + zReadText(key.Testament(), start, size, buffnum, entryBuf); rawFilter(entryBuf, &key); // if (!isUnicode()) @@ -109,7 +125,7 @@ void zText::setEntry(const char *inbuf, long len) { delete lastWriteKey; } - doSetText(key.Testament(), key.Index(), inbuf, len); + doSetText(key.Testament(), key.TestamentIndex(), inbuf, len); lastWriteKey = (VerseKey *)key.clone(); // must delete } @@ -117,22 +133,8 @@ void zText::setEntry(const char *inbuf, long len) { void zText::linkEntry(const SWKey *inkey) { VerseKey &destkey = getVerseKey(); - const VerseKey *srckey = 0; - - // see if we have a VerseKey * or decendant - SWTRY { - srckey = (const VerseKey *) SWDYNAMIC_CAST(VerseKey, inkey); - } - SWCATCH ( ... ) { - } - // if we don't have a VerseKey * decendant, create our own - if (!srckey) - srckey = new VerseKey(inkey); - - doLinkEntry(destkey.Testament(), destkey.Index(), srckey->Index()); - - if (inkey != srckey) // free our key if we created a VerseKey - delete srckey; + const VerseKey *srckey = &getVerseKey(inkey); + doLinkEntry(destkey.Testament(), destkey.TestamentIndex(), srckey->TestamentIndex()); } @@ -145,7 +147,7 @@ void zText::deleteEntry() { VerseKey &key = getVerseKey(); - doSetText(key.Testament(), key.Index(), ""); + doSetText(key.Testament(), key.TestamentIndex(), ""); } @@ -157,26 +159,27 @@ void zText::deleteEntry() { */ void zText::increment(int steps) { - long start; + long start; unsigned short size; + unsigned long buffnum; VerseKey *tmpkey = &getVerseKey(); - findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); + findOffset(tmpkey->Testament(), tmpkey->TestamentIndex(), &start, &size, &buffnum); SWKey lastgood = *tmpkey; while (steps) { long laststart = start; unsigned short lastsize = size; SWKey lasttry = *tmpkey; - (steps > 0) ? (*key)++ : (*key)--; + (steps > 0) ? ++(*key) : --(*key); tmpkey = &getVerseKey(); if ((error = key->Error())) { *key = lastgood; break; } - long index = tmpkey->Index(); - findOffset(tmpkey->Testament(), index, &start, &size); + long index = tmpkey->TestamentIndex(); + findOffset(tmpkey->Testament(), index, &start, &size, &buffnum); if ( (((laststart != start) || (lastsize != size)) // we're a different entry @@ -190,6 +193,28 @@ void zText::increment(int steps) { error = (error) ? KEYERR_OUTOFBOUNDS : 0; } +bool zText::isLinked(const SWKey *k1, const SWKey *k2) const { + long start1, start2; + unsigned short size1, size2; + unsigned long buffnum1, buffnum2; + VerseKey *vk1 = &getVerseKey(k1); + VerseKey *vk2 = &getVerseKey(k2); + if (vk1->Testament() != vk2->Testament()) return false; + + findOffset(vk1->Testament(), vk1->TestamentIndex(), &start1, &size1, &buffnum1); + findOffset(vk2->Testament(), vk2->TestamentIndex(), &start2, &size2, &buffnum2); + return start1 == start2 && buffnum1 == buffnum2; +} + +bool zText::hasEntry(const SWKey *k) const { + long start; + unsigned short size; + unsigned long buffnum; + VerseKey *vk = &getVerseKey(k); + + findOffset(vk->Testament(), vk->TestamentIndex(), &start, &size, &buffnum); + return size; +} SWORD_NAMESPACE_END |