diff options
Diffstat (limited to 'src/modules/comments')
-rw-r--r-- | src/modules/comments/hrefcom/hrefcom.cpp | 29 | ||||
-rw-r--r-- | src/modules/comments/rawcom/rawcom.cpp | 215 | ||||
-rw-r--r-- | src/modules/comments/rawfiles/rawfiles.cpp | 112 | ||||
-rw-r--r-- | src/modules/comments/swcom.cpp | 41 | ||||
-rw-r--r-- | src/modules/comments/zcom/zcom.cpp | 198 |
5 files changed, 221 insertions, 374 deletions
diff --git a/src/modules/comments/hrefcom/hrefcom.cpp b/src/modules/comments/hrefcom/hrefcom.cpp index a80e5b6..42b2745 100644 --- a/src/modules/comments/hrefcom/hrefcom.cpp +++ b/src/modules/comments/hrefcom/hrefcom.cpp @@ -15,11 +15,11 @@ #include <unistd.h> #endif -#include <string.h> #include <utilfuns.h> #include <rawverse.h> #include <hrefcom.h> +SWORD_NAMESPACE_START /****************************************************************************** * HREFCom Constructor - Initializes data for instance of HREFCom @@ -55,10 +55,9 @@ HREFCom::~HREFCom() * RET: string buffer with verse */ -char *HREFCom::getRawEntry() { +SWBuf &HREFCom::getRawEntryBuf() { long start; unsigned short size; - char *tmpbuf; VerseKey *key = 0; #ifndef _WIN32_WCE @@ -72,26 +71,20 @@ char *HREFCom::getRawEntry() { if (!key) key = new VerseKey(this->key); - findoffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->Index(), &start, &size); entrySize = size; // support getEntrySize call - unsigned long newsize = ((size + 2) + strlen(prefix)) * FILTERPAD; - if (newsize > entrybufallocsize) { - if (entrybuf) - delete [] entrybuf; - entrybuf = new char [ newsize ]; - entrybufallocsize = newsize; - } - tmpbuf = new char [ size + 10 ]; - - gettext(key->Testament(), start, size + 2, tmpbuf); - sprintf(entrybuf, "%s%s", prefix, tmpbuf); - preptext(entrybuf); + SWBuf tmpbuf; - delete [] tmpbuf; + readText(key->Testament(), start, size, tmpbuf); + entryBuf = prefix; + entryBuf += tmpbuf.c_str(); + prepText(entryBuf); if (key != this->key) delete key; - return entrybuf; + return entryBuf; } + +SWORD_NAMESPACE_END diff --git a/src/modules/comments/rawcom/rawcom.cpp b/src/modules/comments/rawcom/rawcom.cpp index ca93c64..e34af2e 100644 --- a/src/modules/comments/rawcom/rawcom.cpp +++ b/src/modules/comments/rawcom/rawcom.cpp @@ -14,11 +14,11 @@ #include <unistd.h> #endif -#include <string.h> #include <utilfuns.h> #include <rawverse.h> #include <rawcom.h> +SWORD_NAMESPACE_START /****************************************************************************** * RawCom Constructor - Initializes data for instance of RawCom @@ -44,206 +44,98 @@ RawCom::~RawCom() /****************************************************************************** - * RawCom::operator char * - Returns the correct verse when char * cast + * RawCom::getRawEntry() - Returns the correct verse when char * cast * is requested * * RET: string buffer with verse */ -char *RawCom::getRawEntry() { +SWBuf &RawCom::getRawEntryBuf() { long start = 0; unsigned short size = 0; - VerseKey *key = 0; + VerseKey *key = &getVerseKey(); -#ifndef _WIN32_WCE - try { -#endif - key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - if (!key) - key = new VerseKey(this->key); - - - findoffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->Index(), &start, &size); entrySize = size; // support getEntrySize call - unsigned long newsize = (size + 2) * FILTERPAD; - if (newsize > entrybufallocsize) { - if (entrybuf) - delete [] entrybuf; - entrybuf = new char [ newsize ]; - entrybufallocsize = newsize; - } - *entrybuf = 0; - - gettext(key->Testament(), start, (size + 2), entrybuf); - - rawFilter(entrybuf, size, key); + entryBuf = ""; + readText(key->Testament(), start, size, entryBuf); - if (!isUnicode()) - preptext(entrybuf); + rawFilter(entryBuf, 0); // hack, decipher + rawFilter(entryBuf, key); - if (key != this->key) - delete key; +// if (!isUnicode()) + prepText(entryBuf); - return entrybuf; + return entryBuf; } /****************************************************************************** - * RawCom::operator += - Increments module key a number of entries + * RawCom::increment - Increments module key a number of entries * - * ENT: increment - Number of entries to jump forward + * ENT: steps - Number of entries to jump forward * * RET: *this */ -SWModule &RawCom::operator +=(int increment) -{ +void RawCom::increment(int steps) { long start; unsigned short size; - VerseKey *tmpkey = 0; - -#ifndef _WIN32_WCE - try { -#endif - tmpkey = SWDYNAMIC_CAST(VerseKey, key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - if (!tmpkey) - tmpkey = new VerseKey(key); + VerseKey *tmpkey = &getVerseKey(); - findoffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); + findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); SWKey lastgood = *tmpkey; - while (increment) { + while (steps) { long laststart = start; unsigned short lastsize = size; SWKey lasttry = *tmpkey; - (increment > 0) ? (*key)++ : (*key)--; - if (tmpkey != key) - delete tmpkey; - tmpkey = 0; -#ifndef _WIN32_WCE - try { -#endif - tmpkey = SWDYNAMIC_CAST(VerseKey, key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - if (!tmpkey) - tmpkey = new VerseKey(key); + (steps > 0) ? (*key)++ : (*key)--; + tmpkey = &getVerseKey(); if ((error = key->Error())) { *key = lastgood; break; } long index = tmpkey->Index(); - findoffset(tmpkey->Testament(), index, &start, &size); - if ((((laststart != start) || (lastsize != size))||(!skipConsecutiveLinks)) && (start >= 0) && (size)) { - increment += (increment < 0) ? 1 : -1; + findOffset(tmpkey->Testament(), index, &start, &size); + if ( + (((laststart != start) || (lastsize != size)) // we're a different entry +// && (start > 0) + && (size)) // and we actually have a size + ||(!skipConsecutiveLinks)) { // or we don't want to skip consecutive links + steps += (steps < 0) ? 1 : -1; lastgood = *tmpkey; } } error = (error) ? KEYERR_OUTOFBOUNDS : 0; - - if (tmpkey != key) - delete tmpkey; - - return *this; } -SWModule &RawCom::setentry(const char *inbuf, long len) { - VerseKey *key = 0; - // see if we have a VerseKey * or decendant -#ifndef _WIN32_WCE - try { -#endif - key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - // if we don't have a VerseKey * decendant, create our own - if (!key) - key = new VerseKey(this->key); - - settext(key->Testament(), key->Index(), inbuf, len); - - if (this->key != key) // free our key if we created a VerseKey - delete key; - return *this; -} - -SWModule &RawCom::operator <<(const char *inbuf) { - VerseKey *key = 0; - // see if we have a VerseKey * or decendant -#ifndef _WIN32_WCE - try { -#endif - key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - // if we don't have a VerseKey * decendant, create our own - if (!key) - key = new VerseKey(this->key); - - settext(key->Testament(), key->Index(), inbuf); - - if (this->key != key) // free our key if we created a VerseKey - delete key; - - return *this; +void RawCom::setEntry(const char *inbuf, long len) { + VerseKey *key = &getVerseKey(); + doSetText(key->Testament(), key->Index(), inbuf, len); } -SWModule &RawCom::operator <<(const SWKey *inkey) { - VerseKey *destkey = 0; +void RawCom::linkEntry(const SWKey *inkey) { + VerseKey *destkey = &getVerseKey(); const VerseKey *srckey = 0; - // see if we have a VerseKey * or decendant -#ifndef _WIN32_WCE - try { -#endif - destkey = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - // if we don't have a VerseKey * decendant, create our own - if (!destkey) - destkey = new VerseKey(this->key); // see if we have a VerseKey * or decendant -#ifndef _WIN32_WCE try { -#endif srckey = SWDYNAMIC_CAST(VerseKey, inkey); -#ifndef _WIN32_WCE } catch ( ... ) {} -#endif // if we don't have a VerseKey * decendant, create our own if (!srckey) srckey = new VerseKey(inkey); - linkentry(destkey->Testament(), destkey->Index(), srckey->Index()); - - if (this->key != destkey) // free our key if we created a VerseKey - delete destkey; + doLinkEntry(destkey->Testament(), destkey->Index(), srckey->Index()); if (inkey != srckey) // free our key if we created a VerseKey delete srckey; - - return *this; } @@ -255,21 +147,38 @@ SWModule &RawCom::operator <<(const SWKey *inkey) { void RawCom::deleteEntry() { - VerseKey *key = 0; + VerseKey *key = &getVerseKey(); + doSetText(key->Testament(), key->Index(), ""); +} -#ifndef _WIN32_WCE + +VerseKey &RawCom::getVerseKey() { + static VerseKey tmpVK; + VerseKey *key; + // see if we have a VerseKey * or decendant try { -#endif key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE } - catch ( ... ) {} -#endif - if (!key) - key = new VerseKey(this->key); + catch ( ... ) { } + if (!key) { + ListKey *lkTest = 0; + try { + lkTest = SWDYNAMIC_CAST(ListKey, this->key); + } + catch ( ... ) { } + if (lkTest) { + try { + key = SWDYNAMIC_CAST(VerseKey, lkTest->GetElement()); + } + catch ( ... ) { } + } + } + if (!key) { + tmpVK = *(this->key); + return tmpVK; + } + else return *key; +} - settext(key->Testament(), key->Index(), ""); - if (key != this->key) - delete key; -} +SWORD_NAMESPACE_END diff --git a/src/modules/comments/rawfiles/rawfiles.cpp b/src/modules/comments/rawfiles/rawfiles.cpp index c8e9388..9ffa00f 100644 --- a/src/modules/comments/rawfiles/rawfiles.cpp +++ b/src/modules/comments/rawfiles/rawfiles.cpp @@ -15,7 +15,6 @@ #include <unistd.h> #endif -#include <string.h> #include <utilfuns.h> #include <rawverse.h> #include <rawfiles.h> @@ -25,6 +24,7 @@ #define O_BINARY 0 // If it hasn't been defined than we probably #endif // don't need it. +SWORD_NAMESPACE_START /****************************************************************************** * RawFiles Constructor - Initializes data for instance of RawFiles @@ -49,13 +49,13 @@ RawFiles::~RawFiles() /****************************************************************************** - * RawFiles::operator char * - Returns the correct verse when char * cast + * RawFiles::getRawEntry - Returns the correct verse when char * cast * is requested * * RET: string buffer with verse */ -char *RawFiles::getRawEntry() { +SWBuf &RawFiles::getRawEntryBuf() { FileDesc *datafile; long start = 0; unsigned short size = 0; @@ -73,148 +73,125 @@ char *RawFiles::getRawEntry() { if (!key) key = new VerseKey(this->key); - findoffset(key->Testament(), key->Index(), &start, &size); - - if (entrybuf) - delete [] entrybuf; + findOffset(key->Testament(), key->Index(), &start, &size); + entryBuf = ""; if (size) { - tmpbuf = new char [ (size + 2) + strlen(path) + 5 ]; - sprintf(tmpbuf,"%s/",path); - gettext(key->Testament(), start, (size + 2), tmpbuf+strlen(tmpbuf)); - datafile = FileMgr::systemFileMgr.open(tmpbuf, O_RDONLY|O_BINARY); - delete [] tmpbuf; + SWBuf tmpbuf = path; + tmpbuf += '/'; + readText(key->Testament(), start, size, entryBuf); + tmpbuf += entryBuf; + entryBuf = ""; + datafile = FileMgr::systemFileMgr.open(tmpbuf.c_str(), O_RDONLY|O_BINARY); if (datafile->getFd() > 0) { size = lseek(datafile->getFd(), 0, SEEK_END); - entrybuf = new char [ size * FILTERPAD ]; - memset(entrybuf, 0, size * FILTERPAD); + char *tmpBuf = new char [ size + 1 ]; + memset(tmpBuf, 0, size + 1); lseek(datafile->getFd(), 0, SEEK_SET); - read(datafile->getFd(), entrybuf, size); - preptext(entrybuf); - } - else { - entrybuf = new char [2]; - entrybuf[0] = 0; - entrybuf[1] = 0; + read(datafile->getFd(), tmpBuf, size); + entryBuf = tmpBuf; + delete [] tmpBuf; +// preptext(entrybuf); } FileMgr::systemFileMgr.close(datafile); } - else { - entrybuf = new char [2]; - entrybuf[0] = 0; - entrybuf[1] = 0; - } if (key != this->key) delete key; - return entrybuf; + return entryBuf; } /****************************************************************************** - * RawFiles::operator << (char *)- Update the modules current key entry with + * RawFiles::setEntry(char *)- Update the modules current key entry with * provided text - * - * RET: *this */ -SWModule &RawFiles::operator <<(const char *inbuf) { +void RawFiles::setEntry(const char *inbuf, long len) { FileDesc *datafile; long start; unsigned short size; - char *tmpbuf; VerseKey *key = 0; -#ifndef _WIN32_WCE + len = (len<0)?strlen(inbuf):len; try { -#endif key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE } catch ( ... ) {} -#endif if (!key) key = new VerseKey(this->key); - findoffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->Index(), &start, &size); if (size) { - tmpbuf = new char [ (size + 2) + strlen(path) + 1 ]; - sprintf(tmpbuf, "%s/", path); - gettext(key->Testament(), start, (size + 2), tmpbuf+strlen(tmpbuf)); + SWBuf tmpbuf; + entryBuf = path; + entryBuf += '/'; + readText(key->Testament(), start, size, tmpbuf); + entryBuf += tmpbuf; } else { - tmpbuf = new char [ 16 + strlen(path) + 1 ]; - sprintf(tmpbuf, "%s/%s", path, getnextfilename()); - settext(key->Testament(), key->Index(), tmpbuf+strlen(path)+1); + SWBuf tmpbuf; + entryBuf = path; + entryBuf += '/'; + tmpbuf = getNextFilename(); + doSetText(key->Testament(), key->Index(), tmpbuf); + entryBuf += tmpbuf; } - datafile = FileMgr::systemFileMgr.open(tmpbuf, O_CREAT|O_WRONLY|O_BINARY|O_TRUNC); - delete [] tmpbuf; + datafile = FileMgr::systemFileMgr.open(entryBuf, O_CREAT|O_WRONLY|O_BINARY|O_TRUNC); if (datafile->getFd() > 0) { - write(datafile->getFd(), inbuf, strlen(inbuf)); + write(datafile->getFd(), inbuf, len); } FileMgr::systemFileMgr.close(datafile); if (key != this->key) delete key; - - return *this; } /****************************************************************************** - * RawFiles::operator << (SWKey *)- Link the modules current key entry with + * RawFiles::linkEntry(SWKey *)- Link the modules current key entry with * another module entry * * RET: *this */ -SWModule &RawFiles::operator <<(const SWKey *inkey) { +void RawFiles::linkEntry(const SWKey *inkey) { long start; unsigned short size; char *tmpbuf; const VerseKey *key = 0; -#ifndef _WIN32_WCE try { -#endif key = SWDYNAMIC_CAST(VerseKey, inkey); -#ifndef _WIN32_WCE } catch ( ... ) {} -#endif if (!key) key = new VerseKey(this->key); - findoffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->Index(), &start, &size); if (size) { - tmpbuf = new char [ size + 2]; - gettext(key->Testament(), start, size + 2, tmpbuf); + SWBuf tmpbuf; + readText(key->Testament(), start, size + 2, tmpbuf); if (key != inkey) delete key; key = 0; -#ifndef _WIN32_WCE try { -#endif key = SWDYNAMIC_CAST(VerseKey, inkey); -#ifndef _WIN32_WCE } catch ( ... ) {} -#endif if (!key) key = new VerseKey(this->key); - settext(key->Testament(), key->Index(), tmpbuf); + doSetText(key->Testament(), key->Index(), tmpbuf.c_str()); } if (key != inkey) delete key; - - return *this; } @@ -239,7 +216,7 @@ void RawFiles::deleteEntry() { if (!key) key = new VerseKey(this->key); - settext(key->Testament(), key->Index(), ""); + doSetText(key->Testament(), key->Index(), ""); if (key != this->key) delete key; @@ -247,13 +224,13 @@ void RawFiles::deleteEntry() { /****************************************************************************** - * RawFiles::getnextfilename - generates a valid filename in which to store + * RawFiles::getNextfilename - generates a valid filename in which to store * an entry * * RET: filename */ -char *RawFiles::getnextfilename() { +char *RawFiles::getNextFilename() { static char incfile[255]; long number; FileDesc *datafile; @@ -289,3 +266,4 @@ char RawFiles::createModule (const char *path) { +SWORD_NAMESPACE_END diff --git a/src/modules/comments/swcom.cpp b/src/modules/comments/swcom.cpp index 1feb0cf..3f2b940 100644 --- a/src/modules/comments/swcom.cpp +++ b/src/modules/comments/swcom.cpp @@ -5,6 +5,7 @@ #include <swcom.h> +SWORD_NAMESPACE_START /****************************************************************************** * SWCom Constructor - Initializes data for instance of SWCom @@ -28,3 +29,43 @@ SWCom::SWCom(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWTex SWCom::~SWCom() { } + + +long SWCom::Index() const { + VerseKey *key = 0; + try { + key = SWDYNAMIC_CAST(VerseKey, this->key); + } + catch ( ... ) {} + if (!key) + key = new VerseKey(this->key); + + entryIndex = key->NewIndex(); + + if (key != this->key) + delete key; + + return entryIndex; +} + +long SWCom::Index(long iindex) { + VerseKey *key = 0; + try { + key = SWDYNAMIC_CAST(VerseKey, this->key); + } + catch ( ... ) {} + if (!key) + key = new VerseKey(this->key); + + key->Testament(1); + key->Index(iindex); + + if (key != this->key) { + this->key->copyFrom(*key); + delete key; + } + + return Index(); +} + +SWORD_NAMESPACE_END diff --git a/src/modules/comments/zcom/zcom.cpp b/src/modules/comments/zcom/zcom.cpp index c53fd1e..744a509 100644 --- a/src/modules/comments/zcom/zcom.cpp +++ b/src/modules/comments/zcom/zcom.cpp @@ -14,11 +14,11 @@ #include <unistd.h> #endif -#include <string.h> #include <utilfuns.h> #include <zverse.h> #include <zcom.h> +SWORD_NAMESPACE_START /****************************************************************************** * zCom Constructor - Initializes data for instance of zCom @@ -49,51 +49,28 @@ zCom::~zCom() { } /****************************************************************************** - * zCom::operator char * - Returns the correct verse when char * cast + * zCom::getRawEntry - Returns the correct verse when char * cast * is requested * * RET: string buffer with verse */ -char *zCom::getRawEntry() { +SWBuf &zCom::getRawEntryBuf() { long start = 0; unsigned short size = 0; - VerseKey *key = 0; + VerseKey *key = &getVerseKey(); -#ifndef _WIN32_WCE - try { -#endif - key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - // if we don't have a VerseKey * decendant, create our own - if (!key) - key = new VerseKey(this->key); - - findoffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->Index(), &start, &size); entrySize = size; // support getEntrySize call - unsigned long newsize = (size + 2) * FILTERPAD; - if (newsize > entrybufallocsize) { - if (entrybuf) - delete [] entrybuf; - entrybuf = new char [ newsize ]; - entrybufallocsize = newsize; - } - *entrybuf = 0; + entryBuf = ""; + zReadText(key->Testament(), start, size, entryBuf); - swgettext(key->Testament(), start, (size + 2), entrybuf); + rawFilter(entryBuf, key); - rawFilter(entrybuf, size, key); +// if (!isUnicode()) + prepText(entryBuf); - if (!isUnicode()) - preptext(entrybuf); - - if (this->key != key) // free our key if we created a VerseKey - delete key; - - return entrybuf; + return entryBuf; } @@ -115,21 +92,8 @@ bool zCom::sameBlock(VerseKey *k1, VerseKey *k2) { return true; } -SWModule &zCom::setentry(const char *inbuf, long len) { - VerseKey *key = 0; - // see if we have a VerseKey * or decendant -#ifndef _WIN32_WCE - try { -#endif - key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - // if we don't have a VerseKey * decendant, create our own - if (!key) - key = new VerseKey(this->key); - +void zCom::setEntry(const char *inbuf, long len) { + VerseKey *key = &getVerseKey(); // see if we've jumped across blocks since last write if (lastWriteKey) { @@ -139,60 +103,30 @@ SWModule &zCom::setentry(const char *inbuf, long len) { delete lastWriteKey; } - settext(key->Testament(), key->Index(), inbuf, len); + doSetText(key->Testament(), key->Index(), inbuf, len); lastWriteKey = (VerseKey *)key->clone(); // must delete - - if (this->key != key) // free our key if we created a VerseKey - delete key; - - return *this; -} - -SWModule &zCom::operator <<(const char *inbuf) { - return setentry(inbuf, 0); } -SWModule &zCom::operator <<(const SWKey *inkey) { - VerseKey *destkey = 0; +void zCom::linkEntry(const SWKey *inkey) { + VerseKey *destkey = &getVerseKey(); const VerseKey *srckey = 0; - // see if we have a VerseKey * or decendant -#ifndef _WIN32_WCE - try { -#endif - destkey = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - // if we don't have a VerseKey * decendant, create our own - if (!destkey) - destkey = new VerseKey(this->key); // see if we have a VerseKey * or decendant -#ifndef _WIN32_WCE try { -#endif srckey = (const VerseKey *) SWDYNAMIC_CAST(VerseKey, inkey); -#ifndef _WIN32_WCE } catch ( ... ) { } -#endif // if we don't have a VerseKey * decendant, create our own if (!srckey) srckey = new VerseKey(inkey); - linkentry(destkey->Testament(), destkey->Index(), srckey->Index()); - - if (this->key != destkey) // free our key if we created a VerseKey - delete destkey; + doLinkEntry(destkey->Testament(), destkey->Index(), srckey->Index()); if (inkey != srckey) // free our key if we created a VerseKey delete srckey; - - return *this; } /****************************************************************************** @@ -203,88 +137,80 @@ SWModule &zCom::operator <<(const SWKey *inkey) { void zCom::deleteEntry() { - VerseKey *key = 0; - -#ifndef _WIN32_WCE - try { -#endif - key = SWDYNAMIC_CAST(VerseKey, this->key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - if (!key) - key = new VerseKey(this->key); - - settext(key->Testament(), key->Index(), ""); - - if (key != this->key) - delete key; + VerseKey *key = &getVerseKey(); + doSetText(key->Testament(), key->Index(), ""); } /****************************************************************************** - * zCom::operator += - Increments module key a number of entries + * zCom::increment - Increments module key a number of entries * * ENT: increment - Number of entries to jump forward * * RET: *this */ -SWModule &zCom::operator +=(int increment) { +void zCom::increment(int steps) { long start; unsigned short size; - VerseKey *tmpkey = 0; - -#ifndef _WIN32_WCE - try { -#endif - tmpkey = SWDYNAMIC_CAST(VerseKey, key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - if (!tmpkey) - tmpkey = new VerseKey(key); + VerseKey *tmpkey = &getVerseKey(); - findoffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); + findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); SWKey lastgood = *tmpkey; - while (increment) { + while (steps) { long laststart = start; unsigned short lastsize = size; SWKey lasttry = *tmpkey; - (increment > 0) ? (*key)++ : (*key)--; - if (tmpkey != key) - delete tmpkey; - tmpkey = 0; -#ifndef _WIN32_WCE - try { -#endif - tmpkey = SWDYNAMIC_CAST(VerseKey, key); -#ifndef _WIN32_WCE - } - catch ( ... ) {} -#endif - if (!tmpkey) - tmpkey = new VerseKey(key); + (steps > 0) ? (*key)++ : (*key)--; + tmpkey = &getVerseKey(); if ((error = key->Error())) { *key = lastgood; break; } long index = tmpkey->Index(); - findoffset(tmpkey->Testament(), index, &start, &size); - if ((((laststart != start) || (lastsize != size))||(!skipConsecutiveLinks)) && (start >= 0) && (size)) { - increment += (increment < 0) ? 1 : -1; + findOffset(tmpkey->Testament(), index, &start, &size); + if ( + (((laststart != start) || (lastsize != size)) // we're a different entry +// && (start > 0) + && (size)) // and we actually have a size + ||(!skipConsecutiveLinks)) { // or we don't want to skip consecutive links + steps += (steps < 0) ? 1 : -1; lastgood = *tmpkey; } } error = (error) ? KEYERR_OUTOFBOUNDS : 0; +} - if (tmpkey != key) - delete tmpkey; - return *this; +VerseKey &zCom::getVerseKey() { + static VerseKey tmpVK; + VerseKey *key; + // see if we have a VerseKey * or decendant + try { + key = SWDYNAMIC_CAST(VerseKey, this->key); + } + catch ( ... ) { } + if (!key) { + ListKey *lkTest = 0; + try { + lkTest = SWDYNAMIC_CAST(ListKey, this->key); + } + catch ( ... ) { } + if (lkTest) { + try { + key = SWDYNAMIC_CAST(VerseKey, lkTest->GetElement()); + } + catch ( ... ) { } + } + } + if (!key) { + tmpVK = *(this->key); + return tmpVK; + } + else return *key; } + +SWORD_NAMESPACE_END |