On 02/28/2012 08:21 AM, Troy A. Griffitts wrote:
So, a little background.

SWORD keys handle versification + 4 special slots:

chapter intro
book intro
testament intro
module intro

These are positioned respectively using, for example starting with John 3:16

VerseKey k("John 3:16");

k.setVerse(0);    // chapter intro
k.setChapter(0); // book intro
k.setBook(0); // testament intro
k.setTestament(0); module intro

If you try to output the key when positioned to any of these 4 special locations, you will get:

John 3:0
John 0:0
[ Testament 2 Heading ]
[ Module Heading ]


It is important for our verse parser to be able to parse anything which it outputs. Thus the special cases for the magic strings which you note below.

I don't think the module having any special text/absence or presence of headers has anything to do with the problem; the key itself doesn't know about the module content.


Can you show a simple snippet which fails that I might try to debug?

I have created a small test program, and have added it to the examples folder, which tests the functionality and it seems to work for me, but I am using SVN HEAD. Maybe you could try this program in your environment:

http://crosswire.org/svn/sword/trunk/examples/classes/verseposition.cpp

Hope we can get this fixed for you,

Troy
Troy

The closest program that does what BibleTime does at the beginning of the indexing is this:
#include <iostream>
#include <swmgr.h>
#include <swmodule.h>
#include <versekey.h>

using namespace sword;
using namespace std;

int main(int argc, char **argv) {

        const char *modName = "HunKar";
        SWMgr library;
        SWModule *book = library.getModule(modName);
        if (!book) {
                cerr << "Can't find module: " << modName << endl;
                return -1;
        }
        book->setPosition(TOP);
        return 0;
}

However, this program does not have the problem BibleTime is having. It seems that some other condition about the module is different between the two cases, but I have not been able to discover what it is.

I have debugged down into the setPosition function until I see a difference. Perhaps if I explain that difference it will mean something to you.

call stack
1    sword::zText::increment    ztext.cpp    178    0xb7f001a5
2    sword::zText::decrement    ztext.h    65    0xb7f004f1
3    sword::SWModule::operator-=    swmodule.h    674    0x815299f
4    sword::SWModule::operator--    swmodule.h    674    0x81529ff
5    sword::SWModule::setPosition    swmodule.cpp    368    0xb7ea81c9
6    CSwordModuleInfo::buildIndex    cswordmoduleinfo.cpp 262 0x813aa07

I get down to the increment function when I see the difference. The function begins like this:

void zText::increment(int steps) {
    long start;
    unsigned short size;
    unsigned long buffnum;
    VerseKey *tmpkey = &getVerseKey();

The values for tmpkey are different and in BibleTime we hit the error condition a little farther into the function:

        if ((error = key->Error())) {
            *key = lastgood;
            break;

For the test program tmpkey looks like this:

        thisKey         sword::VerseKey
                sword::SWKey            sword::SWKey
                BMAX    @0x8116e24      int [2]
                autonorm        1       char
                book    1       signed char
                chapter 1       int
                headings        0 '\0'  char
                internalListKey         sword::ListKey
                lowerBound      0       long
lowerBoundComponents sword::VerseKey::VerseComponents
                refSys   @0x806a7fc     sword::VerseMgr::System
                suffix  0 '\0'  signed char
                testament       1       signed char
                tmpClone         @0x8129db8     sword::VerseKey
                upperBound      32359   long
upperBoundComponents sword::VerseKey::VerseComponents
                verse   2       int

For BibleTime tmpkey looks like this:

        tmpkey   @0x843cc40     sword::VerseKey
                sword::SWKey            sword::SWKey
                BMAX    @0x843cce4      int [2]
                autonorm        1       char
                book    0 '\0'  signed char
                chapter 0       int
                headings        1       char
                internalListKey         sword::ListKey
                lowerBound      0       long
lowerBoundComponents sword::VerseKey::VerseComponents
                refSys   @0x843c08c     sword::VerseMgr::System
                suffix  0 '\0'  signed char
                testament       1       signed char
                tmpClone         @0x863a790     sword::VerseKey
                upperBound      32359   long
upperBoundComponents sword::VerseKey::VerseComponents
                verse   0       int


I suspect that the book, chapter, and headings values being different are causing the problem. Do you have any thoughts on this?

Gary



_______________________________________________
sword-devel mailing list: sword-devel@crosswire.org
http://www.crosswire.org/mailman/listinfo/sword-devel
Instructions to unsubscribe/change your settings at above page

Reply via email to