I'm having similar problems with osis2mod for quite a while which I reported in a mail to this list on 4th July 2009: "osis2mod segfault". Is this the same issue that was discussed here lately?
Manfred Am 04.01.2010 um 16:52 schrieb DM Smith: > I took a quick look at the problem. Seems that osis2mod chokes on chapter > numbers that are not in the book. > (It works just fine if the chapter is valid but the verse number is not. And > I still cannot reproduce the bug where it chokes on a book not in the > versification.) > > Here is the smallest valid OSIS input that reproduces the problem: > <?xml version="1.0" encoding="UTF-8"?><osis > xmlns="http://www.bibletechnologies.net/2003/OSIS/namespace" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://www.bibletechnologies.net/2003/OSIS/namespace > http://www.bibletechnologies.net/osisCore.2.1.1.xsd"> > <osisText osisIDWork="KJV" osisRefWork="defaultReferenceScheme" xml:lang="en"> > <header> > <work osisWork="KJV"> > <title>King James Version (1769)</title> > <identifier type="OSIS">Bible.KJV</identifier> > <scope>Gen-Rev</scope> > <refSystem>Bible.KJV</refSystem> > </work> > <work osisWork="defaultReferenceScheme"> > <refSystem>Bible.KJV</refSystem> > </work> > </header> > <div type="book" osisID="Matt" canonical="true"> > <chapter osisID="Matt.29"> > <verse osisID="Matt.29.1">Matt.29.1 is not in the KJV versification</verse> > </chapter> > </div> > </osisText> > </osis> > > Since osis2mod does not care about the header, the following will do the same: > <div> > <verse osisID="Matt.29.1">Matt.29.1 is not in the KJV versification</verse> > </div> > > A quick look shows the problem in this osis2mod code (lines 773-800): > > // Get osisID for verse or annotateRef for commentary > SWBuf keyVal = token.getAttribute(tokenName == "verse" ? "osisID" : > "annotateRef"); > > // Massage the key into a form that ParseVerseList can accept > prepareSWVerseKey(keyVal); > > // The osisID or annotateRef can be more than a single verse > // The first or only one is the currentVerse > // Use the last verse seen (i.e. the currentVerse) as the basis for > recovering from bad parsing. > // This should never happen if the references are valid OSIS references > ListKey verseKeys = currentVerse.ParseVerseList(keyVal, currentVerse, true); > int memberKeyCount = verseKeys.Count(); > if (memberKeyCount) { > currentVerse = verseKeys.getElement(0); > // See if this osisID or annotateRef refers to more than one verse. > // If it does, save it until all verses have been seen. > // At that point we will output links. > // This can be done by incrementing, which will produce an error > // if there is only one verse. > verseKeys.setPosition(TOP); > verseKeys.increment(1); > if (!verseKeys.Error()) { > linkedVerses.push_back(verseKeys); > } > } > else { > cout << "ERROR(REF): Invalid osisID/annotateRef: " << > token.getAttribute((tokenName == "verse") ? "osisID" : > } > > In looking at the stack trace it gets into an infinite loop when calling: > verseKeys.increment(1); > > This calls Index(pos) with a value of 0, and recursively calls it with a > value of -1. Once it does that, it spins until a segfault calling malloc. > > Some help would be appreciated since I have very little extra time this month. > > In Him, > DM > > _______________________________________________ > 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 _______________________________________________ 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