diff options
author | Roberto C. Sanchez <roberto@connexer.com> | 2014-03-29 10:54:01 -0400 |
---|---|---|
committer | Roberto C. Sanchez <roberto@connexer.com> | 2014-03-29 10:54:01 -0400 |
commit | 71a39f4652cd51df814c930dd268f3c9ad2aee86 (patch) | |
tree | 5994350a603908c4e4d660bc9d72c4ec43dd648e /src/modules | |
parent | 03134fa5f6f25d92724ce4c183f9bbe12a9e37dc (diff) |
Imported Upstream version 1.6.0+dfsg
Diffstat (limited to 'src/modules')
101 files changed, 3381 insertions, 2770 deletions
diff --git a/src/modules/comments/hrefcom/hrefcom.cpp b/src/modules/comments/hrefcom/hrefcom.cpp index 7791da2..7035b08 100644 --- a/src/modules/comments/hrefcom/hrefcom.cpp +++ b/src/modules/comments/hrefcom/hrefcom.cpp @@ -2,6 +2,22 @@ * hrefcom.cpp - code for class 'HREFCom'- a module that produces HTML HREFs * pointing to actual text desired. Uses standard * files: ot and nt using indexs ??.bks ??.cps ??.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. + * */ @@ -56,14 +72,9 @@ SWBuf &HREFCom::getRawEntryBuf() { unsigned short size; VerseKey *key = 0; - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); + key = &getVerseKey(); - findOffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->TestamentIndex(), &start, &size); entrySize = size; // support getEntrySize call SWBuf tmpbuf; diff --git a/src/modules/comments/rawcom/rawcom.cpp b/src/modules/comments/rawcom/rawcom.cpp index fd01c24..c0404ae 100644 --- a/src/modules/comments/rawcom/rawcom.cpp +++ b/src/modules/comments/rawcom/rawcom.cpp @@ -1,6 +1,22 @@ /****************************************************************************** * rawcom.cpp - code for class 'RawCom'- a module that reads raw commentary * files: ot and nt using indexs ??.bks ??.cps ??.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. + * */ @@ -23,9 +39,9 @@ SWORD_NAMESPACE_START * idisp - Display object to use for displaying */ -RawCom::RawCom(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding encoding, SWTextDirection dir, SWTextMarkup markup, const char* ilang) +RawCom::RawCom(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding encoding, SWTextDirection dir, SWTextMarkup markup, const char *ilang, const char *versification) : RawVerse(ipath), - SWCom(iname, idesc, idisp, encoding, dir, markup, ilang){ + SWCom(iname, idesc, idisp, encoding, dir, markup, ilang, versification) { } @@ -53,7 +69,7 @@ SWBuf &RawCom::getRawEntryBuf() { unsigned short size = 0; VerseKey *key = &getVerseKey(); - findOffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->TestamentIndex(), &start, &size); entrySize = size; // support getEntrySize call entryBuf = ""; @@ -82,21 +98,21 @@ void RawCom::increment(int steps) { unsigned short size; VerseKey *tmpkey = &getVerseKey(); - findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); + findOffset(tmpkey->Testament(), tmpkey->TestamentIndex(), &start, &size); 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(); + long index = tmpkey->TestamentIndex(); findOffset(tmpkey->Testament(), index, &start, &size); if ( (((laststart != start) || (lastsize != size)) // we're a different entry @@ -113,24 +129,15 @@ void RawCom::increment(int steps) { void RawCom::setEntry(const char *inbuf, long len) { VerseKey *key = &getVerseKey(); - doSetText(key->Testament(), key->Index(), inbuf, len); + doSetText(key->Testament(), key->TestamentIndex(), inbuf, len); } void RawCom::linkEntry(const SWKey *inkey) { VerseKey *destkey = &getVerseKey(); - const VerseKey *srckey = 0; - - // see if we have a VerseKey * or decendant - SWTRY { - srckey = SWDYNAMIC_CAST(VerseKey, inkey); - } - SWCATCH ( ... ) {} - // if we don't have a VerseKey * decendant, create our own - if (!srckey) - srckey = new VerseKey(inkey); + const VerseKey *srckey = &getVerseKey(inkey); - doLinkEntry(destkey->Testament(), destkey->Index(), srckey->Index()); + doLinkEntry(destkey->Testament(), destkey->TestamentIndex(), srckey->TestamentIndex()); if (inkey != srckey) // free our key if we created a VerseKey delete srckey; @@ -146,8 +153,29 @@ void RawCom::linkEntry(const SWKey *inkey) { void RawCom::deleteEntry() { VerseKey *key = &getVerseKey(); - doSetText(key->Testament(), key->Index(), ""); + doSetText(key->Testament(), key->TestamentIndex(), ""); +} + +bool RawCom::isLinked(const SWKey *k1, const SWKey *k2) const { + long start1, start2; + unsigned short size1, size2; + VerseKey *vk1 = &getVerseKey(k1); + VerseKey *vk2 = &getVerseKey(k2); + if (vk1->Testament() != vk2->Testament()) return false; + + findOffset(vk1->Testament(), vk1->TestamentIndex(), &start1, &size1); + findOffset(vk2->Testament(), vk2->TestamentIndex(), &start2, &size2); + if (!size1 || !size2) return false; + return start1 == start2; } +bool RawCom::hasEntry(const SWKey *k) const { + long start; + unsigned short size; + VerseKey *vk = &getVerseKey(k); + + findOffset(vk->Testament(), vk->TestamentIndex(), &start, &size); + return size; +} SWORD_NAMESPACE_END diff --git a/src/modules/comments/rawcom4/rawcom4.cpp b/src/modules/comments/rawcom4/rawcom4.cpp index e59ee39..c0c4a1d 100644 --- a/src/modules/comments/rawcom4/rawcom4.cpp +++ b/src/modules/comments/rawcom4/rawcom4.cpp @@ -1,9 +1,24 @@ /****************************************************************************** * rawcom4.cpp - code for class 'RawCom4'- a module that reads raw commentary * files: ot and nt using indexs ??.bks ??.cps ??.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> @@ -23,9 +38,9 @@ SWORD_NAMESPACE_START * idisp - Display object to use for displaying */ -RawCom4::RawCom4(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding encoding, SWTextDirection dir, SWTextMarkup markup, const char* ilang) +RawCom4::RawCom4(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding encoding, SWTextDirection dir, SWTextMarkup markup, const char *ilang, const char *versification) : RawVerse4(ipath), - SWCom(iname, idesc, idisp, encoding, dir, markup, ilang){ + SWCom(iname, idesc, idisp, encoding, dir, markup, ilang, versification) { } @@ -53,7 +68,7 @@ SWBuf &RawCom4::getRawEntryBuf() { unsigned long size = 0; VerseKey *key = &getVerseKey(); - findOffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->TestamentIndex(), &start, &size); entrySize = size; // support getEntrySize call entryBuf = ""; @@ -82,21 +97,21 @@ void RawCom4::increment(int steps) { unsigned long size; VerseKey *tmpkey = &getVerseKey(); - findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); + findOffset(tmpkey->Testament(), tmpkey->TestamentIndex(), &start, &size); SWKey lastgood = *tmpkey; while (steps) { long laststart = start; unsigned long 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(); + long index = tmpkey->TestamentIndex(); findOffset(tmpkey->Testament(), index, &start, &size); if ( (((laststart != start) || (lastsize != size)) // we're a different entry @@ -113,27 +128,14 @@ void RawCom4::increment(int steps) { void RawCom4::setEntry(const char *inbuf, long len) { VerseKey *key = &getVerseKey(); - doSetText(key->Testament(), key->Index(), inbuf, len); + doSetText(key->Testament(), key->TestamentIndex(), inbuf, len); } void RawCom4::linkEntry(const SWKey *inkey) { VerseKey *destkey = &getVerseKey(); - const VerseKey *srckey = 0; - - // see if we have a VerseKey * or decendant - SWTRY { - srckey = 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()); } @@ -146,8 +148,29 @@ void RawCom4::linkEntry(const SWKey *inkey) { void RawCom4::deleteEntry() { VerseKey *key = &getVerseKey(); - doSetText(key->Testament(), key->Index(), ""); + doSetText(key->Testament(), key->TestamentIndex(), ""); +} + +bool RawCom4::isLinked(const SWKey *k1, const SWKey *k2) const { + long start1, start2; + unsigned long size1, size2; + VerseKey *vk1 = &getVerseKey(k1); + VerseKey *vk2 = &getVerseKey(k2); + if (vk1->Testament() != vk2->Testament()) return false; + + findOffset(vk1->Testament(), vk1->TestamentIndex(), &start1, &size1); + findOffset(vk2->Testament(), vk2->TestamentIndex(), &start2, &size2); + if (!size1 || !size2) return false; + return start1 == start2; } +bool RawCom4::hasEntry(const SWKey *k) const { + long start; + unsigned long size; + VerseKey *vk = &getVerseKey(k); + + findOffset(vk->Testament(), vk->TestamentIndex(), &start, &size); + return size; +} SWORD_NAMESPACE_END diff --git a/src/modules/comments/rawfiles/rawfiles.cpp b/src/modules/comments/rawfiles/rawfiles.cpp index 3b614d9..b0e24fc 100644 --- a/src/modules/comments/rawfiles/rawfiles.cpp +++ b/src/modules/comments/rawfiles/rawfiles.cpp @@ -2,9 +2,24 @@ * rawfiles.cpp - code for class 'RawFiles'- a module that produces HTML HREFs * pointing to actual text desired. Uses standard * files: ot and nt using indexs ??.bks ??.cps ??.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> @@ -13,6 +28,7 @@ #include <rawfiles.h> #include <filemgr.h> #include <versekey.h> +#include <sysdata.h> SWORD_NAMESPACE_START @@ -57,16 +73,9 @@ SWBuf &RawFiles::getRawEntryBuf() { FileDesc *datafile; long start = 0; unsigned short size = 0; - VerseKey *key = 0; - - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); + VerseKey *key = &getVerseKey(); - findOffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->TestamentIndex(), &start, &size); entryBuf = ""; if (size) { @@ -88,10 +97,6 @@ SWBuf &RawFiles::getRawEntryBuf() { } FileMgr::getSystemFileMgr()->close(datafile); } - - if (key != this->key) - delete key; - return entryBuf; } @@ -105,17 +110,11 @@ void RawFiles::setEntry(const char *inbuf, long len) { FileDesc *datafile; long start; unsigned short size; - VerseKey *key = 0; + VerseKey *key = &getVerseKey(); len = (len<0)?strlen(inbuf):len; - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); - findOffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->TestamentIndex(), &start, &size); if (size) { SWBuf tmpbuf; @@ -129,7 +128,7 @@ void RawFiles::setEntry(const char *inbuf, long len) { entryBuf = path; entryBuf += '/'; tmpbuf = getNextFilename(); - doSetText(key->Testament(), key->Index(), tmpbuf); + doSetText(key->Testament(), key->TestamentIndex(), tmpbuf); entryBuf += tmpbuf; } datafile = FileMgr::getSystemFileMgr()->open(entryBuf, FileMgr::CREAT|FileMgr::WRONLY|FileMgr::TRUNC); @@ -137,9 +136,6 @@ void RawFiles::setEntry(const char *inbuf, long len) { datafile->write(inbuf, len); } FileMgr::getSystemFileMgr()->close(datafile); - - if (key != this->key) - delete key; } @@ -154,36 +150,17 @@ void RawFiles::linkEntry(const SWKey *inkey) { long start; unsigned short size; - const VerseKey *key = 0; - - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, inkey); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); + const VerseKey *key = &getVerseKey(); - findOffset(key->Testament(), key->Index(), &start, &size); + findOffset(key->Testament(), key->TestamentIndex(), &start, &size); if (size) { SWBuf tmpbuf; readText(key->Testament(), start, size + 2, tmpbuf); - if (key != inkey) - delete key; - key = 0; - - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, inkey); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); - doSetText(key->Testament(), key->Index(), tmpbuf.c_str()); + key = &getVerseKey(inkey); + doSetText(key->Testament(), key->TestamentIndex(), tmpbuf.c_str()); } - - if (key != inkey) - delete key; } @@ -194,20 +171,8 @@ void RawFiles::linkEntry(const SWKey *inkey) { */ void RawFiles::deleteEntry() { - - VerseKey *key = 0; - - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); - - doSetText(key->Testament(), key->Index(), ""); - - if (key != this->key) - delete key; + VerseKey *key = &getVerseKey(); + doSetText(key->Testament(), key->TestamentIndex(), ""); } @@ -220,32 +185,40 @@ void RawFiles::deleteEntry() { char *RawFiles::getNextFilename() { static char incfile[255]; - long number; + __u32 number; FileDesc *datafile; sprintf(incfile, "%s/incfile", path); datafile = FileMgr::getSystemFileMgr()->open(incfile, FileMgr::RDONLY); - if (datafile->read(&number, 4) != 4) - number = 0; + + if (datafile->read(&number, 4) != 4) number = 0; + number = swordtoarch32(number); + number++; FileMgr::getSystemFileMgr()->close(datafile); datafile = FileMgr::getSystemFileMgr()->open(incfile, FileMgr::CREAT|FileMgr::WRONLY|FileMgr::TRUNC); + sprintf(incfile, "%.7d", number-1); + + number = archtosword32(number); datafile->write(&number, 4); + FileMgr::getSystemFileMgr()->close(datafile); - sprintf(incfile, "%.7ld", number-1); return incfile; } char RawFiles::createModule (const char *path) { char *incfile = new char [ strlen (path) + 16 ]; - static long zero = 0; + + __u32 zero = 0; + zero = archtosword32(zero); + FileDesc *datafile; sprintf(incfile, "%s/incfile", path); datafile = FileMgr::getSystemFileMgr()->open(incfile, FileMgr::CREAT|FileMgr::WRONLY|FileMgr::TRUNC); - delete [] incfile; + delete [] incfile; datafile->write(&zero, 4); FileMgr::getSystemFileMgr()->close(datafile); diff --git a/src/modules/comments/swcom.cpp b/src/modules/comments/swcom.cpp index 94f92c9..e82751b 100644 --- a/src/modules/comments/swcom.cpp +++ b/src/modules/comments/swcom.cpp @@ -1,14 +1,34 @@ /****************************************************************************** * swcom.cpp - code for base class 'SWCom'- The basis for all commentary * modules + * + * + * 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 <utilstr.h> #include <swcom.h> #include <localemgr.h> #include <versekey.h> + SWORD_NAMESPACE_START + /****************************************************************************** * SWCom Constructor - Initializes data for instance of SWCom * @@ -17,10 +37,14 @@ SWORD_NAMESPACE_START * idisp - Display object to use for displaying */ -SWCom::SWCom(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang): SWModule(imodname, imoddesc, idisp, (char *)"Commentaries", enc, dir, mark, ilang) { +SWCom::SWCom(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char *ilang, const char *versification): SWModule(imodname, imoddesc, idisp, "Commentaries", enc, dir, mark, ilang) { + this->versification = 0; + stdstr(&(this->versification), versification); delete key; - key = CreateKey(); - tmpVK = new VerseKey(); + key = (VerseKey *)CreateKey(); + tmpVK1 = (VerseKey *)CreateKey(); + tmpVK2 = (VerseKey *)CreateKey(); + tmpSecond = false; } @@ -29,62 +53,53 @@ SWCom::SWCom(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWTex */ SWCom::~SWCom() { - delete tmpVK; + delete tmpVK1; + delete tmpVK2; + delete [] versification; } -SWKey *SWCom::CreateKey() { return new VerseKey(); } - +SWKey *SWCom::CreateKey() const { + VerseKey *vk = new VerseKey(); -long SWCom::Index() const { - VerseKey *key = 0; - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); + vk->setVersificationSystem(versification); - entryIndex = key->NewIndex(); + return vk; +} - if (key != this->key) - delete key; +long SWCom::Index() const { + VerseKey *key = &getVerseKey(); + entryIndex = key->Index(); return entryIndex; } long SWCom::Index(long iindex) { - VerseKey *key = 0; - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); - + VerseKey *key = &getVerseKey(); key->Testament(1); key->Index(iindex); if (key != this->key) { this->key->copyFrom(*key); - delete key; } return Index(); } -VerseKey &SWCom::getVerseKey() const { - VerseKey *key = NULL; +VerseKey &SWCom::getVerseKey(const SWKey *keyToConvert) const { + const SWKey *thisKey = keyToConvert ? keyToConvert : this->key; + + VerseKey *key = 0; // see if we have a VerseKey * or decendant SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); + key = SWDYNAMIC_CAST(VerseKey, thisKey); } SWCATCH ( ... ) { } if (!key) { ListKey *lkTest = 0; SWTRY { - lkTest = SWDYNAMIC_CAST(ListKey, this->key); + lkTest = SWDYNAMIC_CAST(ListKey, thisKey); } SWCATCH ( ... ) { } if (lkTest) { @@ -95,11 +110,14 @@ VerseKey &SWCom::getVerseKey() const { } } if (!key) { - tmpVK->setLocale(LocaleMgr::getSystemLocaleMgr()->getDefaultLocaleName()); - (*tmpVK) = *(this->key); - return (*tmpVK); + VerseKey *retKey = (tmpSecond) ? tmpVK1 : tmpVK2; + tmpSecond = !tmpSecond; + retKey->setLocale(LocaleMgr::getSystemLocaleMgr()->getDefaultLocaleName()); + (*retKey) = *(thisKey); + return (*retKey); } else return *key; } + SWORD_NAMESPACE_END diff --git a/src/modules/comments/zcom/zcom.cpp b/src/modules/comments/zcom/zcom.cpp index cdaea02..35b8946 100644 --- a/src/modules/comments/zcom/zcom.cpp +++ b/src/modules/comments/zcom/zcom.cpp @@ -1,9 +1,24 @@ /****************************************************************************** * rawcom.cpp - code for class 'zCom'- a module that reads raw commentary * files: ot and nt using indexs ??.bks ??.cps ??.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> @@ -26,7 +41,7 @@ SWORD_NAMESPACE_START * idisp - Display object to use for displaying */ -zCom::zCom(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, -1, iblockType, icomp), SWCom(iname, idesc, idisp, enc, dir, mark, ilang)/*, SWCompress()*/ +zCom::zCom(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, -1, iblockType, icomp), SWCom(iname, idesc, idisp, enc, dir, mark, ilang, versification)/*, SWCompress()*/ { blockType = iblockType; lastWriteKey = 0; @@ -58,13 +73,14 @@ bool zCom::isWritable() { SWBuf &zCom::getRawEntryBuf() { long start = 0; unsigned short size = 0; + unsigned long buffnum; 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); @@ -104,7 +120,7 @@ void zCom::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 } @@ -112,19 +128,9 @@ void zCom::setEntry(const char *inbuf, long len) { void zCom::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); + const VerseKey *srckey = &getVerseKey(inkey); - doLinkEntry(destkey->Testament(), destkey->Index(), srckey->Index()); + doLinkEntry(destkey->Testament(), destkey->TestamentIndex(), srckey->TestamentIndex()); if (inkey != srckey) // free our key if we created a VerseKey delete srckey; @@ -139,7 +145,7 @@ void zCom::linkEntry(const SWKey *inkey) { void zCom::deleteEntry() { VerseKey *key = &getVerseKey(); - doSetText(key->Testament(), key->Index(), ""); + doSetText(key->Testament(), key->TestamentIndex(), ""); } @@ -154,24 +160,25 @@ void zCom::deleteEntry() { void zCom::increment(int steps) { 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 // && (start > 0) @@ -184,5 +191,27 @@ void zCom::increment(int steps) { error = (error) ? KEYERR_OUTOFBOUNDS : 0; } +bool zCom::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 zCom::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 diff --git a/src/modules/common/entriesblk.cpp b/src/modules/common/entriesblk.cpp index 216abd8..6e4c9aa 100644 --- a/src/modules/common/entriesblk.cpp +++ b/src/modules/common/entriesblk.cpp @@ -1,3 +1,20 @@ +/* + * 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 <entriesblk.h> #include <stdlib.h> #include <string.h> diff --git a/src/modules/common/lzsscomprs.cpp b/src/modules/common/lzsscomprs.cpp index bd8f768..00177db 100644 --- a/src/modules/common/lzsscomprs.cpp +++ b/src/modules/common/lzsscomprs.cpp @@ -1,6 +1,22 @@ /****************************************************************************** * lzsscomprs.cpp - code for class 'LZSSCompress'- a driver class that * provides LZSS compression + * + * + * 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 <stdlib.h> diff --git a/src/modules/common/rawstr.cpp b/src/modules/common/rawstr.cpp index d2da1e9..6f17628 100644 --- a/src/modules/common/rawstr.cpp +++ b/src/modules/common/rawstr.cpp @@ -1,11 +1,26 @@ /****************************************************************************** * rawstr.cpp - code for class 'RawStr'- a module that reads raw text - * files: ot and nt using indexs ??.bks ??.cps ??.vss - * and provides lookup and parsing functions based on - * class StrKey + * files: ot and nt using indexs ??.bks ??.cps ??.vss + * and provides lookup and parsing functions based on + * class StrKey + * + * + * 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 <stdio.h> #include <fcntl.h> #include <errno.h> @@ -27,6 +42,8 @@ SWORD_NAMESPACE_START int RawStr::instance = 0; char RawStr::nl = '\n'; +const int RawStr::IDXENTRYSIZE = 6; + /****************************************************************************** @@ -88,7 +105,7 @@ RawStr::~RawStr() * buf - address of pointer to allocate for storage of string */ -void RawStr::getIDXBufDat(long ioffset, char **buf) +void RawStr::getIDXBufDat(long ioffset, char **buf) const { int size; char ch; @@ -122,9 +139,9 @@ void RawStr::getIDXBufDat(long ioffset, char **buf) * buf - address of pointer to allocate for storage of string */ -void RawStr::getIDXBuf(long ioffset, char **buf) +void RawStr::getIDXBuf(long ioffset, char **buf) const { - long offset; + __u32 offset; if (idxfd > 0) { idxfd->seek(ioffset, SEEK_SET); @@ -149,17 +166,18 @@ void RawStr::getIDXBuf(long ioffset, char **buf) * RET: error status -1 general error; -2 new file */ -signed char RawStr::findOffset(const char *ikey, long *start, unsigned short *size, long away, long *idxoff) +signed char RawStr::findOffset(const char *ikey, __u32 *start, __u16 *size, long away, __u32 *idxoff) const { char *trybuf, *maxbuf, *key = 0, quitflag = 0; signed char retval = -1; long headoff, tailoff, tryoff = 0, maxoff = 0; int diff = 0; + bool awayFromSubstrCheck = false; if (idxfd->getFd() >=0) { tailoff = maxoff = idxfd->seek(0, SEEK_END) - 6; retval = (tailoff >= 0) ? 0 : -2; // if NOT new file - if (*ikey) { + if (*ikey && retval != -2) { headoff = 0; stdstr(&key, ikey, 3); @@ -203,6 +221,7 @@ signed char RawStr::findOffset(const char *ikey, long *start, unsigned short *si if (headoff >= tailoff) { tryoff = headoff; if (!substr && ((tryoff != maxoff)||(strncmp(key, maxbuf, keylen)<0))) { + awayFromSubstrCheck = true; away--; // if our entry doesn't startwith our key, prefer the previous entry over the next } } @@ -216,17 +235,19 @@ signed char RawStr::findOffset(const char *ikey, long *start, unsigned short *si idxfd->seek(tryoff, SEEK_SET); - *start = *size = 0; - idxfd->read(start, 4); - idxfd->read(size, 2); + __u32 tmpStart; + __u16 tmpSize; + *start = *size = tmpStart = tmpSize = 0; + idxfd->read(&tmpStart, 4); + idxfd->read(&tmpSize, 2); if (idxoff) *idxoff = tryoff; - *start = swordtoarch32(*start); - *size = swordtoarch16(*size); + *start = swordtoarch32(tmpStart); + *size = swordtoarch16(tmpSize); while (away) { - long laststart = *start; + unsigned long laststart = *start; unsigned short lastsize = *size; long lasttry = tryoff; tryoff += (away > 0) ? 6 : -6; @@ -237,7 +258,8 @@ signed char RawStr::findOffset(const char *ikey, long *start, unsigned short *si else if (idxfd->seek(tryoff, SEEK_SET) < 0) bad = true; if (bad) { - retval = -1; + if(!awayFromSubstrCheck) + retval = -1; *start = laststart; *size = lastsize; tryoff = lasttry; @@ -245,15 +267,15 @@ signed char RawStr::findOffset(const char *ikey, long *start, unsigned short *si *idxoff = tryoff; break; } - idxfd->read(start, 4); - idxfd->read(size, 2); + idxfd->read(&tmpStart, 4); + idxfd->read(&tmpSize, 2); if (idxoff) *idxoff = tryoff; - *start = swordtoarch32(*start); - *size = swordtoarch16(*size); + *start = swordtoarch32(tmpStart); + *size = swordtoarch16(tmpSize); - if (((laststart != *start) || (lastsize != *size)) && (*start >= 0) && (*size)) + if (((laststart != *start) || (lastsize != *size)) && (*size)) away += (away < 0) ? 1 : -1; } @@ -271,65 +293,6 @@ signed char RawStr::findOffset(const char *ikey, long *start, unsigned short *si /****************************************************************************** - * RawStr::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 RawStr::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; - } -} - - -/****************************************************************************** * RawStr::readtext - gets text at a given offset * * ENT: @@ -339,12 +302,12 @@ void RawStr::prepText(SWBuf &buf) { * */ -void RawStr::readText(long istart, unsigned short *isize, char **idxbuf, SWBuf &buf) +void RawStr::readText(__u32 istart, __u16 *isize, char **idxbuf, SWBuf &buf) { unsigned int ch; char *idxbuflocal = 0; getIDXBufDat(istart, &idxbuflocal); - long start = istart; + __u32 start = istart; do { if (*idxbuf) @@ -401,12 +364,12 @@ void RawStr::readText(long istart, unsigned short *isize, char **idxbuf, SWBuf & void RawStr::doSetText(const char *ikey, const char *buf, long len) { - long start, outstart; - long idxoff; - long endoff; - long shiftSize; - unsigned short size; - unsigned short outsize; + __u32 start, outstart; + __u32 idxoff; + __u32 endoff; + __s32 shiftSize; + __u16 size; + __u16 outsize; static const char nl[] = {13, 10}; char *tmpbuf = 0; char *key = 0; @@ -526,7 +489,6 @@ void RawStr::doLinkEntry(const char *destkey, const char *srckey) { delete [] text; } - /****************************************************************************** * RawLD::CreateModule - Creates new module files * diff --git a/src/modules/common/rawstr4.cpp b/src/modules/common/rawstr4.cpp index cbc8384..003b2fe 100644 --- a/src/modules/common/rawstr4.cpp +++ b/src/modules/common/rawstr4.cpp @@ -1,8 +1,24 @@ /****************************************************************************** * rawstr.cpp - code for class 'RawStr'- a module that reads raw text - * files: ot and nt using indexs ??.bks ??.cps ??.vss - * and provides lookup and parsing functions based on - * class StrKey + * files: ot and nt using indexs ??.bks ??.cps ??.vss + * and provides lookup and parsing functions based on + * class StrKey + * + * + * 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 <stdio.h> @@ -26,6 +42,7 @@ SWORD_NAMESPACE_START */ int RawStr4::instance = 0; +const int RawStr4::IDXENTRYSIZE = 8; /****************************************************************************** @@ -88,7 +105,8 @@ RawStr4::~RawStr4() * buf - address of pointer to allocate for storage of string */ -void RawStr4::getIDXBufDat(long ioffset, char **buf) { +void RawStr4::getIDXBufDat(long ioffset, char **buf) const +{ int size; char ch; if (datfd > 0) { @@ -121,14 +139,14 @@ void RawStr4::getIDXBufDat(long ioffset, char **buf) { * buf - address of pointer to allocate for storage of string */ -void RawStr4::getIDXBuf(long ioffset, char **buf) +void RawStr4::getIDXBuf(long ioffset, char **buf) const { - long offset; + __u32 offset; if (idxfd > 0) { idxfd->seek(ioffset, SEEK_SET); - idxfd->read(&offset, 4); + idxfd->read(&offset, 4); offset = swordtoarch32(offset); getIDXBufDat(offset, buf); @@ -157,17 +175,19 @@ void RawStr4::getIDXBuf(long ioffset, char **buf) * RET: error status -1 general error; -2 new file */ -signed char RawStr4::findOffset(const char *ikey, long *start, unsigned long *size, long away, long *idxoff) +signed char RawStr4::findOffset(const char *ikey, __u32 *start, __u32 *size, long away, __u32 *idxoff) const { char *trybuf, *maxbuf, *key = 0, quitflag = 0; signed char retval = -1; long headoff, tailoff, tryoff = 0, maxoff = 0; int diff = 0; + bool awayFromSubstrCheck = false; if (idxfd->getFd() >=0) { tailoff = maxoff = idxfd->seek(0, SEEK_END) - 8; + retval = (tailoff >= 0) ? 0 : -2; // if NOT new file - if (*ikey) { + if (*ikey && retval != -2) { headoff = 0; stdstr(&key, ikey, 3); @@ -211,6 +231,7 @@ signed char RawStr4::findOffset(const char *ikey, long *start, unsigned long *si if (headoff >= tailoff) { tryoff = headoff; if (!substr && ((tryoff != maxoff)||(strncmp(key, maxbuf, keylen)<0))) { + awayFromSubstrCheck = true; away--; // if our entry doesn't startwith our key, prefer the previous entry over the next } } @@ -224,17 +245,18 @@ signed char RawStr4::findOffset(const char *ikey, long *start, unsigned long *si idxfd->seek(tryoff, SEEK_SET); - *start = *size = 0; - idxfd->read(start, 4); - idxfd->read(size, 4); + __u32 tmpStart, tmpSize; + *start = *size = tmpStart = tmpSize = 0; + idxfd->read(&tmpStart, 4); + idxfd->read(&tmpSize, 4); if (idxoff) *idxoff = tryoff; - *start = swordtoarch32(*start); - *size = swordtoarch32(*size); + *start = swordtoarch32(tmpStart); + *size = swordtoarch32(tmpSize); while (away) { - long laststart = *start; + unsigned long laststart = *start; unsigned long lastsize = *size; long lasttry = tryoff; tryoff += (away > 0) ? 8 : -8; @@ -245,7 +267,8 @@ signed char RawStr4::findOffset(const char *ikey, long *start, unsigned long *si else if (idxfd->seek(tryoff, SEEK_SET) < 0) bad = true; if (bad) { - retval = -1; + if(!awayFromSubstrCheck) + retval = -1; *start = laststart; *size = lastsize; tryoff = lasttry; @@ -253,15 +276,15 @@ signed char RawStr4::findOffset(const char *ikey, long *start, unsigned long *si *idxoff = tryoff; break; } - idxfd->read(start, 4); - idxfd->read(size, 4); + idxfd->read(&tmpStart, 4); + idxfd->read(&tmpSize, 4); if (idxoff) *idxoff = tryoff; - *start = swordtoarch32(*start); - *size = swordtoarch32(*size); + *start = swordtoarch32(tmpStart); + *size = swordtoarch32(tmpSize); - if (((laststart != *start) || (lastsize != *size)) && (*start >= 0) && (*size)) + if (((laststart != *start) || (lastsize != *size)) && (*size)) away += (away < 0) ? 1 : -1; } @@ -279,65 +302,6 @@ signed char RawStr4::findOffset(const char *ikey, long *start, unsigned long *si /****************************************************************************** - * RawStr4::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 RawStr4::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; - } -} - - -/****************************************************************************** * RawStr4::readtext - gets text at a given offset * * ENT: @@ -347,12 +311,12 @@ void RawStr4::prepText(SWBuf &buf) { * */ -void RawStr4::readText(long istart, unsigned long *isize, char **idxbuf, SWBuf &buf) +void RawStr4::readText(__u32 istart, __u32 *isize, char **idxbuf, SWBuf &buf) { unsigned int ch; char *idxbuflocal = 0; getIDXBufDat(istart, &idxbuflocal); - long start = istart; + __u32 start = istart; do { if (*idxbuf) @@ -408,12 +372,12 @@ void RawStr4::readText(long istart, unsigned long *isize, char **idxbuf, SWBuf & void RawStr4::doSetText(const char *ikey, const char *buf, long len) { - long start, outstart; - long idxoff; - long endoff; - long shiftSize; - unsigned long size; - unsigned long outsize; + __u32 start, outstart; + __u32 idxoff; + __u32 endoff; + __s32 shiftSize; + __u32 size; + __u32 outsize; static const char nl[] = {13, 10}; char *tmpbuf = 0; char *key = 0; diff --git a/src/modules/common/rawverse.cpp b/src/modules/common/rawverse.cpp index 934082c..99beaa2 100644 --- a/src/modules/common/rawverse.cpp +++ b/src/modules/common/rawverse.cpp @@ -3,9 +3,26 @@ * files: ot and nt using indexs ??.bks ??.cps ??.vss * and provides lookup and parsing functions based on * class VerseKey + * + * + * 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> @@ -96,18 +113,20 @@ RawVerse::~RawVerse() * size - address to store the size of the entry */ -void RawVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *size) { +void RawVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *size) const { idxoff *= 6; if (!testmt) testmt = ((idxfp[1]) ? 1:2); if (idxfp[testmt-1]->getFd() >= 0) { idxfp[testmt-1]->seek(idxoff, SEEK_SET); - idxfp[testmt-1]->read(start, 4); - long len = idxfp[testmt-1]->read(size, 2); // read size + __s32 tmpStart; + __u16 tmpSize; + idxfp[testmt-1]->read(&tmpStart, 4); + long len = idxfp[testmt-1]->read(&tmpSize, 2); // read size - *start = swordtoarch32(*start); - *size = swordtoarch16(*size); + *start = swordtoarch32(tmpStart); + *size = swordtoarch16(tmpSize); if (len < 2) { *size = (unsigned short)((*start) ? (textfp[testmt-1]->seek(0, SEEK_END) - (long)*start) : 0); // if for some reason we get an error reading size, make size to end of file @@ -121,65 +140,6 @@ void RawVerse::findOffset(char testmt, long idxoff, long *start, unsigned short /****************************************************************************** - * RawVerse::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 RawVerse::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; - } -} - - -/****************************************************************************** * RawVerse::readtext - gets text at a given offset * * ENT: testmt - testament file to search in (0 - Old; 1 - New) @@ -215,17 +175,16 @@ void RawVerse::readText(char testmt, long start, unsigned short size, SWBuf &buf void RawVerse::doSetText(char testmt, long idxoff, const char *buf, long len) { - long start, outstart; - unsigned short size; - unsigned short outsize; + __s32 start; + __u16 size; idxoff *= 6; if (!testmt) testmt = ((idxfp[1]) ? 1:2); - size = outsize = (len < 0) ? strlen(buf) : len; + size = (len < 0) ? strlen(buf) : len; - start = outstart = textfp[testmt-1]->seek(0, SEEK_END); + start = textfp[testmt-1]->seek(0, SEEK_END); idxfp[testmt-1]->seek(idxoff, SEEK_SET); if (size) { @@ -239,13 +198,11 @@ void RawVerse::doSetText(char testmt, long idxoff, const char *buf, long len) start = 0; } - outstart = archtosword32(start); - outsize = archtosword16(size); - - idxfp[testmt-1]->write(&outstart, 4); - idxfp[testmt-1]->write(&outsize, 2); - + start = archtosword32(start); + size = archtosword16(size); + idxfp[testmt-1]->write(&start, 4); + idxfp[testmt-1]->write(&size, 2); } @@ -258,8 +215,8 @@ void RawVerse::doSetText(char testmt, long idxoff, const char *buf, long len) */ void RawVerse::doLinkEntry(char testmt, long destidxoff, long srcidxoff) { - long start; - unsigned short size; + __s32 start; + __u16 size; destidxoff *= 6; srcidxoff *= 6; @@ -280,13 +237,13 @@ void RawVerse::doLinkEntry(char testmt, long destidxoff, long srcidxoff) { /****************************************************************************** - * RawVerse::CreateModule - Creates new module files + * RawVerse::createModule - Creates new module files * * ENT: path - directory to store module files * RET: error status */ -char RawVerse::createModule(const char *ipath) +char RawVerse::createModule(const char *ipath, const char *v11n) { char *path = 0; char *buf = new char [ strlen (ipath) + 20 ]; @@ -320,11 +277,16 @@ char RawVerse::createModule(const char *ipath) fd2->getFd(); VerseKey vk; + vk.setVersificationSystem(v11n); vk.Headings(1); - long offset = 0; - short size = 0; + + __s32 offset = 0; + __u16 size = 0; + offset = archtosword32(offset); + size = archtosword16(size); + for (vk = TOP; !vk.Error(); vk++) { - if (vk.Testament() == 1) { + if (vk.Testament() < 2) { fd->write(&offset, 4); fd->write(&size, 2); } @@ -333,16 +295,14 @@ char RawVerse::createModule(const char *ipath) fd2->write(&size, 2); } } + fd2->write(&offset, 4); + fd2->write(&size, 2); FileMgr::getSystemFileMgr()->close(fd); FileMgr::getSystemFileMgr()->close(fd2); delete [] path; delete [] buf; -/* - RawVerse rv(path); - VerseKey mykey("Rev 22:21"); -*/ return 0; } diff --git a/src/modules/common/rawverse4.cpp b/src/modules/common/rawverse4.cpp index bd438ec..ee0b207 100644 --- a/src/modules/common/rawverse4.cpp +++ b/src/modules/common/rawverse4.cpp @@ -3,9 +3,26 @@ * files: ot and nt using indexs ??.bks ??.cps ??.vss * and provides lookup and parsing functions based on * class VerseKey + * + * + * 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> @@ -96,18 +113,20 @@ RawVerse4::~RawVerse4() * size - address to store the size of the entry */ -void RawVerse4::findOffset(char testmt, long idxoff, long *start, unsigned long *size) { +void RawVerse4::findOffset(char testmt, long idxoff, long *start, unsigned long *size) const { idxoff *= 8; if (!testmt) testmt = ((idxfp[1]) ? 1:2); if (idxfp[testmt-1]->getFd() >= 0) { idxfp[testmt-1]->seek(idxoff, SEEK_SET); - idxfp[testmt-1]->read(start, 4); - long len = idxfp[testmt-1]->read(size, 4); // read size + __u32 tmpStart; + __u32 tmpSize; + idxfp[testmt-1]->read(&tmpStart, 4); + long len = idxfp[testmt-1]->read(&tmpSize, 4); // read size - *start = swordtoarch32(*start); - *size = swordtoarch32(*size); + *start = swordtoarch32(tmpStart); + *size = swordtoarch32(tmpSize); if (len < 2) { *size = (unsigned long)((*start) ? (textfp[testmt-1]->seek(0, SEEK_END) - (long)*start) : 0); // if for some reason we get an error reading size, make size to end of file @@ -121,65 +140,6 @@ void RawVerse4::findOffset(char testmt, long idxoff, long *start, unsigned long /****************************************************************************** - * RawVerse4::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 RawVerse4::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; - } -} - - -/****************************************************************************** * RawVerse4::readtext - gets text at a given offset * * ENT: testmt - testament file to search in (0 - Old; 1 - New) @@ -215,17 +175,16 @@ void RawVerse4::readText(char testmt, long start, unsigned long size, SWBuf &buf void RawVerse4::doSetText(char testmt, long idxoff, const char *buf, long len) { - long start, outstart; - unsigned long size; - unsigned long outsize; + __u32 start; + __u32 size; idxoff *= 8; if (!testmt) testmt = ((idxfp[1]) ? 1:2); - size = outsize = (len < 0) ? strlen(buf) : len; + size = (len < 0) ? strlen(buf) : len; - start = outstart = textfp[testmt-1]->seek(0, SEEK_END); + start = textfp[testmt-1]->seek(0, SEEK_END); idxfp[testmt-1]->seek(idxoff, SEEK_SET); if (size) { @@ -239,13 +198,11 @@ void RawVerse4::doSetText(char testmt, long idxoff, const char *buf, long len) start = 0; } - outstart = archtosword32(start); - outsize = archtosword32(size); - - idxfp[testmt-1]->write(&outstart, 4); - idxfp[testmt-1]->write(&outsize, 4); - + start = archtosword32(start); + size = archtosword32(size); + idxfp[testmt-1]->write(&start, 4); + idxfp[testmt-1]->write(&size, 4); } @@ -258,8 +215,8 @@ void RawVerse4::doSetText(char testmt, long idxoff, const char *buf, long len) */ void RawVerse4::doLinkEntry(char testmt, long destidxoff, long srcidxoff) { - long start; - unsigned long size; + __u32 start; + __u32 size; destidxoff *= 8; srcidxoff *= 8; @@ -286,7 +243,7 @@ void RawVerse4::doLinkEntry(char testmt, long destidxoff, long srcidxoff) { * RET: error status */ -char RawVerse4::createModule(const char *ipath) +char RawVerse4::createModule(const char *ipath, const char *v11n) { char *path = 0; char *buf = new char [ strlen (ipath) + 20 ]; @@ -320,11 +277,15 @@ char RawVerse4::createModule(const char *ipath) fd2->getFd(); VerseKey vk; + vk.setVersificationSystem(v11n); vk.Headings(1); - long offset = 0; - long size = 0; + __u32 offset = 0; + __u32 size = 0; + offset = archtosword32(offset); + size = archtosword32(size); + for (vk = TOP; !vk.Error(); vk++) { - if (vk.Testament() == 1) { + if (vk.Testament() < 2) { fd->write(&offset, 4); fd->write(&size, 4); } @@ -333,16 +294,14 @@ char RawVerse4::createModule(const char *ipath) fd2->write(&size, 4); } } + fd2->write(&offset, 4); + fd2->write(&size, 4); FileMgr::getSystemFileMgr()->close(fd); FileMgr::getSystemFileMgr()->close(fd2); delete [] path; delete [] buf; -/* - RawVerse4 rv(path); - VerseKey mykey("Rev 22:21"); -*/ return 0; } diff --git a/src/modules/common/swcipher.cpp b/src/modules/common/swcipher.cpp index bd4d551..5ab91ea 100644 --- a/src/modules/common/swcipher.cpp +++ b/src/modules/common/swcipher.cpp @@ -1,8 +1,25 @@ /****************************************************************************** * swcipher.cpp - code for class 'SWCipher'- a driver class that provides * cipher utilities. + * + * + * 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 <stdlib.h> #include <string.h> #include <swcipher.h> diff --git a/src/modules/common/swcomprs.cpp b/src/modules/common/swcomprs.cpp index 02d7d7b..378c8b1 100644 --- a/src/modules/common/swcomprs.cpp +++ b/src/modules/common/swcomprs.cpp @@ -1,8 +1,25 @@ /****************************************************************************** * swcomprs.cpp - code for class 'SWCompress'- a driver class that provides * compression utilities. + * + * + * 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 <stdlib.h> #include <string.h> #include <swcomprs.h> diff --git a/src/modules/common/zipcomprs.cpp b/src/modules/common/zipcomprs.cpp index 21726bf..534d840 100644 --- a/src/modules/common/zipcomprs.cpp +++ b/src/modules/common/zipcomprs.cpp @@ -1,8 +1,25 @@ /****************************************************************************** * swcomprs.cpp - code for class 'ZipCompress'- a driver class that provides * compression utilities. - using zlib + * + * + * 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 <stdlib.h> #include <string.h> #include <stdio.h> diff --git a/src/modules/common/zstr.cpp b/src/modules/common/zstr.cpp index 2539ff0..5b4da64 100644 --- a/src/modules/common/zstr.cpp +++ b/src/modules/common/zstr.cpp @@ -2,8 +2,25 @@ * zstr.cpp - code for class 'zStr'- a module that reads compressed text * files and provides lookup and parsing functions based on * class StrKey + * + * + * 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 <stdio.h> #include <fcntl.h> #include <errno.h> @@ -111,7 +128,8 @@ zStr::~zStr() { * buf - address of pointer to allocate for storage of string */ -void zStr::getKeyFromDatOffset(long ioffset, char **buf) { +void zStr::getKeyFromDatOffset(long ioffset, char **buf) const +{ int size; char ch; if (datfd > 0) { @@ -144,12 +162,13 @@ void zStr::getKeyFromDatOffset(long ioffset, char **buf) { * buf - address of pointer to allocate for storage of string */ -void zStr::getKeyFromIdxOffset(long ioffset, char **buf) { +void zStr::getKeyFromIdxOffset(long ioffset, char **buf) const +{ __u32 offset; if (idxfd > 0) { idxfd->seek(ioffset, SEEK_SET); - idxfd->read(&offset, sizeof(__u32)); + idxfd->read(&offset, 4); offset = swordtoarch32(offset); getKeyFromDatOffset(offset, buf); } @@ -168,12 +187,14 @@ void zStr::getKeyFromIdxOffset(long ioffset, char **buf) { * RET: error status */ -signed char zStr::findKeyIndex(const char *ikey, long *idxoff, long away) { +signed char zStr::findKeyIndex(const char *ikey, long *idxoff, long away) const +{ char *maxbuf = 0, *trybuf = 0, *key = 0, quitflag = 0; signed char retval = 0; __s32 headoff, tailoff, tryoff = 0, maxoff = 0; __u32 start, size; int diff = 0; + bool awayFromSubstrCheck = false; if (idxfd->getFd() >= 0) { tailoff = maxoff = idxfd->seek(0, SEEK_END) - IDXENTRYSIZE; @@ -220,6 +241,7 @@ signed char zStr::findKeyIndex(const char *ikey, long *idxoff, long away) { if (headoff >= tailoff) { tryoff = headoff; if (!substr && ((tryoff != maxoff)||(strncmp(key, maxbuf, keylen)<0))) { + awayFromSubstrCheck = true; away--; // if our entry doesn't startwith our key, prefer the previous entry over the next } } @@ -234,8 +256,8 @@ signed char zStr::findKeyIndex(const char *ikey, long *idxoff, long away) { idxfd->seek(tryoff, SEEK_SET); start = size = 0; - retval = (idxfd->read(&start, sizeof(__u32))==sizeof(__u32)) ? retval : -1; - retval = (idxfd->read(&size, sizeof(__u32))==sizeof(__u32)) ? retval : -1; + retval = (idxfd->read(&start, 4) == 4) ? retval : -1; + retval = (idxfd->read(&size, 4) == 4) ? retval : -1; start = swordtoarch32(start); size = swordtoarch32(size); @@ -254,7 +276,8 @@ signed char zStr::findKeyIndex(const char *ikey, long *idxoff, long away) { else if (idxfd->seek(tryoff, SEEK_SET) < 0) bad = true; if (bad) { - retval = -1; + if(!awayFromSubstrCheck) + retval = -1; start = laststart; size = lastsize; tryoff = lasttry; @@ -262,8 +285,8 @@ signed char zStr::findKeyIndex(const char *ikey, long *idxoff, long away) { *idxoff = tryoff; break; } - idxfd->read(&start, sizeof(__u32)); - idxfd->read(&size, sizeof(__u32)); + idxfd->read(&start, 4); + idxfd->read(&size, 4); start = swordtoarch32(start); size = swordtoarch32(size); @@ -287,65 +310,6 @@ signed char zStr::findKeyIndex(const char *ikey, long *idxoff, long away) { /****************************************************************************** - * zStr::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 zStr::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; - } -} - - -/****************************************************************************** * zStr::getText - gets text at a given offset * * ENT: @@ -366,8 +330,8 @@ void zStr::getText(long offset, char **idxbuf, char **buf) { do { idxfd->seek(offset, SEEK_SET); - idxfd->read(&start, sizeof(__u32)); - idxfd->read(&size, sizeof(__u32)); + idxfd->read(&start, 4); + idxfd->read(&size, 4); start = swordtoarch32(start); size = swordtoarch32(size); @@ -430,8 +394,8 @@ void zStr::getCompressedText(long block, long entry, char **buf) { __u32 start = 0; zdxfd->seek(block * ZDXENTRYSIZE, SEEK_SET); - zdxfd->read(&start, sizeof(__u32)); - zdxfd->read(&size, sizeof(__u32)); + zdxfd->read(&start, 4); + zdxfd->read(&size, 4); start = swordtoarch32(start); size = swordtoarch32(size); @@ -496,8 +460,8 @@ void zStr::setText(const char *ikey, const char *buf, long len) { else if ((!diff) && (len > 0 /*we're not deleting*/)) { // got absolute entry do { idxfd->seek(idxoff, SEEK_SET); - idxfd->read(&start, sizeof(__u32)); - idxfd->read(&size, sizeof(__u32)); + idxfd->read(&start, 4); + idxfd->read(&size, 4); start = swordtoarch32(start); size = swordtoarch32(size); @@ -581,8 +545,8 @@ void zStr::setText(const char *ikey, const char *buf, long len) { // add a new line to make data file easier to read in an editor datfd->write(&nl, 2); - idxfd->write(&outstart, sizeof(__u32)); - idxfd->write(&outsize, sizeof(__u32)); + idxfd->write(&outstart, 4); + idxfd->write(&outsize, 4); if (idxBytes) { idxfd->write(idxBytes, shiftSize); } @@ -644,8 +608,8 @@ void zStr::flushCache() { } else { zdxfd->seek(cacheBlockIndex * ZDXENTRYSIZE, SEEK_SET); - zdxfd->read(&start, sizeof(__u32)); - zdxfd->read(&outsize, sizeof(__u32)); + zdxfd->read(&start, 4); + zdxfd->read(&outsize, 4); start = swordtoarch32(start); outsize = swordtoarch32(outsize); if (start + outsize >= zdtSize) { // last entry, just overwrite @@ -671,8 +635,8 @@ void zStr::flushCache() { // add a new line to make data file easier to read in an editor zdtfd->write(&nl, 2); - zdxfd->write(&outstart, sizeof(__u32)); - zdxfd->write(&outsize, sizeof(__u32)); + zdxfd->write(&outstart, 4); + zdxfd->write(&outsize, 4); } delete cacheBlock; cacheBlock = 0; diff --git a/src/modules/common/zverse.cpp b/src/modules/common/zverse.cpp index 3f91918..fa76467 100644 --- a/src/modules/common/zverse.cpp +++ b/src/modules/common/zverse.cpp @@ -1,11 +1,28 @@ /****************************************************************************** * 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 + * files: ot and nt using indexs ??.bks ??.cps ??.vss + * and provides lookup and parsing functions based on + * class VerseKey for compressed modules + * + * + * 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> @@ -129,19 +146,15 @@ zVerse::~zVerse() * size - address to store the size of the entry */ -void zVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *size) +void zVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *size, unsigned long *buffnum) const { + __u32 ulBuffNum = 0; // buffer number + __u32 ulVerseStart = 0; // verse offset within buffer + __u16 usVerseSize = 0; // verse 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 - - *start = *size = 0; + *start = *size = *buffnum = 0; //printf ("Finding offset %ld\n", idxoff); idxoff *= 10; if (!testmt) { @@ -159,10 +172,8 @@ void zVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *s return; } } - else return; - - ulBuffNum = swordtoarch32(ulBuffNum); - + else return; + if (compfp[testmt-1]->read(&ulVerseStart, 4) < 2) { printf ("Error reading ulVerseStart\n"); @@ -174,17 +185,39 @@ void zVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *s return; } + *buffnum = swordtoarch32(ulBuffNum); *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); +/****************************************************************************** + * 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, unsigned long ulBuffNum, SWBuf &inBuf) { + __u32 ulCompOffset = 0; // compressed buffer start + __u32 ulCompSize = 0; // buffer size compressed + __u32 ulUnCompSize = 0; // buffer size uncompressed + + if (!testmt) { + testmt = ((idxfp[0]) ? 1:2); + } + + // assert we have and valid file descriptor + if (compfp[testmt-1]->getFd() < 1) + return; + + if (size && + !(((long) ulBuffNum == cacheBufIdx) && (testmt == cacheTestament) && (cacheBuf))) { + //printf ("Got buffer number{%ld} versestart{%ld} versesize{%d}\n", ulBuffNum, ulVerseStart, usVerseSize); if (idxfp[testmt-1]->seek(ulBuffNum*12, SEEK_SET)!=(long) ulBuffNum*12) { @@ -226,7 +259,8 @@ void zVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *s pcCompText.setSize(ulCompSize); rawZFilter(pcCompText, 0); // 0 = decipher - compressor->zBuf(&ulCompSize, pcCompText.getRawData()); + unsigned long bufSize = ulCompSize; + compressor->zBuf(&bufSize, pcCompText.getRawData()); if (cacheBuf) { flushCache(); @@ -237,26 +271,13 @@ void zVerse::findOffset(char testmt, long idxoff, long *start, unsigned short *s compressor->Buf(0, &len); cacheBuf = (char *)calloc(len + 1, 1); memcpy(cacheBuf, compressor->Buf(), len); - + cacheBufSize = strlen(cacheBuf); // TODO: can we just use 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 = ""; - if ( (size > 0) && cacheBuf && ((unsigned)start < strlen(cacheBuf)) ){ //TODO: optimize this, remove strlen + if ((size > 0) && cacheBuf && ((unsigned)start < cacheBufSize)) { inBuf.setFillByte(0); inBuf.setSize(size+1); strncpy(inBuf.getRawData(), &(cacheBuf[start]), size); @@ -290,13 +311,12 @@ void zVerse::doSetText(char testmt, long idxoff, const char *buf, long len) { dirtyCache = true; - unsigned long start, outstart; - unsigned long outBufIdx = cacheBufIdx; - unsigned short size; - unsigned short outsize; + __u32 start; + __u16 size; + __u32 outBufIdx = cacheBufIdx; idxoff *= 10; - size = outsize = len; + size = len; start = strlen(cacheBuf); @@ -304,23 +324,23 @@ void zVerse::doSetText(char testmt, long idxoff, const char *buf, long len) { start = outBufIdx = 0; outBufIdx = archtosword32(outBufIdx); - outstart = archtosword32(start); - outsize = archtosword16(size); + start = archtosword32(start); + size = archtosword16(size); compfp[testmt-1]->seek(idxoff, SEEK_SET); compfp[testmt-1]->write(&outBufIdx, 4); - compfp[testmt-1]->write(&outstart, 4); - compfp[testmt-1]->write(&outsize, 2); + compfp[testmt-1]->write(&start, 4); + compfp[testmt-1]->write(&size, 2); strcat(cacheBuf, buf); } void zVerse::flushCache() { if (dirtyCache) { - unsigned long idxoff; - unsigned long start, outstart; - unsigned long size, outsize; - unsigned long zsize, outzsize; + __u32 idxoff; + __u32 start, outstart; + __u32 size, outsize; + __u32 zsize, outzsize; idxoff = cacheBufIdx * 12; if (cacheBuf) { @@ -331,12 +351,14 @@ void zVerse::flushCache() { // compressor = new LZSSCompress(); // } compressor->Buf(cacheBuf); - compressor->zBuf(&zsize); - outzsize = zsize; + unsigned long tmpSize; + compressor->zBuf(&tmpSize); + outzsize = zsize = tmpSize; SWBuf buf; buf.setSize(zsize + 5); - memcpy(buf.getRawData(), compressor->zBuf(&zsize), zsize); + memcpy(buf.getRawData(), compressor->zBuf(&tmpSize), tmpSize); + outzsize = zsize = tmpSize; buf.setSize(zsize); rawZFilter(buf, 1); // 1 = encipher @@ -369,9 +391,9 @@ void zVerse::flushCache() { */ void zVerse::doLinkEntry(char testmt, long destidxoff, long srcidxoff) { - long bufidx; - long start; - unsigned short size; + __s32 bufidx; + __s32 start; + __u16 size; destidxoff *= 10; srcidxoff *= 10; @@ -400,7 +422,7 @@ void zVerse::doLinkEntry(char testmt, long destidxoff, long srcidxoff) { * RET: error status */ -char zVerse::createModule(const char *ipath, int blockBound) +char zVerse::createModule(const char *ipath, int blockBound, const char *v11n) { char *path = 0; char *buf = new char [ strlen (ipath) + 20 ]; @@ -446,11 +468,16 @@ char zVerse::createModule(const char *ipath, int blockBound) fd2->getFd(); VerseKey vk; + vk.setVersificationSystem(v11n); vk.Headings(1); - long offset = 0; - short size = 0; + + __s32 offset = 0; + __s16 size = 0; + offset = archtosword32(offset); + size = archtosword16(size); + for (vk = TOP; !vk.Error(); vk++) { - if (vk.Testament() == 1) { + if (vk.Testament() < 2) { fd->write(&offset, 4); //compBufIdxOffset fd->write(&offset, 4); fd->write(&size, 2); @@ -461,78 +488,18 @@ char zVerse::createModule(const char *ipath, int blockBound) fd2->write(&size, 2); } } + fd2->write(&offset, 4); //compBufIdxOffset + fd2->write(&offset, 4); + fd2->write(&size, 2); FileMgr::getSystemFileMgr()->close(fd); FileMgr::getSystemFileMgr()->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 diff --git a/src/modules/filters/Makefile.am b/src/modules/filters/Makefile.am index 7092c73..f212cbf 100644 --- a/src/modules/filters/Makefile.am +++ b/src/modules/filters/Makefile.am @@ -53,17 +53,18 @@ OSISFIL += $(filtersdir)/osisscripref.cpp OSISFIL += $(filtersdir)/osisvariants.cpp OSISFIL += $(filtersdir)/osiswordjs.cpp OSISFIL += $(filtersdir)/osismorphsegmentation.cpp +OSISFIL += $(filtersdir)/osisruby.cpp libsword_la_SOURCES += $(filtersdir)/latin1utf8.cpp libsword_la_SOURCES += $(filtersdir)/latin1utf16.cpp libsword_la_SOURCES += $(filtersdir)/utf8utf16.cpp libsword_la_SOURCES += $(filtersdir)/utf16utf8.cpp -libsword_la_SOURCES += $(filtersdir)/scsuutf8.cpp libsword_la_SOURCES += $(filtersdir)/utf8html.cpp libsword_la_SOURCES += $(filtersdir)/utf8latin1.cpp libsword_la_SOURCES += $(filtersdir)/utf8cantillation.cpp libsword_la_SOURCES += $(filtersdir)/utf8hebrewpoints.cpp +libsword_la_SOURCES += $(filtersdir)/utf8arabicpoints.cpp libsword_la_SOURCES += $(filtersdir)/utf8greekaccents.cpp libsword_la_SOURCES += $(filtersdir)/cipherfil.cpp diff --git a/src/modules/filters/cipherfil.cpp b/src/modules/filters/cipherfil.cpp index 24c665e..34d0465 100644 --- a/src/modules/filters/cipherfil.cpp +++ b/src/modules/filters/cipherfil.cpp @@ -1,6 +1,21 @@ /****************************************************************************** * * cipherfil - SWFilter descendant to decipher a module + * + * 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. + * */ diff --git a/src/modules/filters/gbffootnotes.cpp b/src/modules/filters/gbffootnotes.cpp index bef29b8..a5384cb 100644 --- a/src/modules/filters/gbffootnotes.cpp +++ b/src/modules/filters/gbffootnotes.cpp @@ -2,6 +2,21 @@ * * gbffootnotes - SWFilter descendant to hide or show footnotes * in a GBF module. + * + * 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. + * */ @@ -33,7 +48,7 @@ GBFFootnotes::~GBFFootnotes() { char GBFFootnotes::processText (SWBuf &text, const SWKey *key, const SWModule *module) { - + SWBuf token; bool intoken = false; bool hide = false; @@ -42,11 +57,10 @@ char GBFFootnotes::processText (SWBuf &text, const SWKey *key, const SWModule *m SWBuf refs = ""; int footnoteNum = 1; char buf[254]; - VerseKey parser = key->getText(); SWBuf orig = text; const char *from = orig.c_str(); - + //XMLTag tag; for (text = ""; *from; from++) { @@ -61,7 +75,7 @@ char GBFFootnotes::processText (SWBuf &text, const SWKey *key, const SWModule *m //XMLTag tag(token); if (!strncmp(token, "RF",2)) { // tag = token; - + refs = ""; startTag = token; hide = true; @@ -71,7 +85,7 @@ char GBFFootnotes::processText (SWBuf &text, const SWKey *key, const SWModule *m else if (!strncmp(token, "Rf",2)) { if (module->isProcessEntryAttributes()) { //tag = token; - + if((tagText.length() == 1) || !strcmp(module->Name(), "IGNT")) { if (option) { // for ASV marks text in verse then put explanation at end of verse text.append(" <FS>["); @@ -93,7 +107,7 @@ char GBFFootnotes::processText (SWBuf &text, const SWKey *key, const SWModule *m startTag.setAttribute("swordFootnote", buf); } hide = false; - if (option) { + if (option) { text.append(startTag); text.append(tagText); } @@ -120,7 +134,7 @@ char GBFFootnotes::processText (SWBuf &text, const SWKey *key, const SWModule *m else tagText.append(*from); } return 0; - + /* if (!option) { // if we don't want footnotes char token[4096]; // cheese. Fix. diff --git a/src/modules/filters/gbfheadings.cpp b/src/modules/filters/gbfheadings.cpp index 81a4d94..122445e 100644 --- a/src/modules/filters/gbfheadings.cpp +++ b/src/modules/filters/gbfheadings.cpp @@ -2,9 +2,23 @@ * * gbfheadings - SWFilter descendant to hide or show headings * in a GBF module. + * + * 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 <stdlib.h> #include <gbfheadings.h> diff --git a/src/modules/filters/gbfhtml.cpp b/src/modules/filters/gbfhtml.cpp index a9d8434..2467e36 100644 --- a/src/modules/filters/gbfhtml.cpp +++ b/src/modules/filters/gbfhtml.cpp @@ -1,18 +1,24 @@ /*************************************************************************** - gbfhtml.cpp - GBF to HTML filter - ------------------- - begin : 2001-09-03 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * gbfhtml.cpp - GBF to HTML filter + * ------------------- + * begin : 2001-09-03 + * copyright : 2001 by CrossWire Bible Society + * + * 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 <stdlib.h> #include <gbfhtml.h> diff --git a/src/modules/filters/gbfhtmlhref.cpp b/src/modules/filters/gbfhtmlhref.cpp index 7f1c254..b4cdde0 100644 --- a/src/modules/filters/gbfhtmlhref.cpp +++ b/src/modules/filters/gbfhtmlhref.cpp @@ -1,20 +1,27 @@ /*************************************************************************** - gbfhtmlhref.cpp - GBF to HTML filter with hrefs - for strongs and morph tags - ------------------- - begin : 2001-09-03 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * gbfhtmlhref.cpp - GBF to HTML filter with hrefs + * for strongs and morph tags + * ------------------- + * begin : 2001-09-03 + * copyright : 2001 by CrossWire Bible Society + * + * 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 <stdlib.h> #include <gbfhtmlhref.h> #include <swmodule.h> diff --git a/src/modules/filters/gbfmorph.cpp b/src/modules/filters/gbfmorph.cpp index 5226db7..d7c8ab4 100644 --- a/src/modules/filters/gbfmorph.cpp +++ b/src/modules/filters/gbfmorph.cpp @@ -2,9 +2,24 @@ * * gbfmorph - SWFilter descendant to hide or show morph tags * in a GBF module. + * + * + * 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 <stdlib.h> #include <gbfmorph.h> diff --git a/src/modules/filters/gbfosis.cpp b/src/modules/filters/gbfosis.cpp index 00443f9..526167a 100644 --- a/src/modules/filters/gbfosis.cpp +++ b/src/modules/filters/gbfosis.cpp @@ -2,9 +2,24 @@ * * gbfstrongs - SWFilter descendant to hide or show strongs number * in a GBF module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <stdarg.h> @@ -317,10 +332,10 @@ char GBFOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module) newWord = false; //fix this if required? - //memset(to, 0, 10); - + //memset(to, 0, 10); + } - + if (!suspendTextPassThru) { text += (*from); lastspace = (*from == ' '); @@ -335,29 +350,29 @@ char GBFOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module) if (vkey->Verse()) { ref.appendFormatted("\t\t<verse osisID=\"%s\">", vkey->getOSISRef()); } - + if (ref.length() > 0) { - + text = ref + text; - + if (vkey->Verse()) { - VerseKey tmp; - tmp = *vkey; - tmp.AutoNormalize(0); - tmp.Headings(1); - + VerseKey *tmp = (VerseKey *)vkey->clone(); + *tmp = *vkey; + tmp->AutoNormalize(0); + tmp->Headings(1); + text += "</verse>"; - - tmp = MAXVERSE; - if (*vkey == tmp) { - tmp.Verse(0); + + *tmp = MAXVERSE; + if (*vkey == *tmp) { + tmp->Verse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); - tmp = MAXCHAPTER; - tmp = MAXVERSE; - if (*vkey == tmp) { - tmp.Chapter(0); - tmp.Verse(0); + *tmp = MAXCHAPTER; + *tmp = MAXVERSE; + if (*vkey == *tmp) { + tmp->Chapter(0); + tmp->Verse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); /* @@ -368,6 +383,7 @@ char GBFOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module) */ } } + delete tmp; } // else if (vkey->Chapter()) { // sprintf(ref, "\t<div type=\"chapter\" osisID=\"%s\">", vkey->getOSISRef()); diff --git a/src/modules/filters/gbfplain.cpp b/src/modules/filters/gbfplain.cpp index 5657e20..e90bf94 100644 --- a/src/modules/filters/gbfplain.cpp +++ b/src/modules/filters/gbfplain.cpp @@ -2,9 +2,24 @@ * * gbfplain - SWFilter descendant to strip out all GBF tags or convert to * ASCII rendered symbols. + * + * + * 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 <stdlib.h> #include <gbfplain.h> #include <swbuf.h> diff --git a/src/modules/filters/gbfredletterwords.cpp b/src/modules/filters/gbfredletterwords.cpp index a79802d..7397781 100644 --- a/src/modules/filters/gbfredletterwords.cpp +++ b/src/modules/filters/gbfredletterwords.cpp @@ -2,9 +2,24 @@ * * GBFRedLetterWords - SWFilter descendant to toggle red coloring of words of * Christ in a GBF module. + * + * + * 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 <stdlib.h> #include <gbfredletterwords.h> #include <swmodule.h> diff --git a/src/modules/filters/gbfrtf.cpp b/src/modules/filters/gbfrtf.cpp index eb39612..7471d0b 100644 --- a/src/modules/filters/gbfrtf.cpp +++ b/src/modules/filters/gbfrtf.cpp @@ -1,9 +1,24 @@ /****************************************************************************** * * gbfrtf - SWFilter descendant to convert all GBF tags to RTF tags + * + * + * 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 <gbfrtf.h> #include <utilstr.h> #include <ctype.h> diff --git a/src/modules/filters/gbfstrongs.cpp b/src/modules/filters/gbfstrongs.cpp index 610edb5..c7cf6c5 100644 --- a/src/modules/filters/gbfstrongs.cpp +++ b/src/modules/filters/gbfstrongs.cpp @@ -2,9 +2,24 @@ * * gbfstrongs - SWFilter descendant to hide or show strongs number * in a GBF module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <gbfstrongs.h> diff --git a/src/modules/filters/gbfthml.cpp b/src/modules/filters/gbfthml.cpp index 2664f48..4feb1fa 100644 --- a/src/modules/filters/gbfthml.cpp +++ b/src/modules/filters/gbfthml.cpp @@ -1,18 +1,24 @@ /*************************************************************************** - gbfthml.cpp - GBF to ThML filter - ------------------- - begin : 1999-10-27 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * gbfthml.cpp - GBF to ThML filter + * ------------------- + * begin : 1999-10-27 + * copyright : 2001 by CrossWire Bible Society + * + * 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 <stdlib.h> #include <gbfthml.h> diff --git a/src/modules/filters/gbfwebif.cpp b/src/modules/filters/gbfwebif.cpp index e651db6..b5ff798 100644 --- a/src/modules/filters/gbfwebif.cpp +++ b/src/modules/filters/gbfwebif.cpp @@ -1,19 +1,26 @@ /*************************************************************************** - GBFWEBIF.cpp - GBF to HTML filter with hrefs - for strongs and morph tags - ------------------- - begin : 2001-09-03 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ + * GBFWEBIF.cpp - GBF to HTML filter with hrefs + * for strongs and morph tags + * ------------------- + * begin : 2001-09-03 + * copyright : 2001 by CrossWire Bible Society + * + * 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. + * + */ -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ #include <gbfwebif.h> #include <ctype.h> diff --git a/src/modules/filters/gbfwordjs.cpp b/src/modules/filters/gbfwordjs.cpp index f81ffac..c3ab166 100644 --- a/src/modules/filters/gbfwordjs.cpp +++ b/src/modules/filters/gbfwordjs.cpp @@ -2,9 +2,24 @@ * * gbfstrongs - SWFilter descendant to hide or show strongs number * in a GBF module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <gbfwordjs.h> diff --git a/src/modules/filters/greeklexattribs.cpp b/src/modules/filters/greeklexattribs.cpp index 1e82305..e1a60a2 100644 --- a/src/modules/filters/greeklexattribs.cpp +++ b/src/modules/filters/greeklexattribs.cpp @@ -2,9 +2,24 @@ * * greeklexattribs - SWFilter descendant to set entry attributes for greek * lexicons + * + * + * 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 <stdlib.h> #include <stdio.h> #include <ctype.h> diff --git a/src/modules/filters/latin1utf16.cpp b/src/modules/filters/latin1utf16.cpp index 1392750..bf2f3f8 100644 --- a/src/modules/filters/latin1utf16.cpp +++ b/src/modules/filters/latin1utf16.cpp @@ -1,10 +1,25 @@ /****************************************************************************** * - * Latin1UTF16 - SWFilter descendant to convert a Latin-1 character to UTF-16 + * Latin1UTF16 - SWFilter descendant to convert a Latin-1 character to UTF-16 + * + * + * + * 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 <stdlib.h> #include <stdio.h> #include <latin1utf16.h> diff --git a/src/modules/filters/latin1utf8.cpp b/src/modules/filters/latin1utf8.cpp index 6c0d7f1..784aafe 100644 --- a/src/modules/filters/latin1utf8.cpp +++ b/src/modules/filters/latin1utf8.cpp @@ -2,9 +2,24 @@ * * Latin1UTF8 - SWFilter descendant to convert a Latin-1 character to UTF-8 * + * + * + * 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 <stdlib.h> #include <stdio.h> #include <latin1utf8.h> diff --git a/src/modules/filters/osisfootnotes.cpp b/src/modules/filters/osisfootnotes.cpp index 89c9c40..3d0d2d4 100644 --- a/src/modules/filters/osisfootnotes.cpp +++ b/src/modules/filters/osisfootnotes.cpp @@ -2,9 +2,24 @@ * * osisfootnotes - SWFilter descendant to hide or show footnotes * in an OSIS module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <osisfootnotes.h> @@ -41,11 +56,17 @@ char OSISFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m SWBuf refs = ""; int footnoteNum = 1; char buf[254]; - VerseKey parser(key->getText()); + SWKey *p = (module) ? module->CreateKey() : (key) ? key->clone() : new VerseKey(); + VerseKey *parser = SWDYNAMIC_CAST(VerseKey, p); + if (!parser) { + delete p; + parser = new VerseKey(); + } + *parser = key->getText(); SWBuf orig = text; const char *from = orig.c_str(); - + XMLTag tag; bool strongsMarkup = false; @@ -59,20 +80,20 @@ char OSISFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m continue; } - + if (*from == '<') { intoken = true; token = ""; continue; } - - - + + + if (*from == '>') { // process tokens - intoken = false; + intoken = false; if (!strncmp(token, "note", 4) || !strncmp(token.c_str(), "/note", 5)) { tag = token; - + if (!tag.isEndTag()) { if (tag.getAttribute("type") && (!strcmp("x-strongsMarkup", tag.getAttribute("type")) || !strcmp("strongsMarkup", tag.getAttribute("type"))) // deprecated @@ -80,7 +101,7 @@ char OSISFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m tag.setEmpty(false); // handle bug in KJV2003 module where some note open tags were <note ... /> strongsMarkup = true; } - + if (!tag.isEmpty()) { // if ((!tag.isEmpty()) || (SWBuf("strongsMarkup") == tag.getAttribute("type"))) { refs = ""; @@ -101,7 +122,7 @@ char OSISFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m startTag.setAttribute("swordFootnote", buf); if ((startTag.getAttribute("type")) && (!strcmp(startTag.getAttribute("type"), "crossReference"))) { if (!refs.length()) - refs = parser.ParseVerseList(tagText.c_str(), parser, true).getRangeText(); + refs = parser->ParseVerseList(tagText.c_str(), *parser, true).getRangeText(); module->getEntryAttributes()["Footnote"][buf]["refList"] = refs.c_str(); } } @@ -122,7 +143,7 @@ char OSISFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m if (refs.length()) { refs.append("; "); } - + const char* attr = strstr(token.c_str() + 9, "osisRef=\""); const char* end = attr ? strchr(attr+9, '"') : 0; @@ -150,6 +171,7 @@ char OSISFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m } else tagText.append(*from); } + delete parser; return 0; } diff --git a/src/modules/filters/osisheadings.cpp b/src/modules/filters/osisheadings.cpp index a072335..8872f24 100644 --- a/src/modules/filters/osisheadings.cpp +++ b/src/modules/filters/osisheadings.cpp @@ -2,9 +2,24 @@ * *osisheadings - SWFilter descendant to hide or show headings * in an OSIS module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <osisheadings.h> @@ -35,6 +50,9 @@ char OSISHeadings::processText(SWBuf &text, const SWKey *key, const SWModule *mo bool hide = false; bool preverse = false; bool withinTitle = false; + bool withinPreverseDiv = false; + SWBuf preverseDivID = ""; + const char *pvDID = 0; bool canonical = false; SWBuf header; int headerNum = 0; @@ -56,27 +74,41 @@ char OSISHeadings::processText(SWBuf &text, const SWKey *key, const SWModule *mo } if (*from == '>') { // process tokens intoken = false; - - if (!strncmp(token.c_str(), "title", 5) || !strncmp(token.c_str(), "/title", 6)) { - withinTitle = (!strnicmp(token.c_str(), "title", 5)); - tag = token; + tag = token; + + // <title> </title> <div subType="x-preverse"> (</div> ## when in previous) + if ( (!withinPreverseDiv && !strcmp(tag.getName(), "title")) || + (!strcmp(tag.getName(), "div") && + ((withinPreverseDiv && (tag.isEndTag(pvDID))) || + (tag.getAttribute("subType") && !strcmp(tag.getAttribute("subType"), "x-preverse"))) + )) { + + withinTitle = (!tag.isEndTag(pvDID)); + if (!strcmp(tag.getName(), "div")) { + withinPreverseDiv = (!tag.isEndTag(pvDID)); + if (!pvDID) { + preverseDivID = tag.getAttribute("sID"); + pvDID = (preverseDivID.length())? preverseDivID.c_str() : 0; + } + } - if (!tag.isEndTag()) { //start tag - if (!tag.isEmpty()) { + if (!tag.isEndTag(pvDID)) { //start tag + if (!tag.isEmpty() || pvDID) { startTag = tag; } } - if ( (tag.getAttribute("subType") && !stricmp(tag.getAttribute("subType"), "x-preverse")) - || (tag.getAttribute("subtype") && !stricmp(tag.getAttribute("subtype"), "x-preverse")) // deprecated - ) { + if ( !tag.isEndTag(pvDID) && (withinPreverseDiv + || (tag.getAttribute("subType") && !stricmp(tag.getAttribute("subType"), "x-preverse")) + || (tag.getAttribute("subtype") && !stricmp(tag.getAttribute("subtype"), "x-preverse")) // deprecated + )) { hide = true; preverse = true; header = ""; canonical = (tag.getAttribute("canonical") && (!stricmp(tag.getAttribute("canonical"), "true"))); continue; } - if (!tag.isEndTag()) { //start tag + if (!tag.isEndTag(pvDID)) { //start tag hide = true; header = ""; if (option || canonical) { // we want the tag in the text @@ -86,7 +118,7 @@ char OSISHeadings::processText(SWBuf &text, const SWKey *key, const SWModule *mo } continue; } - if (hide && tag.isEndTag()) { + if (hide && tag.isEndTag(pvDID)) { if (module->isProcessEntryAttributes() && ((option || canonical) || (!preverse))) { if (preverse) { sprintf(buf, "%i", pvHeaderNum++); @@ -112,6 +144,7 @@ char OSISHeadings::processText(SWBuf &text, const SWKey *key, const SWModule *mo continue; } preverse = false; + pvDID = 0; } } diff --git a/src/modules/filters/osishtmlhref.cpp b/src/modules/filters/osishtmlhref.cpp index fe3e058..6fce987 100644 --- a/src/modules/filters/osishtmlhref.cpp +++ b/src/modules/filters/osishtmlhref.cpp @@ -1,17 +1,25 @@ /*************************************************************************** - osishtmlhref.cpp - OSIS to HTML with hrefs filter - ------------------- - begin : 2003-06-24 - copyright : 2003 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 of the License. * - * * - ***************************************************************************/ + * osishtmlhref.cpp - OSIS to HTML with hrefs filter + * ------------------- + * begin : 2003-06-24 + * copyright : 2003 by CrossWire Bible Society + * + * + * 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 <stdlib.h> #include <ctype.h> @@ -111,7 +119,7 @@ void processLemma(bool suspendTextPassThru, XMLTag &tag, SWBuf &buf) { if (!suspendTextPassThru) { buf.appendFormatted("<small><em><<a href=\"passagestudy.jsp?action=showStrongs&type=%s&value=%s\">%s</a>></em></small>", (gh.length()) ? gh.c_str() : "", - URL::encode(val2).c_str(), + URL::encode(val2).c_str(), val2); } //} @@ -188,8 +196,9 @@ bool OSISHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserDat if ((attrib = tag.getAttribute("gloss"))) { val = strchr(attrib, ':'); val = (val) ? (val + 1) : attrib; - outText(" ", buf, u); + outText("(", buf, u); outText(val, buf, u); + outText(")", buf, u); } if (!morphFirst) { processLemma(u->suspendTextPassThru, tag, buf); @@ -278,49 +287,71 @@ bool OSISHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserDat } } + // Milestoned paragraphs, created by osis2mod + // <div type="paragraph" sID.../> + // <div type="paragraph" eID.../> + else if (tag.isEmpty() && !strcmp(tag.getName(), "div") && tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "paragraph")) { + // <div type="paragraph" sID... /> + if (tag.getAttribute("sID")) { // non-empty start tag + outText("<!P><br />", buf, u); + } + // <div type="paragraph" eID... /> + else if (tag.getAttribute("eID")) { + outText("<!/P><br />", buf, u); + userData->supressAdjacentWhitespace = true; + } + } + // <reference> tag else if (!strcmp(tag.getName(), "reference")) { if (!u->inXRefNote) { // only show these if we're not in an xref note - if ((!tag.isEndTag()) && (!tag.isEmpty())) { - u->suspendTextPassThru = (++u->suspendLevel); - } - if (tag.isEndTag()) { - if (!u->BiblicalText) { - SWBuf refList = tag.getAttribute("passage"); - if (!refList.length()) - refList = u->lastTextNode; - SWBuf version = tag.getAttribute("version"); - - buf.appendFormatted(" <a href=\"passagestudy.jsp?action=showRef&type=scripRef&value=%s&module=%s\">", - (refList.length()) ? URL::encode(refList.c_str()).c_str() : "", - (version.length()) ? URL::encode(version.c_str()).c_str() : ""); - buf += u->lastTextNode.c_str(); - buf += "</a> "; + if (!tag.isEndTag()) { + SWBuf target; + SWBuf work; + SWBuf ref; + bool is_scripRef = false; + + target = tag.getAttribute("osisRef"); + const char* the_ref = strchr(target, ':'); + + if(!the_ref) { + // No work + ref = target; + is_scripRef = true; } else { - SWBuf footnoteNumber = tag.getAttribute("swordFootnote"); - VerseKey *vkey = NULL; - // see if we have a VerseKey * or descendant - SWTRY { - vkey = SWDYNAMIC_CAST(VerseKey, u->key); - } - SWCATCH ( ... ) {} - if (vkey) { - // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt. - //buf.appendFormatted("<a href=\"noteID=%s.x.%s\"><small><sup>*x</sup></small></a> ", vkey->getText(), footnoteNumber.c_str()); - buf.appendFormatted("<a href=\"passagestudy.jsp?action=showNote&type=x&value=%s&module=%s&passage=%s\"><small><sup>*x</sup></small></a>", - URL::encode(footnoteNumber.c_str()).c_str(), - URL::encode(u->version.c_str()).c_str(), - URL::encode(vkey->getText()).c_str()); - - } + // Compensate for starting : + ref = the_ref + 1; + + int size = target.size() - ref.size() - 1; + work.setSize(size); + strncpy(work.getRawData(), target, size); + + // For Bible:Gen.3.15 or Bible.vulgate:Gen.3.15 + if(!strncmp(work, "Bible", 5)) + is_scripRef = true; + } + + if(is_scripRef) + { + buf.appendFormatted("<a href=\"passagestudy.jsp?action=showRef&type=scripRef&value=%s&module=\">", + URL::encode(ref.c_str()).c_str() +// (work.size()) ? URL::encode(work.c_str()).c_str() : "") + ); + } + else + { + // Dictionary link, or something + buf.appendFormatted("<a href=\"sword://%s/%s\">", + URL::encode(work.c_str()).c_str(), + URL::encode(ref.c_str()).c_str() + ); } - u->suspendTextPassThru = (--u->suspendLevel); } - }/* - if (tag.isEndTag()) { - u->suspendTextPassThru = false; - }*/ + else { + outText("</a>", buf, u); + } + } } // <l> poetry, etc @@ -383,7 +414,26 @@ bool OSISHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserDat outText("</b><br />", buf, u); } } + + // <list> + else if (!strcmp(tag.getName(), "list")) { + if((!tag.isEndTag()) && (!tag.isEmpty())) { + outText("<ul>", buf, u); + } + else if (tag.isEndTag()) { + outText("</ul>", buf, u); + } + } + // <item> + else if (!strcmp(tag.getName(), "item")) { + if((!tag.isEndTag()) && (!tag.isEmpty())) { + outText("<li>", buf, u); + } + else if (tag.isEndTag()) { + outText("</li>", buf, u); + } + } // <catchWord> & <rdg> tags (italicize) else if (!strcmp(tag.getName(), "rdg") || !strcmp(tag.getName(), "catchWord")) { if ((!tag.isEndTag()) && (!tag.isEmpty())) { @@ -405,6 +455,16 @@ bool OSISHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserDat if (lastText.size()) { toupperstr(lastText); scratch.setFormatted("%c<font size=\"-1\">%s</font>", lastText[0], lastText.c_str()+1); + + const unsigned char *tmpBuf = (const unsigned char *)lastText.c_str(); + getUniCharFromUTF8(&tmpBuf); + int char_length = (tmpBuf - (const unsigned char *)lastText.c_str()); + scratch.setFormatted("%.*s<font size=\"-1\">%s</font>", + char_length, + lastText.c_str(), + lastText.c_str() + char_length + ); + outText(scratch.c_str(), buf, u); } } @@ -542,8 +602,7 @@ bool OSISHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserDat outText(URL::encode(u->version.c_str()).c_str(), buf, u); outText("\">", buf, u); -// we do this because BibleCS looks for this EXACT format for an image tag - outText("<image border=0 src=\"", buf, u); + outText("<img border=\"0\" src=\"", buf, u); outText(filepath, buf, u); outText("\" />", buf, u); diff --git a/src/modules/filters/osislemma.cpp b/src/modules/filters/osislemma.cpp index f5e6ff6..7b56024 100644 --- a/src/modules/filters/osislemma.cpp +++ b/src/modules/filters/osislemma.cpp @@ -2,9 +2,24 @@ * * osislemma - SWFilter descendant to hide or show lemmata * in a OSIS module. + * + * + * 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 <stdlib.h> #include <osislemma.h> #include <utilxml.h> diff --git a/src/modules/filters/osismorph.cpp b/src/modules/filters/osismorph.cpp index 69d44d5..7ceec79 100644 --- a/src/modules/filters/osismorph.cpp +++ b/src/modules/filters/osismorph.cpp @@ -2,9 +2,24 @@ * * osismorph - SWFilter descendant to hide or show morph tags * in a OSIS module. + * + * + * 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 <stdlib.h> #include <osismorph.h> diff --git a/src/modules/filters/osismorphsegmentation.cpp b/src/modules/filters/osismorphsegmentation.cpp index bf32581..fef7af7 100644 --- a/src/modules/filters/osismorphsegmentation.cpp +++ b/src/modules/filters/osismorphsegmentation.cpp @@ -2,9 +2,24 @@ * * osismorphsegmentation - SWFilter descendant to toggle splitting of morphemes * (for morpheme segmented Hebrew in the WLC) + * + * + * 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 <osismorphsegmentation.h> #include <stdlib.h> #include <utilxml.h> diff --git a/src/modules/filters/osisosis.cpp b/src/modules/filters/osisosis.cpp index 7da6089..82a6bfc 100644 --- a/src/modules/filters/osisosis.cpp +++ b/src/modules/filters/osisosis.cpp @@ -1,17 +1,24 @@ /*************************************************************************** - osisosis.cpp - internal OSIS to public OSIS filter - ------------------- - begin : 2004-03-13 - copyright : 2003 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 of the License. - * * - ***************************************************************************/ + * osisosis.cpp - internal OSIS to public OSIS filter + * ------------------- + * begin : 2004-03-13 + * copyright : 2003 by CrossWire Bible Society + * + * 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 <stdlib.h> #include <osisosis.h> @@ -55,33 +62,34 @@ char OSISOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module if (vkey->Verse()) { ref.appendFormatted("\t\t<verse osisID=\"%s\">", vkey->getOSISRef()); } - + if (ref.length() > 0) { - + text = ref + text; - + if (vkey->Verse()) { - VerseKey tmp; - tmp = *vkey; - tmp.AutoNormalize(0); - tmp.Headings(1); - + VerseKey *tmp = (VerseKey *)vkey->clone(); + *tmp = *vkey; + tmp->AutoNormalize(0); + tmp->Headings(1); + text += "</verse>"; - - tmp = MAXVERSE; - if (*vkey == tmp) { - tmp.Verse(0); + + *tmp = MAXVERSE; + if (*vkey == *tmp) { + tmp->Verse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); - tmp = MAXCHAPTER; - tmp = MAXVERSE; - if (*vkey == tmp) { - tmp.Chapter(0); - tmp.Verse(0); + *tmp = MAXCHAPTER; + *tmp = MAXVERSE; + if (*vkey == *tmp) { + tmp->Chapter(0); + tmp->Verse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); } } + delete tmp; } // diff --git a/src/modules/filters/osisplain.cpp b/src/modules/filters/osisplain.cpp index 62841a6..57105f0 100644 --- a/src/modules/filters/osisplain.cpp +++ b/src/modules/filters/osisplain.cpp @@ -1,18 +1,24 @@ -/*************************************************************************** - osisplain.cpp - OSIS to Plaintext filter - ------------------- - begin : 2003-02-15 - copyright : 2003 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ +/****************************************************************************** + * osisplain.cpp - An SWFilter + * impl that provides stripping of OSIS tags + * + * $Id: osisplain.cpp 2334 2009-04-24 00:14:12Z scribe $ + * + * Copyright 2001 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 <stdlib.h> #include <osisplain.h> @@ -22,6 +28,17 @@ SWORD_NAMESPACE_START +namespace { +class MyUserData : public BasicFilterUserData { +public: + SWBuf w; + XMLTag tag; + VerseKey *vk; + char testament; + MyUserData(const SWModule *module, const SWKey *key) : BasicFilterUserData(module, key) {} +}; +} + OSISPlain::OSISPlain() { setTokenStart("<"); setTokenEnd(">"); @@ -45,13 +62,18 @@ OSISPlain::OSISPlain() { addTokenSubstitute("/lg", "\n"); } +BasicFilterUserData *OSISPlain::createUserData(const SWModule *module, const SWKey *key) { + MyUserData *u = new MyUserData(module, key); + u->vk = SWDYNAMIC_CAST(VerseKey, u->key); + u->testament = (u->vk) ? u->vk->Testament() : 2; // default to NT + return u; +} + bool OSISPlain::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) { // manually process if it wasn't a simple substitution if (!substituteToken(buf, token)) { MyUserData *u = (MyUserData *)userData; - VerseKey *vk = SWDYNAMIC_CAST(VerseKey, u->key); - char testament = (vk) ? vk ->Testament() : 2; // default to NT if (((*token == 'w') && (token[1] == ' ')) || ((*token == '/') && (token[1] == 'w') && (!token[2]))) { u->tag = token; @@ -99,7 +121,7 @@ bool OSISPlain::handleToken(SWBuf &buf, const char *token, BasicFilterUserData * val++; } else { - gh = (testament>1) ? 'G' : 'H'; + gh = (u->testament>1) ? 'G' : 'H'; } if ((!strcmp(val, "3588")) && (lastText.length() < 1)) show = false; @@ -139,13 +161,13 @@ bool OSISPlain::handleToken(SWBuf &buf, const char *token, BasicFilterUserData * // <note> tag else if (!strncmp(token, "note", 4)) { if (!strstr(token, "strongsMarkup")) { // leave strong's markup notes out, in the future we'll probably have different option filters to turn different note types on or off - buf.append(" ("); + buf.append(" ["); } else u->suspendTextPassThru = true; } else if (!strncmp(token, "/note", 5)) { if (!u->suspendTextPassThru) - buf.append(')'); + buf.append("] "); else u->suspendTextPassThru = false; } @@ -156,6 +178,15 @@ bool OSISPlain::handleToken(SWBuf &buf, const char *token, BasicFilterUserData * buf.append('\n'); } + // Milestoned paragraph, created by osis2mod + // <div type="paragraph" sID... /> + // <div type="paragraph" eID... /> + else if (!strcmp(u->tag.getName(), "div") && u->tag.getAttribute("type") && !strcmp(u->tag.getAttribute("type"), "paragraph") && + (u->tag.isEmpty() && (u->tag.getAttribute("sID") || u->tag.getAttribute("eID")))) { + userData->supressAdjacentWhitespace = true; + buf.append('\n'); + } + // <lb .../> else if (!strncmp(token, "lb", 2)) { userData->supressAdjacentWhitespace = true; diff --git a/src/modules/filters/osisredletterwords.cpp b/src/modules/filters/osisredletterwords.cpp index 727332d..9075fd8 100644 --- a/src/modules/filters/osisredletterwords.cpp +++ b/src/modules/filters/osisredletterwords.cpp @@ -2,9 +2,24 @@ * * OSISRedLetterWords - SWFilter descendant to toggle red coloring for words * of Christ in an OSIS module. + * + * + * 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 <stdlib.h> #include <osisredletterwords.h> #include <swmodule.h> diff --git a/src/modules/filters/osisrtf.cpp b/src/modules/filters/osisrtf.cpp index 0352335..84801e3 100644 --- a/src/modules/filters/osisrtf.cpp +++ b/src/modules/filters/osisrtf.cpp @@ -1,17 +1,25 @@ /*************************************************************************** - osisrtf.cpp - OSIS to RTF filter - ------------------- - begin : 2003-02-15 - copyright : 2003 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 of the License. * - * * - ***************************************************************************/ + * osisrtf.cpp - OSIS to RTF filter + * ------------------- + * begin : 2003-02-15 + * copyright : 2003 by CrossWire Bible Society + * + * + * 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 <stdlib.h> #include <ctype.h> @@ -272,6 +280,21 @@ bool OSISRTF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *us } } + // Milestoned paragraphs, created by osis2mod + // <div type="paragraph" sID.../> + // <div type="paragraph" eID.../> + else if (tag.isEmpty() && !strcmp(tag.getName(), "div") && tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "paragraph")) { + // <div type="paragraph" sID... /> + if (tag.getAttribute("sID")) { // non-empty start tag + outText("{\\fi200\\par}", buf, u); + } + // <div type="paragraph" eID... /> + else if (tag.getAttribute("eID")) { + outText("{\\par}", buf, u); + userData->supressAdjacentWhitespace = true; + } + } + // <reference> tag else if (!strcmp(tag.getName(), "reference")) { if (!u->inXRefNote) { // only show these if we're not in an xref note @@ -316,6 +339,25 @@ bool OSISRTF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *us outText("\\par}", buf, u); } } + // <list> - how do we support these better in RTF? + else if (!strcmp(tag.getName(), "list")) { + if((!tag.isEndTag()) && (!tag.isEmpty())) { + outText("\\par\\pard", buf, u); + } + else if (tag.isEndTag()) { + outText("\\par\\pard", buf, u); + } + } + + // <item> - support better + else if (!strcmp(tag.getName(), "item")) { + if((!tag.isEndTag()) && (!tag.isEmpty())) { + outText("* ", buf, u); + } + else if (tag.isEndTag()) { + outText("\\par", buf, u); + } + } // <catchWord> & <rdg> tags (italicize) else if (!strcmp(tag.getName(), "rdg") || !strcmp(tag.getName(), "catchWord")) { @@ -445,16 +487,10 @@ bool OSISRTF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *us else if (!strcmp(tag.getName(), "divineName")) { if ((!tag.isEndTag()) && (!tag.isEmpty())) { - u->suspendTextPassThru = (++u->suspendLevel); + outText("{\\scaps ", buf, u); } else if (tag.isEndTag()) { - SWBuf lastText = u->lastSuspendSegment.c_str(); - u->suspendTextPassThru = (--u->suspendLevel); - if (lastText.size()) { - toupperstr(lastText); - scratch.setFormatted("{\\fs19%c\\fs16%s}", lastText[0], lastText.c_str()+1); - outText(scratch.c_str(), buf, u); - } + outText("}", buf, u); } } @@ -462,10 +498,11 @@ bool OSISRTF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *us else if (!strcmp(tag.getName(), "div")) { if ((!tag.isEndTag()) && (!tag.isEmpty())) { - outText("\\par\\par\\pard ", buf, u); + outText("\\pard ", buf, u); } else if (tag.isEndTag()) { - } + outText("\\par ", buf, u); + } } // image diff --git a/src/modules/filters/osisruby.cpp b/src/modules/filters/osisruby.cpp new file mode 100644 index 0000000..c17ea43 --- /dev/null +++ b/src/modules/filters/osisruby.cpp @@ -0,0 +1,93 @@ +/******************************************************************************
+ *
+ * osisruby - SWFilter descendant to hide or show ruby
+ * in a OSIS module.
+ *
+ *
+ * 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 <stdlib.h>
+#include <osisruby.h>
+#include <utilxml.h>
+
+SWORD_NAMESPACE_START
+
+const char oName[] = "Ruby";
+const char oTip[] = "Toggles Ruby On and Off if they exist";
+
+const SWBuf choices[3] = {"Off", "On", ""};
+const StringList oValues(&choices[0], &choices[2]);
+
+OSISRuby::OSISRuby() : SWOptionFilter(oName, oTip, &oValues) {
+ setOptionValue("Off");
+}
+
+
+OSISRuby::~OSISRuby() {
+}
+
+
+char OSISRuby::processText(SWBuf &text, const SWKey *key, const SWModule *module) {
+ SWBuf token;
+ bool intoken = false;
+ bool lastspace = false;
+
+ const SWBuf orig = text;
+ const char * from = orig.c_str();
+
+ if (!option) {
+ for (text = ""; *from; ++from) {
+ if (*from == '<') {
+ intoken = true;
+ token = "";
+ continue;
+ }
+ if (*from == '>') { // process tokens
+ intoken = false;
+ if (token.startsWith("w ")) { // Word
+ XMLTag wtag(token);
+ const char *l = wtag.getAttribute("gloss");
+ if (l) {
+ wtag.setAttribute("gloss", 0);
+ token = wtag;
+ token.trim();
+ // drop <>
+ token << 1;
+ token--;
+ }
+ }
+
+ // keep token in text
+ text.append('<');
+ text.append(token);
+ text.append('>');
+
+ continue;
+ }
+ if (intoken) {
+ token += *from;
+ }
+ else {
+ text.append(*from);
+ lastspace = (*from == ' ');
+ }
+ }
+ }
+ return 0;
+}
+
+SWORD_NAMESPACE_END
diff --git a/src/modules/filters/osisscripref.cpp b/src/modules/filters/osisscripref.cpp index 437f5f5..73c7309 100644 --- a/src/modules/filters/osisscripref.cpp +++ b/src/modules/filters/osisscripref.cpp @@ -2,9 +2,24 @@ * * OSISScripref - SWFilter descendant to hide or show scripture references * in an OSIS module. + * + * + * 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 <stdlib.h> #include <osisscripref.h> #include <swmodule.h> diff --git a/src/modules/filters/osisstrongs.cpp b/src/modules/filters/osisstrongs.cpp index 922f7fd..8c06b07 100644 --- a/src/modules/filters/osisstrongs.cpp +++ b/src/modules/filters/osisstrongs.cpp @@ -2,9 +2,24 @@ * * osisstrongs - SWFilter descendant to hide or show strongs number * in a OSIS module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <ctype.h> @@ -38,6 +53,7 @@ char OSISStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *mod int wordNum = 1; char wordstr[5]; const char *wordStart = 0; + SWBuf page = ""; // some modules include <seg> page info, so we add these to the words const SWBuf orig = text; const char * from = orig.c_str(); @@ -50,6 +66,20 @@ char OSISStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *mod } if (*from == '>') { // process tokens intoken = false; + + // possible page seg -------------------------------- + if (token.startsWith("seg ")) { + XMLTag stag(token); + SWBuf type = stag.getAttribute("type"); + if (type == "page") { + SWBuf number = stag.getAttribute("subtype"); + if (number.length()) { + page = number; + } + } + } + // --------------------------------------------------- + if (token.startsWith("w ")) { // Word XMLTag wtag(token); if (module->isProcessEntryAttributes()) { @@ -167,15 +197,17 @@ char OSISStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *mod if (lemma.length()) - module->getEntryAttributes()["Word"][wordstr]["Lemma"] = lemma; + module->getEntryAttributes()["Word"][wordstr]["Lemma"] = lemma; if (lemmaClass.length()) - module->getEntryAttributes()["Word"][wordstr]["LemmaClass"] = lemmaClass; + module->getEntryAttributes()["Word"][wordstr]["LemmaClass"] = lemmaClass; if (morph.length()) - module->getEntryAttributes()["Word"][wordstr]["Morph"] = morph; + module->getEntryAttributes()["Word"][wordstr]["Morph"] = morph; if (morphClass.length()) - module->getEntryAttributes()["Word"][wordstr]["MorphClass"] = morphClass; + module->getEntryAttributes()["Word"][wordstr]["MorphClass"] = morphClass; if (src.length()) module->getEntryAttributes()["Word"][wordstr]["Src"] = src; + if (page.length()) + module->getEntryAttributes()["Word"][wordstr]["Page"] = page; if (wtag.isEmpty()) { int j; diff --git a/src/modules/filters/osisvariants.cpp b/src/modules/filters/osisvariants.cpp index 91d700c..16e0cfb 100644 --- a/src/modules/filters/osisvariants.cpp +++ b/src/modules/filters/osisvariants.cpp @@ -2,9 +2,24 @@ * * osisvariants - SWFilter descendant to hide or show textual variants * in an OSIS module. + * + * + * 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 <stdlib.h> #include <osisvariants.h> #include <utilstr.h> diff --git a/src/modules/filters/osiswebif.cpp b/src/modules/filters/osiswebif.cpp index ecc58f7..e313836 100644 --- a/src/modules/filters/osiswebif.cpp +++ b/src/modules/filters/osiswebif.cpp @@ -1,19 +1,25 @@ /*************************************************************************** - OSISWEBIF.cpp - OSIS to HTML filter with hrefs - for strongs and morph tags - ------------------- - begin : 2003-10-23 - copyright : 2003 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * OSISWEBIF.cpp - OSIS to HTML filter with hrefs + * for strongs and morph tags + * ------------------- + * begin : 2003-10-23 + * copyright : 2003 by CrossWire Bible Society + * + * 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 <stdlib.h> #include <osiswebif.h> @@ -169,6 +175,14 @@ bool OSISWEBIF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData * } } + // Milestoned paragraphs, created by osis2mod + // <div type="paragraph" sID.../> + // <div type="paragraph" eID.../> + else if (tag.isEmpty() && !strcmp(tag.getName(), "div") && tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "paragraph")) { + // This is properly handled by base class. + return OSISHTMLHREF::handleToken(buf, token, userData); + } + // ok to leave these in else if (!strcmp(tag.getName(), "div")) { buf += tag; diff --git a/src/modules/filters/osiswordjs.cpp b/src/modules/filters/osiswordjs.cpp index dc805b4..da573d3 100644 --- a/src/modules/filters/osiswordjs.cpp +++ b/src/modules/filters/osiswordjs.cpp @@ -2,9 +2,24 @@ * * osisstrongs - SWFilter descendant to hide or show strongs number * in a OSIS module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <osiswordjs.h> @@ -76,8 +91,11 @@ char OSISWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu SWBuf lemmaClass; SWBuf lemma; SWBuf morph; + SWBuf page; SWBuf src; char gh = 0; + page = module->getEntryAttributes()["Word"][wordstr]["Page"].c_str(); + if (page.length()) page = (SWBuf)"p:" + page; int count = atoi(module->getEntryAttributes()["Word"][wordstr]["PartCount"].c_str()); for (int i = 0; i < count; i++) { @@ -146,7 +164,7 @@ char OSISWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu } } // 'p' = 'fillpop' to save bandwidth - text.appendFormatted("<span class=\"clk\" onclick=\"p('%s','%s','%s','%s','','%s');\" >", lexName.c_str(), lemma.c_str(), wordID.c_str(), morph.c_str(), modName.c_str()); + text.appendFormatted("<span class=\"clk\" onclick=\"p('%s','%s','%s','%s','%s','%s');\" >", lexName.c_str(), lemma.c_str(), wordID.c_str(), morph.c_str(), page.c_str(), modName.c_str()); wordNum++; } if ((*token == '/') && (token[1] == 'w') && option) { // Word diff --git a/src/modules/filters/papyriplain.cpp b/src/modules/filters/papyriplain.cpp index 423bfda..782b52a 100644 --- a/src/modules/filters/papyriplain.cpp +++ b/src/modules/filters/papyriplain.cpp @@ -1,9 +1,24 @@ /****************************************************************************** * * papyriplain - SWFilter descendant to strip out all Papyri tags + * + * + * 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 <stdlib.h> #include <papyriplain.h> diff --git a/src/modules/filters/plainfootnotes.cpp b/src/modules/filters/plainfootnotes.cpp index 0baf313..449f7da 100644 --- a/src/modules/filters/plainfootnotes.cpp +++ b/src/modules/filters/plainfootnotes.cpp @@ -1,19 +1,25 @@ /*************************************************************************** - plainfootnotes.cpp - description - ------------------- - begin : Wed Oct 13 1999 - copyright : (C) 1999 by The team of BibleTime - email : info@bibletime.de - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * plainfootnotes.cpp - description + * ------------------- + * begin : Wed Oct 13 1999 + * copyright : (C) 1999 by The team of BibleTime + * email : info@bibletime.de + * + * 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 <plainfootnotes.h> #include <swkey.h> diff --git a/src/modules/filters/plainhtml.cpp b/src/modules/filters/plainhtml.cpp index f5f2a5c..3f989fa 100644 --- a/src/modules/filters/plainhtml.cpp +++ b/src/modules/filters/plainhtml.cpp @@ -1,19 +1,25 @@ /*************************************************************************** - plainhtml.cpp - description - ------------------- - begin : Thu Jun 24 1999 - copyright : (C) 1999 by Torsten Uhlmann - email : TUhlmann@gmx.de - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * plainhtml.cpp - description + * ------------------- + * begin : Thu Jun 24 1999 + * copyright : (C) 1999 by Torsten Uhlmann + * email : TUhlmann@gmx.de + * + * 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 <plainhtml.h> #include <swbuf.h> diff --git a/src/modules/filters/rtfhtml.cpp b/src/modules/filters/rtfhtml.cpp index cac5068..7b55721 100644 --- a/src/modules/filters/rtfhtml.cpp +++ b/src/modules/filters/rtfhtml.cpp @@ -1,19 +1,25 @@ /*************************************************************************** - rtfhtml.cpp - description - ------------------- - begin : Wed Oct 13 1999 - copyright : (C) 1999 by The team of BibleTime - email : info@bibletime.de - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * rtfhtml.cpp - description + * ------------------- + * begin : Wed Oct 13 1999 + * copyright : (C) 1999 by The team of BibleTime + * email : info@bibletime.de + * + * 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 <stdlib.h> #include <rtfhtml.h> diff --git a/src/modules/filters/scsuutf8.cpp b/src/modules/filters/scsuutf8.cpp deleted file mode 100644 index 0daff4a..0000000 --- a/src/modules/filters/scsuutf8.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/****************************************************************************** - * - * SCSUUTF8 - SWFilter descendant to convert a SCSU character to UTF-8 - * - */ - - -/* This class is based on: - * http://czyborra.com/scsu/scsu.c written by Roman Czyborra@dds.nl - * on Andrea's balcony in North Amsterdam on 1998-08-04 - * Thanks to Richard Verhoeven <rcb5@win.tue.nl> for his suggestion - * to correct the haphazard "if" after UQU to "else if" on 1998-10-01 - * - * This is a deflator to UTF-8 output for input compressed in SCSU, - * the (Reuters) Standard Compression Scheme for Unicode as described - * in http://www.unicode.org/unicode/reports/tr6.html - */ - -#include <stdlib.h> -#include <stdio.h> -#include <swmodule.h> - -#include <scsuutf8.h> - -SWORD_NAMESPACE_START - -SCSUUTF8::SCSUUTF8() { -} - - -unsigned char* SCSUUTF8::UTF8Output(unsigned long uchar, unsigned char* text) -{ - /* join UTF-16 surrogates without any pairing sanity checks */ - - static int d; - - if (uchar >= 0xd800 && uchar <= 0xdbff) { d = uchar & 0x3f; return text; } - if (uchar >= 0xdc00 && uchar <= 0xdfff) { uchar = uchar + 0x2400 + d * 0x400; } - - /* output one character as UTF-8 multibyte sequence */ - - if (uchar < 0x80) { - *text++ = c; - } - else if (uchar < 0x800) { - *text++ = 0xc0 | uchar >> 6; - *text++ = 0x80 | (uchar & 0x3f); - } - else if (uchar < 0x10000) { - *text++ = 0xe0 | uchar >> 12; - *text++ = 0x80 | (uchar >> 6 & 0x3f); - *text++ = 0x80 | (uchar & 0x3f); - } - else if (uchar < 0x200000) { - *text++ = 0xf0 | uchar >> 18; - *text++ = 0x80 | (uchar >> 12 & 0x3f); - *text++ = 0x80 | (uchar >> 6 & 0x3f); - *text++ = 0x80 | (uchar & 0x3f); - } - - return text; -} - -char SCSUUTF8::processText(SWBuf &text, const SWKey *key, const SWModule *module) { -/* - unsigned char *to, *from; - unsigned long buflen = len * FILTERPAD; - char active = 0, mode = 0; - if ((unsigned long)key < 2) // hack, we're en(1)/de(0)ciphering - return -1; - - static unsigned short start[8] = {0x0000,0x0080,0x0100,0x0300,0x2000,0x2080,0x2100,0x3000}; - static unsigned short slide[8] = {0x0080,0x00C0,0x0400,0x0600,0x0900,0x3040,0x30A0,0xFF00}; - static unsigned short win[256] = { - 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, - 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, - 0x0800, 0x0880, 0x0900, 0x0980, 0x0A00, 0x0A80, 0x0B00, 0x0B80, - 0x0C00, 0x0C80, 0x0D00, 0x0D80, 0x0E00, 0x0E80, 0x0F00, 0x0F80, - 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, - 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780, - 0x1800, 0x1880, 0x1900, 0x1980, 0x1A00, 0x1A80, 0x1B00, 0x1B80, - 0x1C00, 0x1C80, 0x1D00, 0x1D80, 0x1E00, 0x1E80, 0x1F00, 0x1F80, - 0x2000, 0x2080, 0x2100, 0x2180, 0x2200, 0x2280, 0x2300, 0x2380, - 0x2400, 0x2480, 0x2500, 0x2580, 0x2600, 0x2680, 0x2700, 0x2780, - 0x2800, 0x2880, 0x2900, 0x2980, 0x2A00, 0x2A80, 0x2B00, 0x2B80, - 0x2C00, 0x2C80, 0x2D00, 0x2D80, 0x2E00, 0x2E80, 0x2F00, 0x2F80, - 0x3000, 0x3080, 0x3100, 0x3180, 0x3200, 0x3280, 0x3300, 0x3800, - 0xE000, 0xE080, 0xE100, 0xE180, 0xE200, 0xE280, 0xE300, 0xE380, - 0xE400, 0xE480, 0xE500, 0xE580, 0xE600, 0xE680, 0xE700, 0xE780, - 0xE800, 0xE880, 0xE900, 0xE980, 0xEA00, 0xEA80, 0xEB00, 0xEB80, - 0xEC00, 0xEC80, 0xED00, 0xED80, 0xEE00, 0xEE80, 0xEF00, 0xEF80, - 0xF000, 0xF080, 0xF100, 0xF180, 0xF200, 0xF280, 0xF300, 0xF380, - 0xF400, 0xF480, 0xF500, 0xF580, 0xF600, 0xF680, 0xF700, 0xF780, - 0xF800, 0xF880, 0xF900, 0xF980, 0xFA00, 0xFA80, 0xFB00, 0xFB80, - 0xFC00, 0xFC80, 0xFD00, 0xFD80, 0xFE00, 0xFE80, 0xFF00, 0xFF80, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x00C0, 0x0250, 0x0370, 0x0530, 0x3040, 0x30A0, 0xFF60 - }; - - if (!len) - return 0; - - memmove(&text[buflen - len], text, len); - from = (unsigned char*)&text[buflen - len]; - to = (unsigned char *)text; - - // ------------------------------- - - for (int i = 0; i < len;) { - - - if (i >= len) break; - c = from[i++]; - - if (c >= 0x80) - { - to = UTF8Output (c - 0x80 + slide[active], to); - } - else if (c >= 0x20 && c <= 0x7F) - { - to = UTF8Output (c, to); - } - else if (c == 0x0 || c == 0x9 || c == 0xA || c == 0xC || c == 0xD) - { - to = UTF8Output (c, to); - } - else if (c >= 0x1 && c <= 0x8) // SQn - { - if (i >= len) break; - d = from[i++]; // single quote - - to = UTF8Output (d < 0x80 ? d + start [c - 0x1] : - d - 0x80 + slide [c - 0x1], to); - } - else if (c >= 0x10 && c <= 0x17) // SCn - { - active = c - 0x10; // change window - } - else if (c >= 0x18 && c <= 0x1F) // SDn - { - active = c - 0x18; // define window - if (i >= len) break; - slide [active] = win [from[i++]]; - } - else if (c == 0xB) // SDX - { - if (i >= len) break; - c = from[i++]; - - if (i >= len) break; - d = from[i++]; - - slide [active = c>>5] = 0x10000 + (((c & 0x1F) << 8 | d) << 7); - } - else if (c == 0xE) // SQU - { - if (i >= len) break; - c = from[i++]; // SQU - - if (i >= len) break; - to = UTF8Output (c << 8 | from[i++], to); - } - else if (c == 0xF) // SCU - { - mode = 1; // change to Unicode mode - - while (mode) - { - if (i >= len) break; - c = from[i++]; - - if (c <= 0xDF || c >= 0xF3) - { - if (i >= len) break; - to = UTF8Output (c << 8 | from[i++], to); - } - else if (c == 0xF0) // UQU - { - if (i >= len) break; - c = from[i++]; - - if (i >= len) break; - to = UTF8Output (c << 8 | from[i++], to); - } - else if (c >= 0xE0 && c <= 0xE7) // UCn - { - active = c - 0xE0; mode = 0; - } - else if (c >= 0xE8 && c <= 0xEF) // UDn - { - if (i >= len) break; - slide [active=c-0xE8] = win [from[i++]]; mode = 0; - } - else if (c == 0xF1) // UDX - { - if (i >= len) break; - c = from[i++]; - - if (i >= len) break; - d = from[i++]; - - slide [active = c>>5] = - 0x10000 + (((c & 0x1F) << 8 | d) << 7); mode = 0; - } - } - } - - - } - - *to++ = 0; - *to = 0; -*/ - return 0; -} - -SWORD_NAMESPACE_END diff --git a/src/modules/filters/swoptfilter.cpp b/src/modules/filters/swoptfilter.cpp index 6921190..9d6dac4 100644 --- a/src/modules/filters/swoptfilter.cpp +++ b/src/modules/filters/swoptfilter.cpp @@ -1,9 +1,24 @@ /****************************************************************************** * - * swoptfilter - SWFilter descendant and base class for all option filters + * swoptfilter - SWFilter descendant and base class for all option filters + * + * + * 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 <swoptfilter.h> #include <utilstr.h> diff --git a/src/modules/filters/teihtmlhref.cpp b/src/modules/filters/teihtmlhref.cpp index 1d213f4..7e27667 100644 --- a/src/modules/filters/teihtmlhref.cpp +++ b/src/modules/filters/teihtmlhref.cpp @@ -1,18 +1,24 @@ /*************************************************************************** - teirtf.cpp - TEI to HTMLHREF filter - ------------------- - begin : 2006-07-03 - copyright : 2006 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * teirtf.cpp - TEI to HTMLHREF filter + * ------------------- + * begin : 2006-07-03 + * copyright : 2006 by CrossWire Bible Society + * + * 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 <stdlib.h> #include <ctype.h> @@ -20,6 +26,7 @@ #include <utilxml.h> #include <swmodule.h> #include <url.h> +#include <iostream> SWORD_NAMESPACE_START @@ -137,8 +144,8 @@ bool TEIHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData !strcmp(tag.getName(), "case") || !strcmp(tag.getName(), "gram") || !strcmp(tag.getName(), "number") || - !strcmp(tag.getName(), "pron") || - !strcmp(tag.getName(), "def")) { + !strcmp(tag.getName(), "pron") /*|| + !strcmp(tag.getName(), "def")*/) { if ((!tag.isEndTag()) && (!tag.isEmpty())) { buf += "<i>"; } @@ -172,6 +179,67 @@ bool TEIHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData !strcmp(tag.getName(), "usg")) { // do nothing here } + else if (!strcmp(tag.getName(), "ref")) { + if (!tag.isEndTag()) { + u->suspendTextPassThru = true; + SWBuf target; + SWBuf work; + SWBuf ref; + + int was_osisref = false; + if(tag.getAttribute("osisRef")) + { + target += tag.getAttribute("osisRef"); + was_osisref=true; + } + else if(tag.getAttribute("target")) + target += tag.getAttribute("target"); + + if(target.size()) + { + const char* the_ref = strchr(target, ':'); + + if(!the_ref) { + // No work + ref = target; + } + else { + // Compensate for starting : + ref = the_ref + 1; + + int size = target.size() - ref.size() - 1; + work.setSize(size); + strncpy(work.getRawData(), target, size); + } + + if(was_osisref) + { + buf.appendFormatted("<a href=\"passagestudy.jsp?action=showRef&type=scripRef&value=%s&module=%s\">", + (ref) ? URL::encode(ref.c_str()).c_str() : "", + (work.size()) ? URL::encode(work.c_str()).c_str() : ""); + } + else + { + // Dictionary link, or something + buf.appendFormatted("<a href=\"sword://%s/%s\">", + (work.size()) ? URL::encode(work.c_str()).c_str() : u->version.c_str(), + (ref) ? URL::encode(ref.c_str()).c_str() : "" + ); + } + } + else + { + //std::cout << "TARGET WASN'T\n"; + } + + } + else { + buf += u->lastTextNode.c_str(); + buf += "</a>"; + + u->suspendTextPassThru = false; + } + } // <note> tag else if (!strcmp(tag.getName(), "note")) { diff --git a/src/modules/filters/teiplain.cpp b/src/modules/filters/teiplain.cpp index c721d84..90b7c7c 100644 --- a/src/modules/filters/teiplain.cpp +++ b/src/modules/filters/teiplain.cpp @@ -1,18 +1,24 @@ /*************************************************************************** - teiplain.cpp - TEI to Plaintext filter - ------------------- - begin : 2006-07-05 - copyright : 2006 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * teiplain.cpp - TEI to Plaintext filter + * ------------------- + * begin : 2006-07-05 + * copyright : 2006 by CrossWire Bible Society + * + * 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 <stdlib.h> #include <teiplain.h> diff --git a/src/modules/filters/teirtf.cpp b/src/modules/filters/teirtf.cpp index 006f099..8560f5c 100644 --- a/src/modules/filters/teirtf.cpp +++ b/src/modules/filters/teirtf.cpp @@ -1,18 +1,24 @@ /***************************************************************************
- teirtf.cpp - TEI to RTF filter
- -------------------
- begin : 2006-07-03
- copyright : 2006 by CrossWire Bible Society
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * 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; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
+ * teirtf.cpp - TEI to RTF filter
+ * -------------------
+ * begin : 2006-07-03
+ * copyright : 2006 by CrossWire Bible Society
+ *
+ * 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 <stdlib.h>
#include <ctype.h>
@@ -26,6 +32,7 @@ SWORD_NAMESPACE_START TEIRTF::MyUserData::MyUserData(const SWModule *module, const SWKey *key) : BasicFilterUserData(module, key) {
BiblicalText = false;
+ inOsisRef = false;
if (module) {
version = module->Name();
BiblicalText = (!strcmp(module->Type(), "Biblical Texts"));
@@ -66,10 +73,10 @@ bool TEIRTF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *use }
// <hi>
- else if (!strcmp(tag.getName(), "hi")) {
+ else if (!strcmp(tag.getName(), "hi") || !strcmp(tag.getName(), "emph")) {
SWBuf rend = tag.getAttribute("rend");
if ((!tag.isEndTag()) && (!tag.isEmpty())) {
- if (rend == "ital")
+ if (rend == "ital" || rend == "italic")
buf += "{\\i1 ";
else if (rend == "bold")
buf += "{\\b1 ";
@@ -169,6 +176,25 @@ bool TEIRTF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *use }
}
+ // <lb/> tag
+ else if (!strcmp(tag.getName(), "lb")) {
+ buf += "{\\par}";
+ userData->supressAdjacentWhitespace = true;
+ }
+
+ // <ref> tag
+ else if (!strcmp(tag.getName(), "ref")) {
+ if (!tag.isEndTag() && tag.getAttribute("osisRef")) {
+ buf += "{<a href=\"\">";
+ u->inOsisRef = true;
+ }
+ else if (tag.isEndTag() && u->inOsisRef) {
+ buf += "</a>}";
+ u->inOsisRef = false;
+ }
+ }
+
+
else {
return false; // we still didn't handle token
}
diff --git a/src/modules/filters/thmlfootnotes.cpp b/src/modules/filters/thmlfootnotes.cpp index 23c43b4..e75311a 100644 --- a/src/modules/filters/thmlfootnotes.cpp +++ b/src/modules/filters/thmlfootnotes.cpp @@ -2,9 +2,26 @@ * * thmlfootnotes - SWFilter descendant to hide or show footnotes * in a ThML module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <thmlfootnotes.h> @@ -39,7 +56,13 @@ char ThMLFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m SWBuf refs = ""; int footnoteNum = 1; char buf[254]; - VerseKey parser = key->getText(); + SWKey *p = (module) ? module->CreateKey() : (key) ? key->clone() : new VerseKey(); + VerseKey *parser = SWDYNAMIC_CAST(VerseKey, p); + if (!parser) { + delete p; + parser = new VerseKey(); + } + *parser = key->getText(); SWBuf orig = text; const char *from = orig.c_str(); @@ -78,7 +101,7 @@ char ThMLFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m startTag.setAttribute("swordFootnote", buf); if ((startTag.getAttribute("type")) && (!strcmp(startTag.getAttribute("type"), "crossReference"))) { if (!refs.length()) - refs = parser.ParseVerseList(tagText.c_str(), parser, true).getRangeText(); + refs = parser->ParseVerseList(tagText.c_str(), *parser, true).getRangeText(); module->getEntryAttributes()["Footnote"][buf]["refList"] = refs.c_str(); } } @@ -118,6 +141,7 @@ char ThMLFootnotes::processText(SWBuf &text, const SWKey *key, const SWModule *m } else tagText += *from; } + delete parser; return 0; } diff --git a/src/modules/filters/thmlgbf.cpp b/src/modules/filters/thmlgbf.cpp index f8703b1..e2e8e1c 100644 --- a/src/modules/filters/thmlgbf.cpp +++ b/src/modules/filters/thmlgbf.cpp @@ -1,18 +1,25 @@ /*************************************************************************** - thmlgbf.cpp - ThML to GBF filter - ------------------- - begin : 1999-10-28 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * thmlgbf.cpp - ThML to GBF filter + * ------------------- + * begin : 1999-10-28 + * copyright : 2001 by CrossWire Bible Society + * + * + * 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 <stdlib.h> #include <thmlgbf.h> diff --git a/src/modules/filters/thmlheadings.cpp b/src/modules/filters/thmlheadings.cpp index 4d6134f..e2b7c97 100644 --- a/src/modules/filters/thmlheadings.cpp +++ b/src/modules/filters/thmlheadings.cpp @@ -2,9 +2,24 @@ * * thmlheadings - SWFilter descendant to hide or show headings * in a ThML module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <thmlheadings.h> diff --git a/src/modules/filters/thmlhtml.cpp b/src/modules/filters/thmlhtml.cpp index efb09cd..4c66b87 100644 --- a/src/modules/filters/thmlhtml.cpp +++ b/src/modules/filters/thmlhtml.cpp @@ -1,18 +1,25 @@ /*************************************************************************** - thmlhtml.cpp - ThML to HTML filter - ------------------- - begin : 1999-10-27 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * thmlhtml.cpp - ThML to HTML filter + * ------------------- + * begin : 1999-10-27 + * copyright : 2001 by CrossWire Bible Society + * + * + * 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 <stdlib.h> #include <thmlhtml.h> diff --git a/src/modules/filters/thmlhtmlhref.cpp b/src/modules/filters/thmlhtmlhref.cpp index 0596f75..83f5a80 100644 --- a/src/modules/filters/thmlhtmlhref.cpp +++ b/src/modules/filters/thmlhtmlhref.cpp @@ -1,18 +1,26 @@ /*************************************************************************** - thmlhtmlhref.cpp - ThML to HTML filter with hrefs - ------------------- - begin : 2001-09-03 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ + * thmlhtmlhref.cpp - ThML to HTML filter with hrefs + * ------------------- + * begin : 2001-09-03 + * copyright : 2001 by CrossWire Bible Society + * + * + * 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. + * + */ -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ #include <stdlib.h> #include <thmlhtmlhref.h> #include <swmodule.h> @@ -320,8 +328,8 @@ bool ThMLHTMLHREF::handleToken(SWBuf &buf, const char *token, BasicFilterUserDat URL::encode(u->version.c_str()).c_str()); for (c = token; *c; c++) { - if ((*c == '/') && (*(c+1) == '\0')) - continue; + if ((*c == '/') && (*(c+1) == '\0')) + continue; if (c == src) { for (;((*c) && (*c != '"')); c++) buf += *c; diff --git a/src/modules/filters/thmllemma.cpp b/src/modules/filters/thmllemma.cpp index 3e5761d..53eec58 100644 --- a/src/modules/filters/thmllemma.cpp +++ b/src/modules/filters/thmllemma.cpp @@ -2,9 +2,24 @@ * * thmllemma - SWFilter descendant to hide or show lemmas * in a ThML module. + * + * + * 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 <stdlib.h> #include <thmllemma.h> diff --git a/src/modules/filters/thmlmorph.cpp b/src/modules/filters/thmlmorph.cpp index 0fbef56..d3cf597 100644 --- a/src/modules/filters/thmlmorph.cpp +++ b/src/modules/filters/thmlmorph.cpp @@ -2,9 +2,24 @@ * * thmlmorph - SWFilter descendant to hide or show morph tags * in a ThML module. + * + * + * 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 <stdlib.h> #include <thmlmorph.h> diff --git a/src/modules/filters/thmlosis.cpp b/src/modules/filters/thmlosis.cpp index 939be82..25fdf23 100644 --- a/src/modules/filters/thmlosis.cpp +++ b/src/modules/filters/thmlosis.cpp @@ -2,9 +2,24 @@ * * thmlstrongs - SWFilter descendant to hide or show strongs number * in a ThML module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <stdarg.h> @@ -326,7 +341,7 @@ char ThMLOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module } // Footnote - if (!strcmp(token, "note")) { + if (!strncmp(token, "note", 4)) { //pushString(&to, "<note>"); text.append("<note>"); newText = true; @@ -534,23 +549,23 @@ char ThMLOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module text = ref + text; if (vkey->Verse()) { - VerseKey tmp; - tmp = *vkey; - tmp.AutoNormalize(0); - tmp.Headings(1); - + VerseKey *tmp = (VerseKey *)vkey->clone(); + *tmp = *vkey; + tmp->AutoNormalize(0); + tmp->Headings(1); + text += "</verse>"; - - tmp = MAXVERSE; - if (*vkey == tmp) { - tmp.Verse(0); + + *tmp = MAXVERSE; + if (*vkey == *tmp) { + tmp->Verse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); - tmp = MAXCHAPTER; - tmp = MAXVERSE; - if (*vkey == tmp) { - tmp.Chapter(0); - tmp.Verse(0); + *tmp = MAXCHAPTER; + *tmp = MAXVERSE; + if (*vkey == *tmp) { + tmp->Chapter(0); + tmp->Verse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); /* @@ -561,6 +576,7 @@ char ThMLOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module */ } } + delete tmp; } // else if (vkey->Chapter()) { // sprintf(ref, "\t<div type=\"chapter\" osisID=\"%s\">", vkey->getOSISRef()); diff --git a/src/modules/filters/thmlplain.cpp b/src/modules/filters/thmlplain.cpp index 8f8379a..8c9358f 100644 --- a/src/modules/filters/thmlplain.cpp +++ b/src/modules/filters/thmlplain.cpp @@ -2,9 +2,24 @@ * * thmlplain - SWFilter descendant to strip out all ThML tags or convert to * ASCII rendered symbols. + * + * + * 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 <stdlib.h> #include <thmlplain.h> #include <swbuf.h> @@ -55,104 +70,104 @@ char ThMLPlain::processText(SWBuf &text, const SWKey *key, const SWModule *modul else if (!strncmp("amp", token, 3)) text += '&'; else if (!strncmp("lt", token, 2)) text += '<'; else if (!strncmp("gt", token, 2)) text += '>'; - else if (!strncmp("brvbar", token, 6)) text += '¦'; - else if (!strncmp("sect", token, 4)) text += '§'; - else if (!strncmp("copy", token, 4)) text += '©'; - else if (!strncmp("laquo", token, 5)) text += '«'; - else if (!strncmp("reg", token, 3)) text += '®'; - else if (!strncmp("acute", token, 5)) text += '´'; - else if (!strncmp("para", token, 4)) text += '¶'; - else if (!strncmp("raquo", token, 5)) text += '»'; + else if (!strncmp("brvbar", token, 6)) text += "¦"; + else if (!strncmp("sect", token, 4)) text += "§"; + else if (!strncmp("copy", token, 4)) text += "©"; + else if (!strncmp("laquo", token, 5)) text += "«"; + else if (!strncmp("reg", token, 3)) text += "®"; + else if (!strncmp("acute", token, 5)) text += "´"; + else if (!strncmp("para", token, 4)) text += "¶"; + else if (!strncmp("raquo", token, 5)) text += "»"; - else if (!strncmp("Aacute", token, 6)) text += 'Á'; - else if (!strncmp("Agrave", token, 6)) text += 'À'; - else if (!strncmp("Acirc", token, 5)) text += 'Â'; - else if (!strncmp("Auml", token, 4)) text += 'Ä'; - else if (!strncmp("Atilde", token, 6)) text += 'Ã'; - else if (!strncmp("Aring", token, 5)) text += 'Å'; - else if (!strncmp("aacute", token, 6)) text += 'á'; - else if (!strncmp("agrave", token, 6)) text += 'à'; - else if (!strncmp("acirc", token, 5)) text += 'â'; - else if (!strncmp("auml", token, 4)) text += 'ä'; - else if (!strncmp("atilde", token, 6)) text += 'ã'; - else if (!strncmp("aring", token, 5)) text += 'å'; - else if (!strncmp("Eacute", token, 6)) text += 'É'; - else if (!strncmp("Egrave", token, 6)) text += 'È'; - else if (!strncmp("Ecirc", token, 5)) text += 'Ê'; - else if (!strncmp("Euml", token, 4)) text += 'Ë'; - else if (!strncmp("eacute", token, 6)) text += 'é'; - else if (!strncmp("egrave", token, 6)) text += 'è'; - else if (!strncmp("ecirc", token, 5)) text += 'ê'; - else if (!strncmp("euml", token, 4)) text += 'ë'; - else if (!strncmp("Iacute", token, 6)) text += 'Í'; - else if (!strncmp("Igrave", token, 6)) text += 'Ì'; - else if (!strncmp("Icirc", token, 5)) text += 'Î'; - else if (!strncmp("Iuml", token, 4)) text += 'Ï'; - else if (!strncmp("iacute", token, 6)) text += 'í'; - else if (!strncmp("igrave", token, 6)) text += 'ì'; - else if (!strncmp("icirc", token, 5)) text += 'î'; - else if (!strncmp("iuml", token, 4)) text += 'ï'; - else if (!strncmp("Oacute", token, 6)) text += 'Ó'; - else if (!strncmp("Ograve", token, 6)) text += 'Ò'; - else if (!strncmp("Ocirc", token, 5)) text += 'Ô'; - else if (!strncmp("Ouml", token, 4)) text += 'Ö'; - else if (!strncmp("Otilde", token, 6)) text += 'Õ'; - else if (!strncmp("oacute", token, 6)) text += 'ó'; - else if (!strncmp("ograve", token, 6)) text += 'ò'; - else if (!strncmp("ocirc", token, 5)) text += 'ô'; - else if (!strncmp("ouml", token, 4)) text += 'ö'; - else if (!strncmp("otilde", token, 6)) text += 'õ'; - else if (!strncmp("Uacute", token, 6)) text += 'Ú'; - else if (!strncmp("Ugrave", token, 6)) text += 'Ù'; - else if (!strncmp("Ucirc", token, 5)) text += 'Û'; - else if (!strncmp("Uuml", token, 4)) text += 'Ü'; - else if (!strncmp("uacute", token, 6)) text += 'ú'; - else if (!strncmp("ugrave", token, 6)) text += 'ù'; - else if (!strncmp("ucirc", token, 5)) text += 'û'; - else if (!strncmp("uuml", token, 4)) text += 'ü'; - else if (!strncmp("Yacute", token, 6)) text += 'Ý'; - else if (!strncmp("yacute", token, 6)) text += 'ý'; - else if (!strncmp("yuml", token, 4)) text += 'ÿ'; + else if (!strncmp("Aacute", token, 6)) text += "Ã"; + else if (!strncmp("Agrave", token, 6)) text += "À"; + else if (!strncmp("Acirc", token, 5)) text += "Â"; + else if (!strncmp("Auml", token, 4)) text += "Ä"; + else if (!strncmp("Atilde", token, 6)) text += "Ã"; + else if (!strncmp("Aring", token, 5)) text += "Ã…"; + else if (!strncmp("aacute", token, 6)) text += "á"; + else if (!strncmp("agrave", token, 6)) text += "à "; + else if (!strncmp("acirc", token, 5)) text += "â"; + else if (!strncmp("auml", token, 4)) text += "ä"; + else if (!strncmp("atilde", token, 6)) text += "ã"; + else if (!strncmp("aring", token, 5)) text += "Ã¥"; + else if (!strncmp("Eacute", token, 6)) text += "É"; + else if (!strncmp("Egrave", token, 6)) text += "È"; + else if (!strncmp("Ecirc", token, 5)) text += "Ê"; + else if (!strncmp("Euml", token, 4)) text += "Ë"; + else if (!strncmp("eacute", token, 6)) text += "é"; + else if (!strncmp("egrave", token, 6)) text += "è"; + else if (!strncmp("ecirc", token, 5)) text += "ê"; + else if (!strncmp("euml", token, 4)) text += "ë"; + else if (!strncmp("Iacute", token, 6)) text += "Ã"; + else if (!strncmp("Igrave", token, 6)) text += "ÃŒ"; + else if (!strncmp("Icirc", token, 5)) text += "ÃŽ"; + else if (!strncmp("Iuml", token, 4)) text += "Ã"; + else if (!strncmp("iacute", token, 6)) text += "Ã"; + else if (!strncmp("igrave", token, 6)) text += "ì"; + else if (!strncmp("icirc", token, 5)) text += "î"; + else if (!strncmp("iuml", token, 4)) text += "ï"; + else if (!strncmp("Oacute", token, 6)) text += "Ó"; + else if (!strncmp("Ograve", token, 6)) text += "Ã’"; + else if (!strncmp("Ocirc", token, 5)) text += "Ô"; + else if (!strncmp("Ouml", token, 4)) text += "Ö"; + else if (!strncmp("Otilde", token, 6)) text += "Õ"; + else if (!strncmp("oacute", token, 6)) text += "ó"; + else if (!strncmp("ograve", token, 6)) text += "ò"; + else if (!strncmp("ocirc", token, 5)) text += "ô"; + else if (!strncmp("ouml", token, 4)) text += "ö"; + else if (!strncmp("otilde", token, 6)) text += "õ"; + else if (!strncmp("Uacute", token, 6)) text += "Ú"; + else if (!strncmp("Ugrave", token, 6)) text += "Ù"; + else if (!strncmp("Ucirc", token, 5)) text += "Û"; + else if (!strncmp("Uuml", token, 4)) text += "Ãœ"; + else if (!strncmp("uacute", token, 6)) text += "ú"; + else if (!strncmp("ugrave", token, 6)) text += "ù"; + else if (!strncmp("ucirc", token, 5)) text += "û"; + else if (!strncmp("uuml", token, 4)) text += "ü"; + else if (!strncmp("Yacute", token, 6)) text += "Ã"; + else if (!strncmp("yacute", token, 6)) text += "ý"; + else if (!strncmp("yuml", token, 4)) text += "ÿ"; - else if (!strncmp("deg", token, 3)) text += '°'; - else if (!strncmp("plusmn", token, 6)) text += '±'; - else if (!strncmp("sup2", token, 4)) text += '²'; - else if (!strncmp("sup3", token, 4)) text += '³'; - else if (!strncmp("sup1", token, 4)) text += '¹'; - else if (!strncmp("nbsp", token, 4)) text += 'º'; - else if (!strncmp("pound", token, 5)) text += '£'; - else if (!strncmp("cent", token, 4)) text += '¢'; - else if (!strncmp("frac14", token, 6)) text += '¼'; - else if (!strncmp("frac12", token, 6)) text += '½'; - else if (!strncmp("frac34", token, 6)) text += '¾'; - else if (!strncmp("iquest", token, 6)) text += '¿'; - else if (!strncmp("iexcl", token, 5)) text += '¡'; - else if (!strncmp("ETH", token, 3)) text += 'Ð'; - else if (!strncmp("eth", token, 3)) text += 'ð'; - else if (!strncmp("THORN", token, 5)) text += 'Þ'; - else if (!strncmp("thorn", token, 5)) text += 'þ'; - else if (!strncmp("AElig", token, 5)) text += 'Æ'; - else if (!strncmp("aelig", token, 5)) text += 'æ'; - else if (!strncmp("Oslash", token, 6)) text += 'Ø'; - else if (!strncmp("curren", token, 6)) text += '¤'; - else if (!strncmp("Ccedil", token, 6)) text += 'Ç'; - else if (!strncmp("ccedil", token, 6)) text += 'ç'; - else if (!strncmp("szlig", token, 5)) text += 'ß'; - else if (!strncmp("Ntilde", token, 6)) text += 'Ñ'; - else if (!strncmp("ntilde", token, 6)) text += 'ñ'; - else if (!strncmp("yen", token, 3)) text += '¥'; - else if (!strncmp("not", token, 3)) text += '¬'; - else if (!strncmp("ordf", token, 4)) text += 'ª'; - else if (!strncmp("uml", token, 3)) text += '¨'; - else if (!strncmp("shy", token, 3)) text += ''; - else if (!strncmp("macr", token, 4)) text += '¯'; - else if (!strncmp("micro", token, 5)) text += "µ"; - else if (!strncmp("middot", token, 6)) text +="·"; - else if (!strncmp("cedil", token, 5)) text += "¸"; - else if (!strncmp("ordm", token, 4)) text += "º"; - else if (!strncmp("times", token, 5)) text += "×"; - else if (!strncmp("divide", token, 6)) text +="÷"; - else if (!strncmp("oslash", token, 6)) text +="ø"; + else if (!strncmp("deg", token, 3)) text += "°"; + else if (!strncmp("plusmn", token, 6)) text += "±"; + else if (!strncmp("sup2", token, 4)) text += "²"; + else if (!strncmp("sup3", token, 4)) text += "³"; + else if (!strncmp("sup1", token, 4)) text += "¹"; + else if (!strncmp("nbsp", token, 4)) text += "º"; + else if (!strncmp("pound", token, 5)) text += "£"; + else if (!strncmp("cent", token, 4)) text += "¢"; + else if (!strncmp("frac14", token, 6)) text += "¼"; + else if (!strncmp("frac12", token, 6)) text += "½"; + else if (!strncmp("frac34", token, 6)) text += "¾"; + else if (!strncmp("iquest", token, 6)) text += "¿"; + else if (!strncmp("iexcl", token, 5)) text += "¡"; + else if (!strncmp("ETH", token, 3)) text += "Ã"; + else if (!strncmp("eth", token, 3)) text += "ð"; + else if (!strncmp("THORN", token, 5)) text += "Þ"; + else if (!strncmp("thorn", token, 5)) text += "þ"; + else if (!strncmp("AElig", token, 5)) text += "Æ"; + else if (!strncmp("aelig", token, 5)) text += "æ"; + else if (!strncmp("Oslash", token, 6)) text += "Ø"; + else if (!strncmp("curren", token, 6)) text += "¤"; + else if (!strncmp("Ccedil", token, 6)) text += "Ç"; + else if (!strncmp("ccedil", token, 6)) text += "ç"; + else if (!strncmp("szlig", token, 5)) text += "ß"; + else if (!strncmp("Ntilde", token, 6)) text += "Ñ"; + else if (!strncmp("ntilde", token, 6)) text += "ñ"; + else if (!strncmp("yen", token, 3)) text += "Â¥"; + else if (!strncmp("not", token, 3)) text += "¬"; + else if (!strncmp("ordf", token, 4)) text += "ª"; + else if (!strncmp("uml", token, 3)) text += "¨"; + else if (!strncmp("shy", token, 3)) text += "Â"; + else if (!strncmp("macr", token, 4)) text += "¯"; + else if (!strncmp("micro", token, 5)) text += "µ"; + else if (!strncmp("middot", token, 6)) text += "·"; + else if (!strncmp("cedil", token, 5)) text += "¸"; + else if (!strncmp("ordm", token, 4)) text += "º"; + else if (!strncmp("times", token, 5)) text += "×"; + else if (!strncmp("divide", token, 6)) text += "÷"; + else if (!strncmp("oslash", token, 6)) text += "ø"; continue; } @@ -177,14 +192,14 @@ char ThMLPlain::processText(SWBuf &text, const SWKey *key, const SWModule *modul } if (!strncmp("note", token, 4)) { text += ' '; - text += '('; + text += '['; } else if (!strncmp("br", token, 2)) text += '\n'; else if (!strncmp("/p", token, 2)) text += '\n'; else if (!strncmp("/note", token, 5)) { - text += ')'; + text += ']'; text += ' '; } continue; diff --git a/src/modules/filters/thmlrtf.cpp b/src/modules/filters/thmlrtf.cpp index 23e4a90..fdb41df 100644 --- a/src/modules/filters/thmlrtf.cpp +++ b/src/modules/filters/thmlrtf.cpp @@ -1,18 +1,25 @@ /*************************************************************************** - thmlrtf.cpp - ThML to RTF filter - ------------------- - begin : 1999-10-27 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * thmlrtf.cpp - ThML to RTF filter + * ------------------- + * begin : 1999-10-27 + * copyright : 2001 by CrossWire Bible Society + * + * + * 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 <stdlib.h> #include <thmlrtf.h> diff --git a/src/modules/filters/thmlscripref.cpp b/src/modules/filters/thmlscripref.cpp index df2b3d2..e46d679 100644 --- a/src/modules/filters/thmlscripref.cpp +++ b/src/modules/filters/thmlscripref.cpp @@ -2,9 +2,24 @@ * * thmlscripref - SWFilter descendant to hide or show scripture * referebces in a ThML module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <thmlscripref.h> @@ -38,7 +53,13 @@ char ThMLScripref::processText(SWBuf &text, const SWKey *key, const SWModule *mo SWBuf refs = ""; int footnoteNum = 1; char buf[254]; - VerseKey parser = key->getText(); + SWKey *p = (module) ? module->CreateKey() : (key) ? key->clone() : new VerseKey(); + VerseKey *parser = SWDYNAMIC_CAST(VerseKey, p); + if (!parser) { + delete p; + parser = new VerseKey(); + } + *parser = key->getText(); SWBuf orig = text; const char *from = orig.c_str(); @@ -77,8 +98,8 @@ char ThMLScripref::processText(SWBuf &text, const SWKey *key, const SWModule *mo startTag.setAttribute("swordFootnote", buf); SWBuf passage = startTag.getAttribute("passage"); if (passage.length()) - refs = parser.ParseVerseList(passage.c_str(), parser, true).getRangeText(); - else refs = parser.ParseVerseList(tagText.c_str(), parser, true).getRangeText(); + refs = parser->ParseVerseList(passage.c_str(), *parser, true).getRangeText(); + else refs = parser->ParseVerseList(tagText.c_str(), *parser, true).getRangeText(); module->getEntryAttributes()["Footnote"][buf]["refList"] = refs.c_str(); } hide = false; @@ -117,6 +138,7 @@ char ThMLScripref::processText(SWBuf &text, const SWKey *key, const SWModule *mo } else tagText += *from; } + delete parser; return 0; } diff --git a/src/modules/filters/thmlstrongs.cpp b/src/modules/filters/thmlstrongs.cpp index c1ab08c..457e28b 100644 --- a/src/modules/filters/thmlstrongs.cpp +++ b/src/modules/filters/thmlstrongs.cpp @@ -2,9 +2,24 @@ * * thmlstrongs - SWFilter descendant to hide or show strongs number * in a ThML module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <thmlstrongs.h> diff --git a/src/modules/filters/thmlvariants.cpp b/src/modules/filters/thmlvariants.cpp index 49f9b65..4f28dbe 100644 --- a/src/modules/filters/thmlvariants.cpp +++ b/src/modules/filters/thmlvariants.cpp @@ -2,9 +2,24 @@ * * thmlvariants - SWFilter descendant to hide or show textual variants * in a ThML module. + * + * + * 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 <stdlib.h> #include <thmlvariants.h> #include <utilstr.h> diff --git a/src/modules/filters/thmlwebif.cpp b/src/modules/filters/thmlwebif.cpp index 7428754..0192703 100644 --- a/src/modules/filters/thmlwebif.cpp +++ b/src/modules/filters/thmlwebif.cpp @@ -1,18 +1,25 @@ /*************************************************************************** - ThMLWEBIF.cpp - ThML to HTML filter with hrefs - ------------------- - begin : 2001-09-03 - copyright : 2001 by CrossWire Bible Society - ***************************************************************************/ - -/*************************************************************************** - * * - * 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; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ + * ThMLWEBIF.cpp - ThML to HTML filter with hrefs + * ------------------- + * begin : 2001-09-03 + * copyright : 2001 by CrossWire Bible Society + * + * + * 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 <stdlib.h> #include <thmlwebif.h> diff --git a/src/modules/filters/thmlwordjs.cpp b/src/modules/filters/thmlwordjs.cpp index ad8eef0..12fbeb1 100644 --- a/src/modules/filters/thmlwordjs.cpp +++ b/src/modules/filters/thmlwordjs.cpp @@ -2,9 +2,24 @@ * * thmlstrongs - SWFilter descendant to hide or show strongs number * in a ThML module. + * + * + * 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 <stdlib.h> #include <stdio.h> #include <thmlwordjs.h> diff --git a/src/modules/filters/unicodertf.cpp b/src/modules/filters/unicodertf.cpp index 8c2a1f6..768aecc 100644 --- a/src/modules/filters/unicodertf.cpp +++ b/src/modules/filters/unicodertf.cpp @@ -2,9 +2,24 @@ * * unicodertf - SWFilter descendant to convert a double byte unicode file * to RTF tags + * + * + * 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 <stdlib.h> #include <stdio.h> #include <unicodertf.h> diff --git a/src/modules/filters/utf16utf8.cpp b/src/modules/filters/utf16utf8.cpp index ae0845f..a488e18 100644 --- a/src/modules/filters/utf16utf8.cpp +++ b/src/modules/filters/utf16utf8.cpp @@ -2,8 +2,25 @@ * * UTF16UTF8 - SWFilter descendant to convert UTF-16 to UTF-8 * + * + * + * 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 <stdlib.h> #include <stdio.h> diff --git a/src/modules/filters/utf8arabicpoints.cpp b/src/modules/filters/utf8arabicpoints.cpp new file mode 100644 index 0000000..bd3169b --- /dev/null +++ b/src/modules/filters/utf8arabicpoints.cpp @@ -0,0 +1,61 @@ +/****************************************************************************** + * + * UTF8ArabicPoints - SWFilter descendant to remove UTF-8 Arabic vowel points + * + * $Id: utf8arabicpoints.h 1688 2008-11-30 04:42:26Z refdoc $ + * + * 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 <stdlib.h> +#include <stdio.h> +#include <utf8arabicpoints.h> + +SWORD_NAMESPACE_START + +const char oName[] = "Arabic Vowel Points"; +const char oTip[] = "Toggles Arabic Vowel Points"; + +const SWBuf choices[3] = {"On", "Off", ""}; +const StringList oValues(&choices[0], &choices[2]); + +UTF8ArabicPoints::UTF8ArabicPoints() : SWOptionFilter(oName, oTip, &oValues) { + setOptionValue("On"); +} + +UTF8ArabicPoints::~UTF8ArabicPoints(){}; + + +char UTF8ArabicPoints::processText(SWBuf &text, const SWKey *key, const SWModule *module) { + if (!option) { + //The UTF-8 range 0xFC 0xE5 to 0xFC 0x63 consist of Arabic vowel marks so block those out. + // Also ranges 0xFE70 til OxFE7F and 0x064b-0x0655 + SWBuf orig = text; + const unsigned char* from = (unsigned char*)orig.c_str(); + for (text = ""; *from; from++) { + if (((*from == 0xFC) && (*(from + 1) >= 0xE5 && *(from + 1) <= 0x63)) || ((*from == 0xFE) && (*(from + 1) >= 0x70 && *(from + 1) <= 0x7F)) || ((*from == 0x06) && (*(from + 1) >= 0x4B && *(from + 1) <= 0x55))){ + from++; + } + else { + text += *from; + } + } + } + return 0; +} + +SWORD_NAMESPACE_END diff --git a/src/modules/filters/utf8arshaping.cpp b/src/modules/filters/utf8arshaping.cpp index 702fb62..09d8973 100644 --- a/src/modules/filters/utf8arshaping.cpp +++ b/src/modules/filters/utf8arshaping.cpp @@ -1,8 +1,24 @@ /****************************************************************************** -* -* utf8arshaping - SWFilter descendant to perform Arabic shaping on -* UTF-8 text -*/ + * + * utf8arshaping - SWFilter descendant to perform Arabic shaping on + * UTF-8 text + * + * + * 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. + * + */ #ifdef _ICU_ diff --git a/src/modules/filters/utf8bidireorder.cpp b/src/modules/filters/utf8bidireorder.cpp index 783602c..71dc804 100644 --- a/src/modules/filters/utf8bidireorder.cpp +++ b/src/modules/filters/utf8bidireorder.cpp @@ -1,8 +1,24 @@ /****************************************************************************** -* -* utf8cnormalizer - SWFilter descendant to perform reordering of UTF-8 -* text to visual order according to Unicode BiDi -*/ + * + * utf8bidireorder - SWFilter descendant to perform reordering of UTF-8 + * text to visual order according to Unicode BiDi + * + * + * 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. + * + */ #ifdef _ICU_ diff --git a/src/modules/filters/utf8cantillation.cpp b/src/modules/filters/utf8cantillation.cpp index 6213620..73785b4 100644 --- a/src/modules/filters/utf8cantillation.cpp +++ b/src/modules/filters/utf8cantillation.cpp @@ -2,9 +2,24 @@ * * UTF8Cantillation - SWFilter descendant to remove UTF-8 Hebrew cantillation * + * + * + * 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 <stdlib.h> #include <stdio.h> #include <utf8cantillation.h> diff --git a/src/modules/filters/utf8greekaccents.cpp b/src/modules/filters/utf8greekaccents.cpp index df85968..5fdb047 100644 --- a/src/modules/filters/utf8greekaccents.cpp +++ b/src/modules/filters/utf8greekaccents.cpp @@ -2,9 +2,24 @@ * * UTF8GreekAccents - SWFilter descendant to remove UTF-8 Greek accents * + * + * + * 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 <stdlib.h> #include <stdio.h> #include <utf8greekaccents.h> diff --git a/src/modules/filters/utf8hebrewpoints.cpp b/src/modules/filters/utf8hebrewpoints.cpp index 0476db8..ba7c746 100644 --- a/src/modules/filters/utf8hebrewpoints.cpp +++ b/src/modules/filters/utf8hebrewpoints.cpp @@ -2,9 +2,24 @@ * * UTF8HebrewPoints - SWFilter descendant to remove UTF-8 Hebrew vowel points * + * + * + * 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 <stdlib.h> #include <stdio.h> #include <utf8hebrewpoints.h> diff --git a/src/modules/filters/utf8html.cpp b/src/modules/filters/utf8html.cpp index 088f669..0d1dce3 100644 --- a/src/modules/filters/utf8html.cpp +++ b/src/modules/filters/utf8html.cpp @@ -2,9 +2,24 @@ * * utf8html - SWFilter descendant to convert a UTF-8 stream to HTML escapes * + * + * + * 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 <stdlib.h> #include <stdio.h> #include <utf8html.h> diff --git a/src/modules/filters/utf8latin1.cpp b/src/modules/filters/utf8latin1.cpp index 08b288d..25df0c1 100644 --- a/src/modules/filters/utf8latin1.cpp +++ b/src/modules/filters/utf8latin1.cpp @@ -2,6 +2,22 @@ * * UTF8Latin1 - SWFilter descendant to convert UTF-8 to Latin-1 * + * + * + * 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 <stdlib.h> diff --git a/src/modules/filters/utf8nfc.cpp b/src/modules/filters/utf8nfc.cpp index 15b76b5..82d404e 100644 --- a/src/modules/filters/utf8nfc.cpp +++ b/src/modules/filters/utf8nfc.cpp @@ -1,8 +1,24 @@ /****************************************************************************** -* -* utf8nfc - SWFilter descendant to perform NFC (canonical composition -* normalization) on UTF-8 text -*/ + * + * utf8nfc - SWFilter descendant to perform NFC (canonical composition + * normalization) on UTF-8 text + * + * + * 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. + * + */ #ifdef _ICU_ diff --git a/src/modules/filters/utf8nfkd.cpp b/src/modules/filters/utf8nfkd.cpp index a19d36b..1d6acf3 100644 --- a/src/modules/filters/utf8nfkd.cpp +++ b/src/modules/filters/utf8nfkd.cpp @@ -1,8 +1,24 @@ /****************************************************************************** -* -* utf8nfkd - SWFilter descendant to perform NFKD (compatability decomposition -* normalization) on UTF-8 text -*/ + * + * utf8nfkd - SWFilter descendant to perform NFKD (compatability decomposition + * normalization) on UTF-8 text + * + * + * 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. + * + */ #ifdef _ICU_ diff --git a/src/modules/filters/utf8transliterator.cpp b/src/modules/filters/utf8transliterator.cpp index d99741b..552ec3e 100644 --- a/src/modules/filters/utf8transliterator.cpp +++ b/src/modules/filters/utf8transliterator.cpp @@ -1,8 +1,24 @@ /****************************************************************************** -* -* utf8transliterators - SWFilter descendant to transliterate between -* ICU-supported scripts. -*/ + * + * utf8transliterators - SWFilter descendant to transliterate between + * ICU-supported scripts. + * + * + * 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. + * + */ #ifdef _ICU_ @@ -25,51 +41,48 @@ SWORD_NAMESPACE_START const char UTF8Transliterator::optionstring[NUMTARGETSCRIPTS][16] = { "Off", "Latin", - "IPA", - "Basic Latin", - "SBL", - "TC", - "Beta", - "BGreek", - "SERA", - "Hugoye", - "UNGEGN", - "ISO", - "ALA-LC", - "BGN-PCGN", - "Greek", - "Hebrew", - "Cyrillic", - "Arabic", - "Syriac", - "Katakana", - "Hiragana", - "Hangul", - "Devanagari", - "Tamil", - "Bengali", - "Gurmukhi", - "Gujarati", - "Oriya", - "Telugu", - "Kannada", - "Malayalam", - "Thai", - "Georgian", - "Armenian", - "Ethiopic", - "Gothic", - "Ugaritic", - "Coptic", - "Meroitic", - "Linear B", - "Cypriot", - "Runic", - "Ogham", - "Thaana", - "Glagolitic", -// "Tengwar", -// "Cirth" + // "IPA", + // "Basic Latin", + // "SBL", + // "TC", + // "Beta", + // "BGreek", + // "SERA", + // "Hugoye", + // "UNGEGN", + // "ISO", + // "ALA-LC", + // "BGN", + // "Greek", + // "Hebrew", + // "Cyrillic", + // "Arabic", + // "Syriac", + // "Katakana", + // "Hiragana", + // "Hangul", + // "Devanagari", + // "Tamil", + // "Bengali", + // "Gurmukhi", + // "Gujarati", + // "Oriya", + // "Telugu", + // "Kannada", + // "Malayalam", + // "Thai", + // "Georgian", + // "Armenian", + // "Ethiopic", + // "Gothic", + // "Ugaritic", + // "Coptic", + // "Linear B", + // "Cypriot", + // "Runic", + // "Ogham", + // "Thaana", + // "Glagolitic", }; const char UTF8Transliterator::optName[] = "Transliteration"; @@ -128,6 +141,11 @@ UTF8Transliterator::UTF8Transliterator() { #endif } + +UTF8Transliterator::~UTF8Transliterator() { +} + + void UTF8Transliterator::Load(UErrorCode &status) { #ifndef _ICUSWORD_ @@ -374,19 +392,19 @@ char UTF8Transliterator::processText(SWBuf &text, const SWKey *key, const SWModu case UBLOCK_MALAYALAM: scripts[SE_MALAYALAM] = true; break; case UBLOCK_THAI: scripts[SE_THAI] = true; break; case UBLOCK_GEORGIAN: scripts[SE_GEORGIAN] = true; break; - case UBLOCK_ARMENIAN: scripts[SE_ARMENIAN] = true; break; - case UBLOCK_ETHIOPIC: scripts[SE_ETHIOPIC] = true; break; - case UBLOCK_GOTHIC: scripts[SE_GOTHIC] = true; break; - case UBLOCK_UGARITIC: scripts[SE_UGARITIC] = true; break; -// case UBLOCK_MEROITIC: scripts[SE_MEROITIC] = true; break; -// case UBLOCK_LINEARB: scripts[SE_LINEARB] = true; break; -// case UBLOCK_CYPRIOT: scripts[SE_CYPRIOT] = true; break; - case UBLOCK_RUNIC: scripts[SE_RUNIC] = true; break; - case UBLOCK_OGHAM: scripts[SE_OGHAM] = true; break; - case UBLOCK_THAANA: scripts[SE_THAANA] = true; break; -// case UBLOCK_GLAGOLITIC: scripts[SE_GLAGOLITIC] = true; break; -// case UBLOCK_TENGWAR: scripts[SE_TENGWAR] = true; break; -// case UBLOCK_CIRTH: scripts[SE_CIRTH] = true; break; + case UBLOCK_ARMENIAN: scripts[SE_ARMENIAN] = true; break; + case UBLOCK_ETHIOPIC: scripts[SE_ETHIOPIC] = true; break; + case UBLOCK_GOTHIC: scripts[SE_GOTHIC] = true; break; + case UBLOCK_UGARITIC: scripts[SE_UGARITIC] = true; break; +// case UBLOCK_MEROITIC: scripts[SE_MEROITIC] = true; break; + case UBLOCK_LINEAR_B_SYLLABARY: scripts[SE_LINEARB] = true; break; + case UBLOCK_CYPRIOT_SYLLABARY: scripts[SE_CYPRIOT] = true; break; + case UBLOCK_RUNIC: scripts[SE_RUNIC] = true; break; + case UBLOCK_OGHAM: scripts[SE_OGHAM] = true; break; + case UBLOCK_THAANA: scripts[SE_THAANA] = true; break; + case UBLOCK_GLAGOLITIC: scripts[SE_GLAGOLITIC] = true; break; +// case UBLOCK_TENGWAR: scripts[SE_TENGWAR] = true; break; +// case UBLOCK_CIRTH: scripts[SE_CIRTH] = true; break; case UBLOCK_CJK_RADICALS_SUPPLEMENT: case UBLOCK_KANGXI_RADICALS: case UBLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS: @@ -445,8 +463,8 @@ char UTF8Transliterator::processText(SWBuf &text, const SWKey *key, const SWModu addTrans("Greek-Latin/ISO", &ID); else if (option == SE_ALALC) addTrans("Greek-Latin/ALALC", &ID); - else if (option == SE_BGNPCGN) - addTrans("Greek-Latin/BGNPCGN", &ID); + else if (option == SE_BGN) + addTrans("Greek-Latin/BGN", &ID); else if (option == SE_IPA) addTrans("Greek-IPA/Ancient", &ID); else { @@ -522,8 +540,8 @@ char UTF8Transliterator::processText(SWBuf &text, const SWKey *key, const SWModu addTrans("Georgian-Latin/ISO", &ID); else if (option == SE_ALALC) addTrans("Georgian-Latin/ALALC", &ID); - else if (option == SE_BGNPCGN) - addTrans("Georgian-Latin/BGNPCGN", &ID); + else if (option == SE_BGN) + addTrans("Georgian-Latin/BGN", &ID); else if (option == SE_IPA) addTrans("Georgian-IPA", &ID); else { @@ -536,8 +554,8 @@ char UTF8Transliterator::processText(SWBuf &text, const SWKey *key, const SWModu addTrans("Armenian-Latin/ISO", &ID); else if (option == SE_ALALC) addTrans("Armenian-Latin/ALALC", &ID); - else if (option == SE_BGNPCGN) - addTrans("Armenian-Latin/BGNPCGN", &ID); + else if (option == SE_BGN) + addTrans("Armenian-Latin/BGN", &ID); else if (option == SE_IPA) addTrans("Armenian-IPA", &ID); else { @@ -600,8 +618,8 @@ char UTF8Transliterator::processText(SWBuf &text, const SWKey *key, const SWModu if (scripts[SE_THAANA]) { if (option == SE_ALALC) addTrans("Thaana-Latin/ALALC", &ID); - else if (option == SE_BGNPCGN) - addTrans("Thaana-Latin/BGNPCGN", &ID); + else if (option == SE_BGN) + addTrans("Thaana-Latin/BGN", &ID); else { addTrans("Thaana-Latin", &ID); scripts[SE_LATIN] = true; diff --git a/src/modules/filters/utf8utf16.cpp b/src/modules/filters/utf8utf16.cpp index 5c1614c..a770d5f 100644 --- a/src/modules/filters/utf8utf16.cpp +++ b/src/modules/filters/utf8utf16.cpp @@ -2,12 +2,30 @@ * * UTF8UTF16 - SWFilter descendant to convert UTF-8 to UTF-16 * + * + * + * 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 <stdlib.h> #include <stdio.h> +#include <sysdata.h> #include <utf8utf16.h> +#include <utilstr.h> #include <swbuf.h> SWORD_NAMESPACE_START @@ -15,61 +33,36 @@ SWORD_NAMESPACE_START UTF8UTF16::UTF8UTF16() { } + char UTF8UTF16::processText(SWBuf &text, const SWKey *key, const SWModule *module) { const unsigned char *from; - unsigned long ch; - signed short utf16; - unsigned char from2[7]; - SWBuf orig = text; from = (const unsigned char *)orig.c_str(); // ------------------------------- - for (text = ""; *from; from++) { - ch = 0; - //case: ANSI - if ((*from & 128) != 128) { + text = ""; + while (*from) { + + __u32 ch = getUniCharFromUTF8(&from); + + if (!ch) continue; // invalid char + + if (ch < 0x10000) { text.setSize(text.size()+2); - *((unsigned short *)(text.getRawData()+(text.size()-2))) = (unsigned short)*from; - continue; - } - //case: Invalid UTF-8 (illegal continuing byte in initial position) - if ((*from & 128) && ((*from & 64) != 64)) { - continue; + *((__u16 *)(text.getRawData()+(text.size()-2))) = (__u16)ch; } - //case: 2+ byte codepoint - from2[0] = *from; - from2[0] <<= 1; - int subsequent; - for (subsequent = 1; (from2[0] & 128) && (subsequent < 7); subsequent++) { - from2[0] <<= 1; - from2[subsequent] = from[subsequent]; - from2[subsequent] &= 63; - ch <<= 6; - ch |= from2[subsequent]; + else { + __u16 utf16; + utf16 = (__s16)((ch - 0x10000) / 0x400 + 0xD800); + text.setSize(text.size()+4); + *((__u16 *)(text.getRawData()+(text.size()-4))) = utf16; + utf16 = (__s16)((ch - 0x10000) % 0x400 + 0xDC00); + *((__u16 *)(text.getRawData()+(text.size()-2))) = utf16; } - subsequent--; - from2[0] <<= 1; - char significantFirstBits = 8 - (2+subsequent); - - ch |= (((short)from2[0]) << (((6*subsequent)+significantFirstBits)-8)); - from += subsequent; - if (ch < 0x10000) { - text.setSize(text.size()+2); - *((unsigned short *)(text.getRawData()+(text.size()-2))) = (unsigned short)ch; - } - else { - utf16 = (signed short)((ch - 0x10000) / 0x400 + 0xD800); - text.setSize(text.size()+2); - *((unsigned short *)(text.getRawData()+(text.size()-2))) = (unsigned short)utf16; - utf16 = (signed short)((ch - 0x10000) % 0x400 + 0xDC00); - text.setSize(text.size()+2); - *((unsigned short *)(text.getRawData()+(text.size()-2))) = (unsigned short)utf16; - } } text.setSize(text.size()+2); - *((unsigned short *)(text.getRawData()+(text.size()-2))) = (unsigned short)0; + *((__u16 *)(text.getRawData()+(text.size()-2))) = (__u16)0; return 0; diff --git a/src/modules/genbook/rawgenbook/rawgenbook.cpp b/src/modules/genbook/rawgenbook/rawgenbook.cpp index 22cc51f..eff68f5 100644 --- a/src/modules/genbook/rawgenbook/rawgenbook.cpp +++ b/src/modules/genbook/rawgenbook/rawgenbook.cpp @@ -1,9 +1,26 @@ /****************************************************************************** - * rawtext.cpp - code for class 'RawGenBook'- a module that reads raw text files: - * ot and nt using indexs ??.bks ??.cps ??.vss + * rawtext.cpp - code for class 'RawGenBook'- a module that reads raw text + * files: ot and nt using indexs ??.bks ??.cps ??.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 <stdio.h> #include <fcntl.h> @@ -82,34 +99,16 @@ SWBuf &RawGenBook::getRawEntryBuf() { __u32 offset = 0; __u32 size = 0; - TreeKey *key = 0; - SWTRY { - key = SWDYNAMIC_CAST(TreeKey, (this->key)); - } - SWCATCH ( ... ) {} - - if (!key) { - VerseTreeKey *tkey = 0; - SWTRY { - tkey = SWDYNAMIC_CAST(VerseTreeKey, (this->key)); - } - SWCATCH ( ... ) {} - if (tkey) key = tkey->getTreeKey(); - } - - if (!key) { - key = (TreeKeyIdx *)CreateKey(); - (*key) = *(this->key); - } + const TreeKey &key = getTreeKey(); int dsize; - key->getUserData(&dsize); + key.getUserData(&dsize); entryBuf = ""; if (dsize > 7) { - memcpy(&offset, key->getUserData(), 4); + memcpy(&offset, key.getUserData(), 4); offset = swordtoarch32(offset); - memcpy(&size, key->getUserData() + 4, 4); + memcpy(&size, key.getUserData() + 4, 4); size = swordtoarch32(size); entrySize = size; // support getEntrySize call @@ -120,15 +119,12 @@ SWBuf &RawGenBook::getRawEntryBuf() { bdtfd->read(entryBuf.getRawData(), size); rawFilter(entryBuf, 0); // hack, decipher - rawFilter(entryBuf, key); + rawFilter(entryBuf, &key); // if (!isUnicode()) - RawStr::prepText(entryBuf); + SWModule::prepText(entryBuf); } - if (key != this->key) // free our key if we created a VerseKey - delete key; - return entryBuf; } @@ -137,7 +133,7 @@ void RawGenBook::setEntry(const char *inbuf, long len) { __u32 offset = archtosword32(bdtfd->seek(0, SEEK_END)); __u32 size = 0; - TreeKeyIdx *key = ((TreeKeyIdx *)this->key); + TreeKeyIdx *key = ((TreeKeyIdx *)&(getTreeKey())); char userData[8]; @@ -156,7 +152,7 @@ void RawGenBook::setEntry(const char *inbuf, long len) { void RawGenBook::linkEntry(const SWKey *inkey) { TreeKeyIdx *srckey = 0; - TreeKeyIdx *key = ((TreeKeyIdx *)this->key); + TreeKeyIdx *key = ((TreeKeyIdx *)&(getTreeKey())); // see if we have a VerseKey * or decendant SWTRY { srckey = SWDYNAMIC_CAST(TreeKeyIdx, inkey); @@ -183,7 +179,7 @@ void RawGenBook::linkEntry(const SWKey *inkey) { */ void RawGenBook::deleteEntry() { - TreeKeyIdx *key = ((TreeKeyIdx *)this->key); + TreeKeyIdx *key = ((TreeKeyIdx *)&(getTreeKey())); key->remove(); } @@ -211,9 +207,18 @@ char RawGenBook::createModule(const char *ipath) { } -SWKey *RawGenBook::CreateKey() { - TreeKeyIdx *newKey = new TreeKeyIdx(path); - return (verseKey) ? (SWKey *)new VerseTreeKey(newKey) : newKey; +SWKey *RawGenBook::CreateKey() const { + TreeKey *tKey = new TreeKeyIdx(path); + if (verseKey) { SWKey *vtKey = new VerseTreeKey(tKey); delete tKey; return vtKey; } + return tKey; +} + +bool RawGenBook::hasEntry(const SWKey *k) const { + TreeKey &key = getTreeKey(k); + + int dsize; + key.getUserData(&dsize); + return (dsize > 7) && key.Error() == '\x00'; } SWORD_NAMESPACE_END diff --git a/src/modules/genbook/swgenbook.cpp b/src/modules/genbook/swgenbook.cpp index 0ce16aa..e7feea2 100644 --- a/src/modules/genbook/swgenbook.cpp +++ b/src/modules/genbook/swgenbook.cpp @@ -1,9 +1,27 @@ /****************************************************************************** * swld.cpp - code for base class 'SWLD'. SWLD is the basis for all - * types of Lexicon and Dictionary modules (hence the 'LD'). + * types of Lexicon and Dictionary modules (hence the 'LD'). + * + * + * 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 <swgenbook.h> +#include <versetreekey.h> SWORD_NAMESPACE_START @@ -16,14 +34,66 @@ SWORD_NAMESPACE_START */ SWGenBook::SWGenBook(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang) : SWModule(imodname, imoddesc, idisp, (char *)"Generic Books", enc, dir, mark, ilang) { + tmpTreeKey = 0; } /****************************************************************************** - * SWLD Destructor - Cleans up instance of SWLD + * SWLD Destructor - Cleans up instance of SWGenBook */ SWGenBook::~SWGenBook() { + delete tmpTreeKey; +} + + +TreeKey &SWGenBook::getTreeKey(const SWKey *k) const { + const SWKey* thiskey = k?k:this->key; + + TreeKey *key = 0; + + SWTRY { + key = SWDYNAMIC_CAST(TreeKey, (thiskey)); + } + SWCATCH ( ... ) {} + + if (!key) { + ListKey *lkTest = 0; + SWTRY { + lkTest = SWDYNAMIC_CAST(ListKey, thiskey); + } + SWCATCH ( ... ) { } + if (lkTest) { + SWTRY { + key = SWDYNAMIC_CAST(TreeKey, lkTest->GetElement()); + if (!key) { + VerseTreeKey *tkey = 0; + SWTRY { + tkey = SWDYNAMIC_CAST(VerseTreeKey, lkTest->GetElement()); + } + SWCATCH ( ... ) {} + if (tkey) key = tkey->getTreeKey(); + } + } + SWCATCH ( ... ) { } + } + } + if (!key) { + VerseTreeKey *tkey = 0; + SWTRY { + tkey = SWDYNAMIC_CAST(VerseTreeKey, (thiskey)); + } + SWCATCH ( ... ) {} + if (tkey) key = tkey->getTreeKey(); + } + + if (!key) { + delete tmpTreeKey; + tmpTreeKey = (TreeKey *)CreateKey(); + (*tmpTreeKey) = *(thiskey); + return (*tmpTreeKey); + } + else return *key; } SWORD_NAMESPACE_END diff --git a/src/modules/lexdict/rawld/rawld.cpp b/src/modules/lexdict/rawld/rawld.cpp index 08be215..e6a4d57 100644 --- a/src/modules/lexdict/rawld/rawld.cpp +++ b/src/modules/lexdict/rawld/rawld.cpp @@ -1,11 +1,24 @@ /****************************************************************************** * rawld.cpp - code for class 'RawLD'- a module that reads raw lexicon and * dictionary files: *.dat *.idx + * + * + * 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> #include <utilstr.h> @@ -13,6 +26,8 @@ #include <rawld.h> #include <filemgr.h> +#include <stdio.h> + SWORD_NAMESPACE_START /****************************************************************************** @@ -44,50 +59,6 @@ bool RawLD::isWritable() { /****************************************************************************** - * RawLD::strongsPad - Pads a key if (it-1) is 100% digits to 5 places - * allows for final to be alpha, e.g. '123B' - * - * ENT: buf - buffer to check and pad - */ - -void RawLD::strongsPad(char *buf) -{ - char *check; - int size = 0; - int len = strlen(buf); - char subLet = 0; - bool bang = false; - if ((len < 8) && (len > 0)) { - for (check = buf; *(check+1); check++) { - if (!isdigit(*check)) - break; - else size++; - } - - if (size && ((size == (len-1)) || (size == (len-2)))) { - if (*check == '!') { - bang = true; - check++; - } - if (isalpha(*check)) { - subLet = toupper(*check); - *(check-(bang?1:0)) = 0; - } - sprintf(buf, "%.5d", atoi(buf)); - if (subLet) { - check = buf+(strlen(buf)); - if (bang) { - *check++ = '!'; - } - *check++ = subLet; - *check = 0; - } - } - } -} - - -/****************************************************************************** * RawLD::getEntry - Looks up entry from data file. 'Snaps' to closest * entry and sets 'entrybuf'. * @@ -98,8 +69,8 @@ void RawLD::strongsPad(char *buf) char RawLD::getEntry(long away) { - long start = 0; - unsigned short size = 0; + __u32 start = 0; + __u16 size = 0; char *idxbuf = 0; char retval = 0; @@ -191,4 +162,34 @@ void RawLD::deleteEntry() { doSetText(*key, ""); } + +long RawLD::getEntryCount() const { + if (idxfd < 0) return 0; + return idxfd->seek(0, SEEK_END) / IDXENTRYSIZE; +} + + +long RawLD::getEntryForKey(const char *key) const { + __u32 start, offset; + __u16 size; + + char *buf = new char [ strlen(key) + 6 ]; + strcpy(buf, key); + + strongsPad(buf); + + findOffset(buf, &start, &size, 0, &offset); + + delete [] buf; + + return offset / IDXENTRYSIZE; +} + + +char *RawLD::getKeyForEntry(long entry) const { + char *key = 0; + getIDXBuf(entry * IDXENTRYSIZE, &key); + return key; +} + SWORD_NAMESPACE_END diff --git a/src/modules/lexdict/rawld4/rawld4.cpp b/src/modules/lexdict/rawld4/rawld4.cpp index 0fd1058..6d60d9a 100644 --- a/src/modules/lexdict/rawld4/rawld4.cpp +++ b/src/modules/lexdict/rawld4/rawld4.cpp @@ -1,11 +1,24 @@ /****************************************************************************** * rawld.cpp - code for class 'RawLD'- a module that reads raw lexicon and - * dictionary files: *.dat *.idx + * dictionary files: *.dat *.idx + * + * + * 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> #include <filemgr.h> @@ -13,6 +26,8 @@ #include <rawstr4.h> #include <rawld4.h> +#include <stdio.h> + SWORD_NAMESPACE_START /****************************************************************************** @@ -44,50 +59,6 @@ bool RawLD4::isWritable() { /****************************************************************************** - * RawLD4::strongsPad - Pads a key if (it-1) is 100% digits to 5 places - * allows for final to be alpha, e.g. '123B' - * - * ENT: buf - buffer to check and pad - */ - -void RawLD4::strongsPad(char *buf) -{ - char *check; - int size = 0; - int len = strlen(buf); - char subLet = 0; - bool bang = false; - if ((len < 8) && (len > 0)) { - for (check = buf; *(check+1); check++) { - if (!isdigit(*check)) - break; - else size++; - } - - if (size && ((size == (len-1)) || (size == (len-2)))) { - if (*check == '!') { - bang = true; - check++; - } - if (isalpha(*check)) { - subLet = toupper(*check); - *(check-(bang?1:0)) = 0; - } - sprintf(buf, "%.5d", atoi(buf)); - if (subLet) { - check = buf+(strlen(buf)); - if (bang) { - *check++ = '!'; - } - *check++ = subLet; - *check = 0; - } - } - } -} - - -/****************************************************************************** * RawLD4::getEntry - Looks up entry from data file. 'Snaps' to closest * entry and sets 'entrybuf'. * @@ -98,10 +69,10 @@ void RawLD4::strongsPad(char *buf) char RawLD4::getEntry(long away) { - long start = 0; - unsigned long size = 0; + __u32 start = 0; + __u32 size = 0; char *idxbuf = 0; - char retval = 0; + char retval = 0; char *buf = new char [ strlen(*key) + 6 ]; strcpy(buf, *key); @@ -189,4 +160,31 @@ void RawLD4::deleteEntry() { doSetText(*key, ""); } +long RawLD4::getEntryCount() const { + if (idxfd < 0) return 0; + return idxfd->seek(0, SEEK_END) / IDXENTRYSIZE; +} + +long RawLD4::getEntryForKey(const char *key) const { + __u32 start, offset; + __u32 size; + + char *buf = new char [ strlen(key) + 6 ]; + strcpy(buf, key); + + strongsPad(buf); + + findOffset(buf, &start, &size, 0, &offset); + + delete [] buf; + + return offset / IDXENTRYSIZE; +} + +char *RawLD4::getKeyForEntry(long entry) const { + char *key = 0; + getIDXBuf(entry * IDXENTRYSIZE, &key); + return key; +} + SWORD_NAMESPACE_END diff --git a/src/modules/lexdict/swld.cpp b/src/modules/lexdict/swld.cpp index 518e5c0..bccf5d8 100644 --- a/src/modules/lexdict/swld.cpp +++ b/src/modules/lexdict/swld.cpp @@ -1,8 +1,26 @@ /****************************************************************************** * swld.cpp - code for base class 'SWLD'. SWLD is the basis for all - * types of Lexicon and Dictionary modules (hence the 'LD'). + * types of Lexicon and Dictionary modules (hence the 'LD'). + * + * + * 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 <swld.h> #include <strkey.h> @@ -36,7 +54,7 @@ SWLD::~SWLD() } -SWKey *SWLD::CreateKey() { return new StrKey(); } +SWKey *SWLD::CreateKey() const { return new StrKey(); } /****************************************************************************** @@ -78,5 +96,68 @@ void SWLD::setPosition(SW_POSITION p) { getRawEntryBuf(); } +bool SWLD::hasEntry(const SWKey *key) const { + const char *key_str = *key; + char *buf = new char [ strlen(key_str) + 6 ]; + strcpy(buf, key_str); + + strongsPad(buf); + + bool retVal = !strcmp(buf, getKeyForEntry(getEntryForKey(buf))); + delete buf; + + return retVal; +} + +/****************************************************************************** + * SWLD::strongsPad - Pads a key if (it-1) is 100% digits to 5 places + * allows for final to be alpha, e.g. '123B' + * + * ENT: buf - buffer to check and pad + */ + +void SWLD::strongsPad(char *buf) +{ + char *check; + int size = 0; + int len = strlen(buf); + char subLet = 0; + bool bang = false, prefix=false; + if ((len < 9) && (len > 0)) { + // Handle initial G or H + if (*buf == 'G' || *buf == 'H' || *buf == 'g' || *buf == 'h') { + buf += 1; + len -= 1; + prefix = true; + } + + for (check = buf; *(check); check++) { + if (!isdigit(*check)) + break; + else size++; + } + + if (size && ((size == len) || (size == len - 1) || (size == (len-2)))) { + if (*check == '!') { + bang = true; + check++; + } + if (isalpha(*check)) { + subLet = toupper(*check); + *(check-(bang?1:0)) = 0; + } + sprintf(buf, prefix?"%.4d":"%.5d", atoi(buf)); + if (subLet) { + check = buf+(strlen(buf)); + if (bang) { + *check++ = '!'; + } + *check++ = subLet; + *check = 0; + } + } + } +} + SWORD_NAMESPACE_END diff --git a/src/modules/lexdict/zld/zld.cpp b/src/modules/lexdict/zld/zld.cpp index bcb51ab..4e786bc 100644 --- a/src/modules/lexdict/zld/zld.cpp +++ b/src/modules/lexdict/zld/zld.cpp @@ -1,11 +1,23 @@ /****************************************************************************** * rawld.cpp - code for class 'RawLD'- a module that reads raw lexicon and - * dictionary files: *.dat *.idx + * dictionary files: *.dat *.idx + * + * 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> #include <utilstr.h> @@ -13,6 +25,8 @@ #include <zld.h> #include <filemgr.h> +#include <stdio.h> + SWORD_NAMESPACE_START /****************************************************************************** @@ -44,48 +58,6 @@ bool zLD::isWritable() { /****************************************************************************** - * zLD::strongsPad - Pads a key if it is 100% digits to 5 places - * - * ENT: buf - buffer to check and pad - */ - -void zLD::strongsPad(char *buf) { - char *check; - int size = 0; - int len = strlen(buf); - char subLet = 0; - bool bang = false; - if ((len < 8) && (len > 0)) { - for (check = buf; *(check+1); check++) { - if (!isdigit(*check)) - break; - else size++; - } - - if (size && ((size == (len-1)) || (size == (len-2)))) { - if (*check == '!') { - bang = true; - check++; - } - if (isalpha(*check)) { - subLet = toupper(*check); - *(check-(bang?1:0)) = 0; - } - sprintf(buf, "%.5d", atoi(buf)); - if (subLet) { - check = buf+(strlen(buf)); - if (bang) { - *check++ = '!'; - } - *check++ = subLet; - *check = 0; - } - } - } -} - - -/****************************************************************************** * zLD::getEntry - Looks up entry from data file. 'Snaps' to closest * entry and sets 'entrybuf'. * @@ -186,4 +158,36 @@ void zLD::deleteEntry() { setText(*key, ""); } + +long zLD::getEntryCount() const +{ + if (idxfd < 0) return 0; + return idxfd->seek(0, SEEK_END) / IDXENTRYSIZE; +} + + +long zLD::getEntryForKey(const char* key) const +{ + long offset; + char *buf = new char [ strlen(key) + 6 ]; + strcpy(buf, key); + + strongsPad(buf); + + findKeyIndex(buf, &offset); + + delete [] buf; + + return offset/IDXENTRYSIZE; +} + + +char *zLD::getKeyForEntry(long entry) const +{ + char *key = 0; + getKeyFromIdxOffset(entry * IDXENTRYSIZE, &key); + return key; +} + + SWORD_NAMESPACE_END diff --git a/src/modules/swmodule.cpp b/src/modules/swmodule.cpp index 8461953..3eb7ce1 100644 --- a/src/modules/swmodule.cpp +++ b/src/modules/swmodule.cpp @@ -1,11 +1,29 @@ /****************************************************************************** - * swmodule.cpp -code for base class 'module'. Module is the basis for all - * types of modules (e.g. texts, commentaries, maps, lexicons, - * etc.) + * swmodule.cpp - code for base class 'module'. Module is the basis for all + * types of modules (e.g. texts, commentaries, maps, lexicons, + * etc.) + * + * + * 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 <vector> +#include <swlog.h> #include <sysdata.h> #include <swmodule.h> #include <utilstr.h> @@ -58,7 +76,7 @@ typedef std::list<SWBuf> StringList; * unicode - if this module is unicode */ -SWModule::SWModule(const char *imodname, const char *imoddesc, SWDisplay *idisp, char *imodtype, SWTextEncoding encoding, SWTextDirection direction, SWTextMarkup markup, const char* imodlang) { +SWModule::SWModule(const char *imodname, const char *imoddesc, SWDisplay *idisp, const char *imodtype, SWTextEncoding encoding, SWTextDirection direction, SWTextMarkup markup, const char *imodlang) { key = CreateKey(); entryBuf = ""; config = &ownConfig; @@ -127,7 +145,7 @@ SWModule::~SWModule() * RET: pointer to allocated key */ -SWKey *SWModule::CreateKey() +SWKey *SWModule::CreateKey() const { return new SWKey(); } @@ -255,7 +273,8 @@ char SWModule::Markup(signed char newmark) { char *SWModule::Lang(const char *imodlang) { - return stdstr(&modlang, imodlang); + if (imodlang) stdstr(&modlang, imodlang); + return modlang; } @@ -395,8 +414,9 @@ void SWModule::decrement(int steps) { * >=0 - regex * -1 - phrase * -2 - multiword - * -3 - entryAttrib (eg. Word//Lemma/G1234/) + * -3 - entryAttrib (eg. Word//Lemma./G1234/) (Lemma with dot means check components (Lemma.[1-9]) also) * -4 - clucene + * -5 - multilemma window; flags = window size * flags - options flags for search * justCheckIfSupported - if set, don't search, only tell if this * function supports requested search. @@ -408,6 +428,7 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc listKey.ClearList(); SWBuf term = istr; + bool includeComponents = false; // for entryAttrib e.g., /Lemma.1/ #ifdef USELUCENE SWBuf target = getConfigEntry("AbsoluteDataPath"); @@ -431,12 +452,16 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc SWKey *resultKey = CreateKey(); regex_t preg; vector<SWBuf> words; + vector<SWBuf> window; const char *sres; terminateSearch = false; char perc = 1; bool savePEA = isProcessEntryAttributes(); - // determine if we might be doing special strip searches. useful for knowing if we can use shortcuts - bool specialStrips = (getConfigEntry("LocalStripFilter") || strchr(istr, '<')); + + // determine if we might be doing special strip searches. useful for knowing if we can use shortcuts + bool specialStrips = (getConfigEntry("LocalStripFilter") + || (getConfig().has("GlobalOptionFilter", "UTF8GreekAccents")) + || (strchr(istr, '<'))); processEntryAttributes(searchType == -3); @@ -454,19 +479,9 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc } (*percent)(perc, percentUserData); - // MAJOR KLUDGE: VerseKey::Index still return index within testament. - // VerseKey::NewIndex should be moved to Index and Index should be some - // VerseKey specific name - VerseKey *vkcheck = 0; - SWTRY { - vkcheck = SWDYNAMIC_CAST(VerseKey, key); - } - SWCATCH (...) {} - // end MAJOR KLUDGE *this = BOTTOM; - // fix below when we find out the bug - long highIndex = (vkcheck)?32300/*vkcheck->NewIndex()*/:key->Index(); + long highIndex = key->Index(); if (!highIndex) highIndex = 1; // avoid division by zero errors. *this = TOP; @@ -502,6 +517,7 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc (*percent)(80, percentUserData); // iterate thru each good module position that meets the search + bool checkBounds = getKey()->isBoundSet(); for (long i = 0; i < h->length(); i++) { Document &doc = h->doc(i); @@ -509,12 +525,15 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc lucene_wcstoutf8(utfBuffer, doc.get(_T("key")), MAX_CONV_SIZE); *resultKey = utfBuffer; //TODO Does a key always accept utf8? - // check to see if it sets ok (in our range?) and if so, add to our return list - *getKey() = *resultKey; - if (*getKey() == *resultKey) { - listKey << *resultKey; - listKey.GetElement()->userData = (void *)((__u32)(h->score(i)*100)); + // check to see if it sets ok (within our bounds) and if not, skip + if (checkBounds) { + *getKey() = *resultKey; + if (*getKey() != *resultKey) { + continue; + } } + listKey << *resultKey; + listKey.GetElement()->userData = (void *)((__u32)(h->score(i)*100)); } (*percent)(98, percentUserData); } @@ -543,6 +562,7 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc // multi-word case -2: + case -5: // let's break the term down into our words vector while (1) { const char *word = term.stripPrefix(' '); @@ -570,6 +590,10 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc } words.push_back(word); } + if ((words.size()>2) && words[2].endsWith(".")) { + includeComponents = true; + words[2]--; + } break; } @@ -579,16 +603,12 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc (*percent)(perc, percentUserData); - while ((searchType > -4) && !Error() && !terminateSearch) { - long mindex = 0; - if (vkcheck) - mindex = vkcheck->NewIndex(); - else mindex = key->Index(); + while ((searchType != -4) && !Error() && !terminateSearch) { + long mindex = key->Index(); float per = (float)mindex / highIndex; per *= 93; per += 5; char newperc = (char)per; -// char newperc = (char)(5+(93*(((float)((vkcheck)?vkcheck->NewIndex():key->Index()))/highIndex))); if (newperc > perc) { perc = newperc; (*percent)(perc, percentUserData); @@ -596,8 +616,7 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc else if (newperc < perc) { #ifndef _MSC_VER std::cerr << "Serious error: new percentage complete is less than previous value\n"; - std::cerr << "using vk? " << ((vkcheck)?"yes":"no") << "\n"; - std::cerr << "index: " << ((vkcheck)?vkcheck->NewIndex():key->Index()) << "\n"; + std::cerr << "index: " << (key->Index()) << "\n"; std::cerr << "highIndex: " << highIndex << "\n"; std::cerr << "newperc ==" << (int)newperc << "%" << "is smaller than\n"; std::cerr << "perc == " << (int )perc << "% \n"; @@ -656,7 +675,7 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc } break; // entry attributes - case -3: + case -3: { RenderText(); // force parse AttributeTypeList &entryAttribs = getEntryAttributes(); AttributeTypeList::iterator i1Start, i1End; @@ -685,7 +704,7 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc i2End = i1Start->second.end(); } for (;i2Start != i2End; i2Start++) { - if ((words.size()>2) && (words[2].length())) { + if ((words.size()>2) && (words[2].length()) && (!includeComponents)) { i3Start = i2Start->second.find(words[2]); i3End = i3Start; if (i3End != i2Start->second.end()) @@ -697,6 +716,13 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc } for (;i3Start != i3End; i3Start++) { if ((words.size()>3) && (words[3].length())) { + if (includeComponents) { + SWBuf key = i3Start->first.c_str(); + key = key.stripPrefix('.', true); + // we're iterating all 3 level keys, so be sure we match our + // prefix (e.g., Lemma, Lemma.1, Lemma.2, etc.) + if (key != words[2]) continue; + } if (flags & SEARCHFLAG_MATCHWHOLEENTRY) { bool found = !(((flags & REG_ICASE) == REG_ICASE) ? sword::stricmp(i3Start->second.c_str(), words[3]) : strcmp(i3Start->second.c_str(), words[3])); sres = (found) ? i3Start->second.c_str() : 0; @@ -719,6 +745,54 @@ ListKey &SWModule::search(const char *istr, int searchType, int flags, SWKey *sc break; } break; + } + case -5: + AttributeList &words = getEntryAttributes()["Word"]; + SWBuf kjvWord = ""; + SWBuf bibWord = ""; + for (AttributeList::iterator it = words.begin(); it != words.end(); it++) { + int parts = atoi(it->second["PartCount"]); + SWBuf lemma = ""; + SWBuf morph = ""; + for (int i = 1; i <= parts; i++) { + SWBuf key = ""; + key = (parts == 1) ? "Lemma" : SWBuf().setFormatted("Lemma.%d", i).c_str(); + AttributeValue::iterator li = it->second.find(key); + if (li != it->second.end()) { + if (i > 1) lemma += " "; + key = (parts == 1) ? "LemmaClass" : SWBuf().setFormatted("LemmaClass.%d", i).c_str(); + AttributeValue::iterator lci = it->second.find(key); + if (lci != it->second.end()) { + lemma += lci->second + ":"; + } + lemma += li->second; + } + key = (parts == 1) ? "Morph" : SWBuf().setFormatted("Morph.%d", i).c_str(); + li = it->second.find(key); + // silly. sometimes morph counts don't equal lemma counts + if (i == 1 && parts != 1 && li == it->second.end()) { + li = it->second.find("Morph"); + } + if (li != it->second.end()) { + if (i > 1) morph += " "; + key = (parts == 1) ? "MorphClass" : SWBuf().setFormatted("MorphClass.%d", i).c_str(); + AttributeValue::iterator lci = it->second.find(key); + // silly. sometimes morph counts don't equal lemma counts + if (i == 1 && parts != 1 && lci == it->second.end()) { + lci = it->second.find("MorphClass"); + } + if (lci != it->second.end()) { + morph += lci->second + ":"; + } + morph += li->second; + } + // TODO: add src tags and maybe other attributes + } + while (window.size() < (unsigned)flags) { + + } + } + break; } // end switch } (*this)++; @@ -812,7 +886,7 @@ const char *SWModule::StripText(const char *buf, int len) { * RET: this module's text at current key location massaged by RenderFilers */ - const char *SWModule::RenderText(SWKey *tmpKey) { + const char *SWModule::RenderText(const SWKey *tmpKey) { SWKey *saveKey; const char *retVal; @@ -843,7 +917,7 @@ const char *SWModule::StripText(const char *buf, int len) { * RET: this module's text at specified key location massaged by Strip filters */ -const char *SWModule::StripText(SWKey *tmpKey) { +const char *SWModule::StripText(const SWKey *tmpKey) { SWKey *saveKey; const char *retVal; @@ -919,8 +993,8 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void } } - - // be sure we give CLucene enough file handles + + // be sure we give CLucene enough file handles FileMgr::getSystemFileMgr()->flush(); // save key information so as not to disrupt original @@ -941,7 +1015,7 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void IndexWriter *coreWriter = NULL; IndexWriter *fsWriter = NULL; Directory *d = NULL; - + standard::StandardAnalyzer *an = new standard::StandardAnalyzer(); SWBuf target = getConfigEntry("AbsoluteDataPath"); bool includeKeyInSearch = getConfig().has("SearchOption", "IncludeKeyInSearch"); @@ -953,19 +1027,21 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void ramDir = new RAMDirectory(); coreWriter = new IndexWriter(ramDir, an, true); - - + + char perc = 1; VerseKey *vkcheck = 0; vkcheck = SWDYNAMIC_CAST(VerseKey, key); + VerseKey *chapMax = 0; + if (vkcheck) chapMax = (VerseKey *)vkcheck->clone(); TreeKeyIdx *tkcheck = 0; tkcheck = SWDYNAMIC_CAST(TreeKeyIdx, key); *this = BOTTOM; - long highIndex = (vkcheck)?32300/*vkcheck->NewIndex()*/:key->Index(); + long highIndex = key->Index(); if (!highIndex) highIndex = 1; // avoid division by zero errors. @@ -976,20 +1052,16 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void // position module at the beginning *this = TOP; - VerseKey chapMax; SWBuf proxBuf; SWBuf proxLem; SWBuf strong; const short int MAX_CONV_SIZE = 2047; wchar_t wcharBuffer[MAX_CONV_SIZE + 1]; - + char err = Error(); while (!err) { - long mindex = 0; - if (vkcheck) - mindex = vkcheck->NewIndex(); - else mindex = key->Index(); + long mindex = key->Index(); proxBuf = ""; proxLem = ""; @@ -1016,7 +1088,7 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void if (content && *content) { good = true; - + // build "strong" field AttributeTypeList::iterator words; AttributeList::iterator word; @@ -1046,8 +1118,10 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void } lucene_utf8towcs(wcharBuffer, keyText, MAX_CONV_SIZE); //keyText must be utf8 +// doc->add( *(new Field("key", wcharBuffer, Field::STORE_YES | Field::INDEX_TOKENIZED))); doc->add( *Field::Text(_T("key"), wcharBuffer ) ); + if (includeKeyInSearch) { c = keyText; c += " "; @@ -1071,12 +1145,12 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void // for VerseKeys use chapter if (vkcheck) { - chapMax = *vkcheck; + *chapMax = *vkcheck; // we're the first verse in a chapter if (vkcheck->Verse() == 1) { - chapMax = MAXVERSE; + *chapMax = MAXVERSE; VerseKey saveKey = *vkcheck; - while ((!err) && (*vkcheck <= chapMax)) { + while ((!err) && (*vkcheck <= *chapMax)) { //printf("building proxBuf from (%s).\nproxBuf.c_str(): %s\n", (const char *)*key, proxBuf.c_str()); //printf("building proxBuf from (%s).\n", (const char *)*key); @@ -1112,7 +1186,7 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void proxBuf += content; proxBuf.append(' '); proxLem += strong; - if (proxLem.length()) + if (proxLem.length()) proxLem.append("\n"); } (*this)++; @@ -1122,7 +1196,7 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void *vkcheck = saveKey; } } - + // for TreeKeys use siblings if we have no children else if (tkcheck) { if (!tkcheck->hasChildren()) { @@ -1164,7 +1238,7 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void proxBuf += content; proxBuf.append(' '); proxLem += strong; - if (proxLem.length()) + if (proxLem.length()) proxLem.append("\n"); } } while (tkcheck->nextSibling()); @@ -1174,11 +1248,11 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void else tkcheck->nextSibling(); // reposition from our previousSibling test } } - + if (proxBuf.length() > 0) { - + lucene_utf8towcs(wcharBuffer, proxBuf, MAX_CONV_SIZE); //keyText must be utf8 - + //printf("proxBuf after (%s).\nprox: %s\nproxLem: %s\n", (const char *)*key, proxBuf.c_str(), proxLem.c_str()); doc->add( *Field::UnStored(_T("prox"), wcharBuffer) ); @@ -1209,7 +1283,7 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void if (IndexReader::isLocked(d)) { IndexReader::unlock(d); } - + fsWriter = new IndexWriter( d, an, false); } else { d = FSDirectory::getDirectory(target.c_str(), true); @@ -1234,6 +1308,8 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void if (searchKey) delete searchKey; + delete chapMax; + processEntryAttributes(savePEA); // reset option filters back to original values @@ -1253,7 +1329,7 @@ signed char SWModule::createSearchFramework(void (*percent)(char, void *), void * @param buf the buffer to filter * @param key key location from where this buffer was extracted */ -void SWModule::filterBuffer(OptionFilterList *filters, SWBuf &buf, SWKey *key) { +void SWModule::filterBuffer(OptionFilterList *filters, SWBuf &buf, const SWKey *key) { OptionFilterList::iterator it; for (it = filters->begin(); it != filters->end(); it++) { (*it)->processText(buf, key, this); @@ -1265,7 +1341,7 @@ void SWModule::filterBuffer(OptionFilterList *filters, SWBuf &buf, SWKey *key) { * @param buf the buffer to filter * @param key key location from where this buffer was extracted */ -void SWModule::filterBuffer(FilterList *filters, SWBuf &buf, SWKey *key) { +void SWModule::filterBuffer(FilterList *filters, SWBuf &buf, const SWKey *key) { FilterList::iterator it; for (it = filters->begin(); it != filters->end(); it++) { (*it)->processText(buf, key, this); @@ -1282,4 +1358,63 @@ void SWModule::setEntry(const char*, long) { void SWModule::linkEntry(const SWKey*) { } + +/****************************************************************************** + * SWModule::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 SWModule::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 diff --git a/src/modules/tests/echomod.cpp b/src/modules/tests/echomod.cpp index 2640773..99b00cd 100644 --- a/src/modules/tests/echomod.cpp +++ b/src/modules/tests/echomod.cpp @@ -1,6 +1,22 @@ /****************************************************************************** * echomod.cpp - code for class 'echomod'- a dummy test text module that just * echos back the key + * + * + * 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 <echomod.h> diff --git a/src/modules/texts/rawtext/rawtext.cpp b/src/modules/texts/rawtext/rawtext.cpp index 3245da6..8641a45 100644 --- a/src/modules/texts/rawtext/rawtext.cpp +++ b/src/modules/texts/rawtext/rawtext.cpp @@ -1,9 +1,24 @@ /****************************************************************************** * rawtext.cpp - code for class 'RawText'- a module that reads raw text files: * ot and nt using indexs ??.bks ??.cps ??.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 <stdio.h> #include <fcntl.h> #include <sysdata.h> @@ -42,27 +57,9 @@ typedef list<long> longlist; * idisp - Display object to use for displaying */ -RawText::RawText(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang) - : SWText(iname, idesc, idisp, enc, dir, mark, ilang), +RawText::RawText(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang, const char *versification) + : SWText(iname, idesc, idisp, enc, dir, mark, ilang, versification), RawVerse(ipath) { - -#ifndef USELUCENE - SWBuf fname; - fname = path; - char ch = fname.c_str()[strlen(fname.c_str())-1]; - if ((ch != '/') && (ch != '\\')) - fname += "/"; - - for (int loop = 0; loop < 2; loop++) { - fastSearch[loop] = 0; - SWBuf fastidxname =(fname + ((loop)?"ntwords.dat":"otwords.dat")); - if (FileMgr::existsFile(fastidxname.c_str())) { - fastidxname = (fname + ((loop)?"ntwords.idx":"otwords.idx")); - if (FileMgr::existsFile(fastidxname.c_str())) - fastSearch[loop] = new RawStr((fname + ((loop)?"ntwords":"otwords")).c_str()); - } - } -#endif } @@ -71,13 +68,6 @@ RawText::RawText(const char *ipath, const char *iname, const char *idesc, SWDisp */ RawText::~RawText() { -#ifndef USELUCENE - if (fastSearch[0]) - delete fastSearch[0]; - - if (fastSearch[1]) - delete fastSearch[1]; -#endif } @@ -98,7 +88,7 @@ SWBuf &RawText::getRawEntryBuf() { unsigned short size = 0; VerseKey &key = getVerseKey(); - findOffset(key.Testament(), key.Index(), &start, &size); + findOffset(key.Testament(), key.TestamentIndex(), &start, &size); entrySize = size; // support getEntrySize call entryBuf = ""; @@ -114,382 +104,16 @@ SWBuf &RawText::getRawEntryBuf() { } -signed char RawText::createSearchFramework(void (*percent)(char, void *), void *percentUserData) { -#ifndef USELUCENE - SWKey *savekey = 0; - SWKey *searchkey = 0; - SWKey textkey; - char *word = 0; - char *wordBuf = 0; - - // dictionary holds words associated with a list - // containing every module position that contains - // the word. [0] Old Testament; [1] NT - map < SWBuf, list<long> > dictionary[2]; - - - // save key information so as not to disrupt original - // module position - if (!key->Persist()) { - savekey = CreateKey(); - *savekey = *key; - } - else savekey = key; - - searchkey = (key->Persist())?key->clone():0; - if (searchkey) { - searchkey->Persist(1); - setKey(*searchkey); - } - - // position module at the beginning - *this = TOP; - - VerseKey *lkey = (VerseKey *)key; - - // iterate thru each entry in module - while (!Error()) { - long index = lkey->Index(); - wordBuf = (char *)calloc(sizeof(char), strlen(StripText()) + 1); - strcpy(wordBuf, StripText()); - - // grab each word from the text - word = strtok(wordBuf, " !.,?;:()-=+/\\|{}[]\"<>"); - while (word) { - - // make word upper case - toupperstr(word); - - // lookup word in dictionary (or make entry in dictionary - // for this word) and add this module position (index) to - // the word's associated list of module positions - dictionary[lkey->Testament()-1][word].push_back(index); - word = strtok(NULL, " !.,?;:()-=+/\\|{}[]\"<>"); - } - free(wordBuf); - (*this)++; - } - - // reposition module back to where it was before we were called - setKey(*savekey); - - if (!savekey->Persist()) - delete savekey; - - if (searchkey) - delete searchkey; - - - // --------- Let's output an index from our dictionary ----------- - FileDesc *datfd; - FileDesc *idxfd; - strlist::iterator it; - longlist::iterator it2; - unsigned long offset, entryoff; - unsigned short size; - - SWBuf fname; - fname = path; - char ch = fname.c_str()[strlen(fname.c_str())-1]; - if ((ch != '/') && (ch != '\\')) - fname += "/"; - - // for old and new testament do... - for (int loop = 0; loop < 2; loop++) { - datfd = FileMgr::getSystemFileMgr()->open((fname + ((loop)?"ntwords.dat":"otwords.dat")).c_str(), FileMgr::CREAT|FileMgr::WRONLY, 00644); - if (datfd->getFd() == -1) - return -1; - idxfd = FileMgr::getSystemFileMgr()->open((fname + ((loop)?"ntwords.idx":"otwords.idx")).c_str(), FileMgr::CREAT|FileMgr::WRONLY, 00644); - if (idxfd->getFd() == -1) { - FileMgr::getSystemFileMgr()->close(datfd); - return -1; - } - - // iterate thru each word in the dictionary - for (it = dictionary[loop].begin(); it != dictionary[loop].end(); it++) { - printf("%s: ", it->first.c_str()); - - // get our current offset in our word.dat file and write this as the start - // of the next entry in our database - offset = datfd->seek(0, SEEK_CUR); - idxfd->write(&offset, 4); - - // write our word out to the word.dat file, delineating with a \n - datfd->write(it->first.c_str(), strlen(it->first.c_str())); - datfd->write("\n", 1); - - // force our mod position list for this word to be unique (remove - // duplicates that may exist if the word was found more than once - // in the verse - it->second.unique(); - - // iterate thru each mod position for this word and output it to - // our database - unsigned short count = 0; - for (it2 = it->second.begin(); it2 != it->second.end(); it2++) { - entryoff= *it2; - datfd->write(&entryoff, 4); - count++; - } - - // now see what our new position is in our word.dat file and - // determine the size of this database entry - size = datfd->seek(0, SEEK_CUR) - offset; - - // store the size of this database entry - idxfd->write(&size, 2); - printf("%d entries (size: %d)\n", count, size); - } - FileMgr::getSystemFileMgr()->close(datfd); - FileMgr::getSystemFileMgr()->close(idxfd); - } - return 0; -#else - return SWModule::createSearchFramework(percent, percentUserData); -#endif -} - - -void RawText::deleteSearchFramework() { -#ifndef USELUCENE - SWBuf target = path; - char ch = target.c_str()[strlen(target.c_str())-1]; - if ((ch != '/') && (ch != '\\')) - target += "/lucene"; - FileMgr::removeFile(target + "ntwords.dat"); - FileMgr::removeFile(target + "otwords.dat"); - FileMgr::removeFile(target + "ntwords.idx"); - FileMgr::removeFile(target + "otwords.idx"); -#else - SWModule::deleteSearchFramework(); -#endif -} - - -/****************************************************************************** - * SWModule::search - Searches a module for a string - * - * ENT: istr - string for which to search - * searchType - type of search to perform - * >=0 - regex - * -1 - phrase - * -2 - multiword - * flags - options flags for search - * justCheckIfSupported - if set, don't search, only tell if this - * function supports requested search. - * - * RET: ListKey set to verses that contain istr - */ - -ListKey &RawText::search(const char *istr, int searchType, int flags, SWKey *scope, bool *justCheckIfSupported, void (*percent)(char, void *), void *percentUserData) { -#ifndef USELUCENE - listKey.ClearList(); - - if ((fastSearch[0]) && (fastSearch[1])) { - - switch (searchType) { - case -2: { - - if ((flags & REG_ICASE) != REG_ICASE) // if haven't chosen to - // ignore case - break; // can't handle fast case sensitive searches - - // test to see if our scope for this search is bounded by a - // VerseKey - VerseKey *testKeyType = 0; - SWTRY { - testKeyType = SWDYNAMIC_CAST(VerseKey, ((scope)?scope:key)); - } - SWCATCH ( ... ) {} - // if we don't have a VerseKey * decendant we can't handle - // because of scope. - // In the future, add bool SWKey::isValid(const char *tryString); - if (!testKeyType) - break; - - - // check if we just want to see if search is supported. - // If we've gotten this far, then it is supported. - if (justCheckIfSupported) { - *justCheckIfSupported = true; - return listKey; - } - - SWKey saveKey = *testKeyType; // save current place - - char error = 0; - char **words = 0; - char *wordBuf = 0; - int wordCount = 0; - long start; - unsigned short size; - char *idxbuf = 0; - SWBuf datBuf; - list <long> indexes; - list <long> indexes2; - VerseKey vk; - vk = TOP; - - (*percent)(10, percentUserData); - - // toupper our copy of search string - stdstr(&wordBuf, istr); - toupperstr(wordBuf); - - // get list of individual words - words = (char **)calloc(sizeof(char *), 10); - int allocWords = 10; - words[wordCount] = strtok(wordBuf, " "); - while (words[wordCount]) { - wordCount++; - if (wordCount == allocWords) { - allocWords+=10; - words = (char **)realloc(words, sizeof(char *)*allocWords); - } - words[wordCount] = strtok(NULL, " "); - } - - (*percent)(20, percentUserData); - - // clear our result set - indexes.erase(indexes.begin(), indexes.end()); - - // search both old and new testament indexes - for (int j = 0; j < 2; j++) { - // iterate thru each word the user passed to us. - for (int i = 0; i < wordCount; i++) { - - // clear this word's result set - indexes2.erase(indexes2.begin(), indexes2.end()); - error = 0; - - // iterate thru every word in the database that starts - // with our search word - for (int away = 0; !error; away++) { - idxbuf = 0; - - // find our word in the database and jump ahead _away_ - error = fastSearch[j]->findOffset(words[i], &start, &size, away); - - // get the word from the database - fastSearch[j]->getIDXBufDat(start, &idxbuf); - - // check to see if it starts with our target word - if (strlen(idxbuf) > strlen(words[i])) - idxbuf[strlen(words[i])] = 0; -// else words[i][strlen(idxbuf)] = 0; - if (!strcmp(idxbuf, words[i])) { - - // get data for this word from database - delete [] idxbuf; - idxbuf = 0; - datBuf = ""; - fastSearch[j]->readText(start, &size, &idxbuf, datBuf); - - // we know that the data consists of sizof(long) - // records each a valid module position that constains - // this word - // - // iterate thru each of these module positions - long *keyindex = (long *)datBuf.getRawData(); - while (keyindex < (long *)(datBuf.getRawData() + size - (strlen(idxbuf) + 1))) { - if (i) { // if we're not on our first word - - // check to see if this word is already in the result set. - // This is our AND functionality - if (find(indexes.begin(), indexes.end(), *keyindex) != indexes.end()) - // add to new result set - indexes2.push_back(*keyindex); - } - else indexes2.push_back(*keyindex); - keyindex++; - } - } - else error = 1; // no more matches - free(idxbuf); - } - - // make new result set final result set - indexes = indexes2; - - percent((char)(20 + (float)((j*wordCount)+i)/(wordCount * 2) * 78), percentUserData); - } - - // indexes contains our good verses, lets return them in a listKey - indexes.sort(); - - // iterate thru each good module position that meets the search - for (longlist::iterator it = indexes.begin(); it != indexes.end(); it++) { - - // set a temporary verse key to this module position - vk.Testament(j+1); - vk.Error(); - vk.Index(*it); - - // check scope - // Try to set our scope key to this verse key - if (scope) { - *testKeyType = vk; - - // check to see if it set ok and if so, add to our return list - if (*testKeyType == vk) - listKey << (const char *) vk; - } - else listKey << (const char*) vk; - } - } - (*percent)(98, percentUserData); - - free(words); - free(wordBuf); - - *testKeyType = saveKey; // set current place back to original - - listKey = TOP; - (*percent)(100, percentUserData); - return listKey; - } - - default: - break; - } - } - - // check if we just want to see if search is supported - if (justCheckIfSupported) { - *justCheckIfSupported = false; - return listKey; - } - -#endif - // if we don't support this search, fall back to base class - return SWModule::search(istr, searchType, flags, scope, justCheckIfSupported, percent, percentUserData); -} - - void RawText::setEntry(const char *inbuf, long len) { VerseKey &key = getVerseKey(); - doSetText(key.Testament(), key.Index(), inbuf, len); + doSetText(key.Testament(), key.TestamentIndex(), inbuf, len); } void RawText::linkEntry(const SWKey *inkey) { VerseKey &destkey = getVerseKey(); - const VerseKey *srckey = 0; - - // see if we have a VerseKey * or decendant - SWTRY { - srckey = 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()); } @@ -501,7 +125,7 @@ void RawText::linkEntry(const SWKey *inkey) { void RawText::deleteEntry() { VerseKey &key = getVerseKey(); - doSetText(key.Testament(), key.Index(), ""); + doSetText(key.Testament(), key.TestamentIndex(), ""); } /****************************************************************************** @@ -517,21 +141,21 @@ void RawText::increment(int steps) { unsigned short size; VerseKey *tmpkey = &getVerseKey(); - findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); + findOffset(tmpkey->Testament(), tmpkey->TestamentIndex(), &start, &size); 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(); + long index = tmpkey->TestamentIndex(); findOffset(tmpkey->Testament(), index, &start, &size); if ( (((laststart != start) || (lastsize != size)) // we're a different entry @@ -545,4 +169,28 @@ void RawText::increment(int steps) { error = (error) ? KEYERR_OUTOFBOUNDS : 0; } +bool RawText::isLinked(const SWKey *k1, const SWKey *k2) const { + long start1, start2; + unsigned short size1, size2; + VerseKey *vk1 = &getVerseKey(k1); + VerseKey *vk2 = &getVerseKey(k2); + if (vk1->Testament() != vk2->Testament()) return false; + + findOffset(vk1->Testament(), vk1->TestamentIndex(), &start1, &size1); + findOffset(vk2->Testament(), vk2->TestamentIndex(), &start2, &size2); + if (!size1 || !size2) return false; + return start1 == start2; +} + +bool RawText::hasEntry(const SWKey *k) const { + long start; + unsigned short size; + VerseKey *vk = &getVerseKey(k); + + findOffset(vk->Testament(), vk->TestamentIndex(), &start, &size); + return size; +} + + + SWORD_NAMESPACE_END diff --git a/src/modules/texts/rawtext4/rawtext4.cpp b/src/modules/texts/rawtext4/rawtext4.cpp index a06691e..65f5cef 100644 --- a/src/modules/texts/rawtext4/rawtext4.cpp +++ b/src/modules/texts/rawtext4/rawtext4.cpp @@ -1,9 +1,24 @@ /****************************************************************************** - * rawtext4.cpp - code for class 'RawText4'- a module that reads raw text files: - * ot and nt using indexs ??.bks ??.cps ??.vss + * rawtext4.cpp - code for class 'RawText4'- a module that reads raw text + * files: ot and nt using indexs ??.bks ??.cps ??.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 <stdio.h> #include <fcntl.h> #include <sysdata.h> @@ -42,27 +57,9 @@ typedef list<long> longlist; * idisp - Display object to use for displaying */ -RawText4::RawText4(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang) - : SWText(iname, idesc, idisp, enc, dir, mark, ilang), +RawText4::RawText4(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang, const char *versification) + : SWText(iname, idesc, idisp, enc, dir, mark, ilang, versification), RawVerse4(ipath) { - -#ifndef USELUCENE - SWBuf fname; - fname = path; - char ch = fname.c_str()[strlen(fname.c_str())-1]; - if ((ch != '/') && (ch != '\\')) - fname += "/"; - - for (int loop = 0; loop < 2; loop++) { - fastSearch[loop] = 0; - SWBuf fastidxname =(fname + ((loop)?"ntwords.dat":"otwords.dat")); - if (FileMgr::existsFile(fastidxname.c_str())) { - fastidxname = (fname + ((loop)?"ntwords.idx":"otwords.idx")); - if (FileMgr::existsFile(fastidxname.c_str())) - fastSearch[loop] = new RawStr4((fname + ((loop)?"ntwords":"otwords")).c_str()); - } - } -#endif } @@ -71,13 +68,6 @@ RawText4::RawText4(const char *ipath, const char *iname, const char *idesc, SWDi */ RawText4::~RawText4() { -#ifndef USELUCENE - if (fastSearch[0]) - delete fastSearch[0]; - - if (fastSearch[1]) - delete fastSearch[1]; -#endif } @@ -98,7 +88,7 @@ SWBuf &RawText4::getRawEntryBuf() { unsigned long size = 0; VerseKey &key = getVerseKey(); - findOffset(key.Testament(), key.Index(), &start, &size); + findOffset(key.Testament(), key.TestamentIndex(), &start, &size); entrySize = size; // support getEntrySize call entryBuf = ""; @@ -114,382 +104,16 @@ SWBuf &RawText4::getRawEntryBuf() { } -signed char RawText4::createSearchFramework(void (*percent)(char, void *), void *percentUserData) { -#ifndef USELUCENE - SWKey *savekey = 0; - SWKey *searchkey = 0; - SWKey textkey; - char *word = 0; - char *wordBuf = 0; - - // dictionary holds words associated with a list - // containing every module position that contains - // the word. [0] Old Testament; [1] NT - map < SWBuf, list<long> > dictionary[2]; - - - // save key information so as not to disrupt original - // module position - if (!key->Persist()) { - savekey = CreateKey(); - *savekey = *key; - } - else savekey = key; - - searchkey = (key->Persist())?key->clone():0; - if (searchkey) { - searchkey->Persist(1); - setKey(*searchkey); - } - - // position module at the beginning - *this = TOP; - - VerseKey *lkey = (VerseKey *)key; - - // iterate thru each entry in module - while (!Error()) { - long index = lkey->Index(); - wordBuf = (char *)calloc(sizeof(char), strlen(StripText()) + 1); - strcpy(wordBuf, StripText()); - - // grab each word from the text - word = strtok(wordBuf, " !.,?;:()-=+/\\|{}[]\"<>"); - while (word) { - - // make word upper case - toupperstr(word); - - // lookup word in dictionary (or make entry in dictionary - // for this word) and add this module position (index) to - // the word's associated list of module positions - dictionary[lkey->Testament()-1][word].push_back(index); - word = strtok(NULL, " !.,?;:()-=+/\\|{}[]\"<>"); - } - free(wordBuf); - (*this)++; - } - - // reposition module back to where it was before we were called - setKey(*savekey); - - if (!savekey->Persist()) - delete savekey; - - if (searchkey) - delete searchkey; - - - // --------- Let's output an index from our dictionary ----------- - FileDesc *datfd; - FileDesc *idxfd; - strlist::iterator it; - longlist::iterator it2; - unsigned long offset, entryoff; - unsigned long size; - - SWBuf fname; - fname = path; - char ch = fname.c_str()[strlen(fname.c_str())-1]; - if ((ch != '/') && (ch != '\\')) - fname += "/"; - - // for old and new testament do... - for (int loop = 0; loop < 2; loop++) { - datfd = FileMgr::getSystemFileMgr()->open((fname + ((loop)?"ntwords.dat":"otwords.dat")).c_str(), FileMgr::CREAT|FileMgr::WRONLY, 00644); - if (datfd->getFd() == -1) - return -1; - idxfd = FileMgr::getSystemFileMgr()->open((fname + ((loop)?"ntwords.idx":"otwords.idx")).c_str(), FileMgr::CREAT|FileMgr::WRONLY, 00644); - if (idxfd->getFd() == -1) { - FileMgr::getSystemFileMgr()->close(datfd); - return -1; - } - - // iterate thru each word in the dictionary - for (it = dictionary[loop].begin(); it != dictionary[loop].end(); it++) { - printf("%s: ", it->first.c_str()); - - // get our current offset in our word.dat file and write this as the start - // of the next entry in our database - offset = datfd->seek(0, SEEK_CUR); - idxfd->write(&offset, 4); - - // write our word out to the word.dat file, delineating with a \n - datfd->write(it->first.c_str(), strlen(it->first.c_str())); - datfd->write("\n", 1); - - // force our mod position list for this word to be unique (remove - // duplicates that may exist if the word was found more than once - // in the verse - it->second.unique(); - - // iterate thru each mod position for this word and output it to - // our database - unsigned short count = 0; - for (it2 = it->second.begin(); it2 != it->second.end(); it2++) { - entryoff= *it2; - datfd->write(&entryoff, 4); - count++; - } - - // now see what our new position is in our word.dat file and - // determine the size of this database entry - size = datfd->seek(0, SEEK_CUR) - offset; - - // store the size of this database entry - idxfd->write(&size, 4); - printf("%d entries (size: %d)\n", count, size); - } - FileMgr::getSystemFileMgr()->close(datfd); - FileMgr::getSystemFileMgr()->close(idxfd); - } - return 0; -#else - return SWModule::createSearchFramework(percent, percentUserData); -#endif -} - - -void RawText4::deleteSearchFramework() { -#ifndef USELUCENE - SWBuf target = path; - char ch = target.c_str()[strlen(target.c_str())-1]; - if ((ch != '/') && (ch != '\\')) - target += "/lucene"; - FileMgr::removeFile(target + "ntwords.dat"); - FileMgr::removeFile(target + "otwords.dat"); - FileMgr::removeFile(target + "ntwords.idx"); - FileMgr::removeFile(target + "otwords.idx"); -#else - SWModule::deleteSearchFramework(); -#endif -} - - -/****************************************************************************** - * SWModule::search - Searches a module for a string - * - * ENT: istr - string for which to search - * searchType - type of search to perform - * >=0 - regex - * -1 - phrase - * -2 - multiword - * flags - options flags for search - * justCheckIfSupported - if set, don't search, only tell if this - * function supports requested search. - * - * RET: ListKey set to verses that contain istr - */ - -ListKey &RawText4::search(const char *istr, int searchType, int flags, SWKey *scope, bool *justCheckIfSupported, void (*percent)(char, void *), void *percentUserData) { -#ifndef USELUCENE - listKey.ClearList(); - - if ((fastSearch[0]) && (fastSearch[1])) { - - switch (searchType) { - case -2: { - - if ((flags & REG_ICASE) != REG_ICASE) // if haven't chosen to - // ignore case - break; // can't handle fast case sensitive searches - - // test to see if our scope for this search is bounded by a - // VerseKey - VerseKey *testKeyType = 0; - SWTRY { - testKeyType = SWDYNAMIC_CAST(VerseKey, ((scope)?scope:key)); - } - SWCATCH ( ... ) {} - // if we don't have a VerseKey * decendant we can't handle - // because of scope. - // In the future, add bool SWKey::isValid(const char *tryString); - if (!testKeyType) - break; - - - // check if we just want to see if search is supported. - // If we've gotten this far, then it is supported. - if (justCheckIfSupported) { - *justCheckIfSupported = true; - return listKey; - } - - SWKey saveKey = *testKeyType; // save current place - - char error = 0; - char **words = 0; - char *wordBuf = 0; - int wordCount = 0; - long start; - unsigned long size; - char *idxbuf = 0; - SWBuf datBuf; - list <long> indexes; - list <long> indexes2; - VerseKey vk; - vk = TOP; - - (*percent)(10, percentUserData); - - // toupper our copy of search string - stdstr(&wordBuf, istr); - toupperstr(wordBuf); - - // get list of individual words - words = (char **)calloc(sizeof(char *), 10); - int allocWords = 10; - words[wordCount] = strtok(wordBuf, " "); - while (words[wordCount]) { - wordCount++; - if (wordCount == allocWords) { - allocWords+=10; - words = (char **)realloc(words, sizeof(char *)*allocWords); - } - words[wordCount] = strtok(NULL, " "); - } - - (*percent)(20, percentUserData); - - // clear our result set - indexes.erase(indexes.begin(), indexes.end()); - - // search both old and new testament indexes - for (int j = 0; j < 2; j++) { - // iterate thru each word the user passed to us. - for (int i = 0; i < wordCount; i++) { - - // clear this word's result set - indexes2.erase(indexes2.begin(), indexes2.end()); - error = 0; - - // iterate thru every word in the database that starts - // with our search word - for (int away = 0; !error; away++) { - idxbuf = 0; - - // find our word in the database and jump ahead _away_ - error = fastSearch[j]->findOffset(words[i], &start, &size, away); - - // get the word from the database - fastSearch[j]->getIDXBufDat(start, &idxbuf); - - // check to see if it starts with our target word - if (strlen(idxbuf) > strlen(words[i])) - idxbuf[strlen(words[i])] = 0; -// else words[i][strlen(idxbuf)] = 0; - if (!strcmp(idxbuf, words[i])) { - - // get data for this word from database - delete [] idxbuf; - idxbuf = 0; - datBuf = ""; - fastSearch[j]->readText(start, &size, &idxbuf, datBuf); - - // we know that the data consists of sizof(long) - // records each a valid module position that constains - // this word - // - // iterate thru each of these module positions - long *keyindex = (long *)datBuf.getRawData(); - while (keyindex < (long *)(datBuf.getRawData() + size - (strlen(idxbuf) + 1))) { - if (i) { // if we're not on our first word - - // check to see if this word is already in the result set. - // This is our AND functionality - if (find(indexes.begin(), indexes.end(), *keyindex) != indexes.end()) - // add to new result set - indexes2.push_back(*keyindex); - } - else indexes2.push_back(*keyindex); - keyindex++; - } - } - else error = 1; // no more matches - free(idxbuf); - } - - // make new result set final result set - indexes = indexes2; - - percent((char)(20 + (float)((j*wordCount)+i)/(wordCount * 2) * 78), percentUserData); - } - - // indexes contains our good verses, lets return them in a listKey - indexes.sort(); - - // iterate thru each good module position that meets the search - for (longlist::iterator it = indexes.begin(); it != indexes.end(); it++) { - - // set a temporary verse key to this module position - vk.Testament(j+1); - vk.Error(); - vk.Index(*it); - - // check scope - // Try to set our scope key to this verse key - if (scope) { - *testKeyType = vk; - - // check to see if it set ok and if so, add to our return list - if (*testKeyType == vk) - listKey << (const char *) vk; - } - else listKey << (const char*) vk; - } - } - (*percent)(98, percentUserData); - - free(words); - free(wordBuf); - - *testKeyType = saveKey; // set current place back to original - - listKey = TOP; - (*percent)(100, percentUserData); - return listKey; - } - - default: - break; - } - } - - // check if we just want to see if search is supported - if (justCheckIfSupported) { - *justCheckIfSupported = false; - return listKey; - } - -#endif - // if we don't support this search, fall back to base class - return SWModule::search(istr, searchType, flags, scope, justCheckIfSupported, percent, percentUserData); -} - - void RawText4::setEntry(const char *inbuf, long len) { VerseKey &key = getVerseKey(); - doSetText(key.Testament(), key.Index(), inbuf, len); + doSetText(key.Testament(), key.TestamentIndex(), inbuf, len); } void RawText4::linkEntry(const SWKey *inkey) { VerseKey &destkey = getVerseKey(); - const VerseKey *srckey = 0; - - // see if we have a VerseKey * or decendant - SWTRY { - srckey = 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()); } @@ -501,7 +125,7 @@ void RawText4::linkEntry(const SWKey *inkey) { void RawText4::deleteEntry() { VerseKey &key = getVerseKey(); - doSetText(key.Testament(), key.Index(), ""); + doSetText(key.Testament(), key.TestamentIndex(), ""); } /****************************************************************************** @@ -517,21 +141,21 @@ void RawText4::increment(int steps) { unsigned long size; VerseKey *tmpkey = &getVerseKey(); - findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size); + findOffset(tmpkey->Testament(), tmpkey->TestamentIndex(), &start, &size); SWKey lastgood = *tmpkey; while (steps) { long laststart = start; unsigned long 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(); + long index = tmpkey->TestamentIndex(); findOffset(tmpkey->Testament(), index, &start, &size); if ( (((laststart != start) || (lastsize != size)) // we're a different entry @@ -545,4 +169,25 @@ void RawText4::increment(int steps) { error = (error) ? KEYERR_OUTOFBOUNDS : 0; } +bool RawText4::isLinked(const SWKey *k1, const SWKey *k2) const { + long start1, start2; + unsigned long size1, size2; + VerseKey *vk1 = &getVerseKey(k1); + VerseKey *vk2 = &getVerseKey(k2); + if (vk1->Testament() != vk2->Testament()) return false; + + findOffset(vk1->Testament(), vk1->TestamentIndex(), &start1, &size1); + findOffset(vk2->Testament(), vk2->TestamentIndex(), &start2, &size2); + return start1 == start2; +} + +bool RawText4::hasEntry(const SWKey *k) const { + long start; + unsigned long size; + VerseKey *vk = &getVerseKey(k); + + findOffset(vk->Testament(), vk->TestamentIndex(), &start, &size); + return size; +} + SWORD_NAMESPACE_END diff --git a/src/modules/texts/swtext.cpp b/src/modules/texts/swtext.cpp index d0ff386..a7f5f92 100644 --- a/src/modules/texts/swtext.cpp +++ b/src/modules/texts/swtext.cpp @@ -1,7 +1,24 @@ /****************************************************************************** * swtext.cpp - code for base class 'SWText'- The basis for all text modules + * + * + * 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 <utilstr.h> #include <swtext.h> #include <listkey.h> #include <localemgr.h> @@ -17,10 +34,14 @@ SWORD_NAMESPACE_START * idisp - Display object to use for displaying */ -SWText::SWText(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang): SWModule(imodname, imoddesc, idisp, (char *)"Biblical Texts", enc, dir, mark, ilang) { - tmpVK = new VerseKey(); +SWText::SWText(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang, const char *versification): SWModule(imodname, imoddesc, idisp, "Biblical Texts", enc, dir, mark, ilang) { + this->versification = 0; + stdstr(&(this->versification), versification); delete key; - key = CreateKey(); + key = (VerseKey *)CreateKey(); + tmpVK1 = (VerseKey *)CreateKey(); + tmpVK2 = (VerseKey *)CreateKey(); + tmpSecond = false; skipConsecutiveLinks = false; } @@ -30,7 +51,9 @@ SWText::SWText(const char *imodname, const char *imoddesc, SWDisplay *idisp, SWT */ SWText::~SWText() { - delete tmpVK; + delete tmpVK1; + delete tmpVK2; + delete [] versification; } @@ -38,60 +61,49 @@ SWText::~SWText() { * SWText CreateKey - Create the correct key (VerseKey) for use with SWText */ -SWKey *SWText::CreateKey() { - return new VerseKey(); -} +SWKey *SWText::CreateKey() const { + VerseKey *vk = new VerseKey(); + vk->setVersificationSystem(versification); -long SWText::Index() const { - VerseKey *key = 0; - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); + return vk; +} - entryIndex = key->NewIndex(); - if (key != this->key) - delete key; +long SWText::Index() const { + VerseKey *key = &getVerseKey(); + entryIndex = key->Index(); return entryIndex; } long SWText::Index(long iindex) { - VerseKey *key = 0; - SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); - } - SWCATCH ( ... ) {} - if (!key) - key = new VerseKey(this->key); + VerseKey *key = &getVerseKey(); key->Testament(1); key->Index(iindex); if (key != this->key) { this->key->copyFrom(*key); - delete key; } return Index(); } -VerseKey &SWText::getVerseKey() const { - VerseKey *key = NULL; +VerseKey &SWText::getVerseKey(const SWKey *keyToConvert) const { + const SWKey *thisKey = keyToConvert ? keyToConvert : this->key; + + VerseKey *key = 0; // see if we have a VerseKey * or decendant SWTRY { - key = SWDYNAMIC_CAST(VerseKey, this->key); + key = SWDYNAMIC_CAST(VerseKey, thisKey); } SWCATCH ( ... ) { } if (!key) { ListKey *lkTest = 0; SWTRY { - lkTest = SWDYNAMIC_CAST(ListKey, this->key); + lkTest = SWDYNAMIC_CAST(ListKey, thisKey); } SWCATCH ( ... ) { } if (lkTest) { @@ -102,9 +114,11 @@ VerseKey &SWText::getVerseKey() const { } } if (!key) { - tmpVK->setLocale(LocaleMgr::getSystemLocaleMgr()->getDefaultLocaleName()); - (*tmpVK) = *(this->key); - return (*tmpVK); + VerseKey *retKey = (tmpSecond) ? tmpVK1 : tmpVK2; + tmpSecond = !tmpSecond; + retKey->setLocale(LocaleMgr::getSystemLocaleMgr()->getDefaultLocaleName()); + (*retKey) = *(thisKey); + return (*retKey); } else return *key; } 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 |