[sword-devel] Locale and text retrieval code
Manfred Bergmann
bergmannmd at web.de
Mon Feb 2 02:51:50 MST 2009
Am 01.02.2009 um 22:40 schrieb Troy A. Griffitts:
>>> The second thing I don't really understand is how to correctly
>>> pull out text for a verse key.
>>> Some code is following, sorry for that.
>
> Well, to correctly pull out text for a VerseKey, you should be able
> to just use 'VerseKey::getText()' If you have enable unicode in
> sword, then you will be using the UTF8 locales which should always
> return UTF8 and not Latin1.
>
> If you have a crash bug please let me know and I will try to hunt
> things down before this next release. Can you give me a small
> example of code that crashes? e.g.
>
> VerseKey key = "jn.1.1";
> key.Persist(true);
> ntOnlyModule.setKey(key);
> ntOnlyModule.RenderText();
>
>
> Does this crash? It shouldn't. Hope we can get things working well
> for you. I need a new laptop and considering buying a Mac! :)
No, this doesn't nor does it crash with any none existing key like
"par.1.1". It just returns the "rev.1.1" which is strange though. I
would expect it returns nothing.
But using ListKey and looping over it crashes, at least for me.
sword::VerseKey vk;
sword::ListKey listkey = vk.ParseVerseList("par.1.1", vk, true);
listkey.Persist(true);
swModule->setKey(listkey);
for ((*swModule) = sword::TOP; !swModule->Error(); (*swModule)++) {
const char *keyCStr = swModule->getKeyText();
const char *txtCStr = swModule->RenderText();
}
swModule->setKey("gen.1.1");
This crashes in the for loop at (*swModule) = sword::TOP, internally
in setPosition().
How can I create a crash log?
Regards,
Manfred
>
>
>
>>>
>>> In MacSword I have implemented the code like this:
>>>
>>> -----------------------
>>> // needed to check for UTF8 string
>>> MSStringMgr *strMgr = new MSStringMgr();
>>>
>>> // incoming reference
>>> const char *cref = [reference UTF8String];
>>> sword::VerseKey vk;
>>> sword::ListKey listkey = vk.ParseVerseList(cref, vk, true);
>>> // for the duration of this query be want the key to persist
>>> listkey.Persist(true);
>>> swModule->setKey(listkey);
>>>
>>> // iterate through keys
>>> for ((*swModule) = sword::TOP; !swModule->Error(); (*swModule)+
>>> +) {
>>> const char *keyCStr = swModule->getKeyText();
>>> const char *txtCStr = swModule->RenderText();
>>> NSMutableDictionary *dict = [NSMutableDictionary
>>> dictionaryWithCapacity:2];
>>> NSString *key = @"";
>>> NSString *txt = @"";
>>> if(strMgr->isUtf8(txtCStr)) {
>>> txt = [NSString stringWithUTF8String:txtCStr];
>>> } else {
>>> txt = [NSString stringWithCString:txtCStr
>>> encoding:NSISOLatin1StringEncoding];
>>> }
>>>
>>> if([self isUnicode]) {
>>> key = [NSString stringWithUTF8String:keyCStr];
>>> } else {
>>> key = [NSString stringWithCString:keyCStr
>>> encoding:NSISOLatin1StringEncoding];
>>> }
>>>
>>> // add to dict
>>> [dict setObject:txt forKey:SW_OUTPUT_TEXT_KEY];
>>> [dict setObject:key forKey:SW_OUTPUT_REF_KEY];
>>> // add to array
>>> [ret addObject:dict];
>>> }
>>> // remove persitent key
>>> swModule->setKey("gen.1.1");
>>> ------------------------
>> The above code still crashes for references that doesn't exist
>> while the below code works everywhere and always.
>>> This actually works but due to the problem with the locale and
>>> Umlauts it crashes somewhere in the library in the head of the for
>>> loop ((*swModule) = sword::TOP).
>>>
>>> I have some older code lying around (which actually is used in
>>> MacSword 1.4.3 done by William) which I to be honest don't
>>> understand:
>>>
>>> --------------------------
>>> sword::VerseKey vk;
>>> int lastIndex;
>>> ((sword::VerseKey*)(swModule->getKey()))->Headings(1); sword::ListKey
>>> listkey = vk.ParseVerseList(toUTF8(reference), "Gen1",
>>> true); for (int i = 0; i < listkey.Count(); i++) {
>>> sword::VerseKey *element = My_SWDYNAMIC_CAST(VerseKey,
>>> listkey.GetElement(i));
>>> // is it a chapter or book - not atomic
>>> if(element) {
>>> swModule->Key(element->LowerBound());
>>> // find the upper bound
>>> vk = element->UpperBound();
>>> vk.Headings(true);
>>> } else {
>>> // set it up
>>> swModule->Key(*listkey.GetElement(i));
>>> }
>>>
>>> // while not past the upper bound
>>> do { //add verse index to dictionary
>>> char *ctxt = (char *)swModule->RenderText();
>>> int clen = strlen(ctxt);
>>> NSString *text = fromUTF8(ctxt);
>>> NSString *verse = fromUTF8(swModule->Key().getText());
>>>
>>> // add to dict
>>> NSMutableDictionary *dict = [NSMutableDictionary
>>> dictionaryWithCapacity:2];
>>> [dict setObject:text forKey:SW_OUTPUT_TEXT_KEY];
>>> [dict setObject:verse forKey:SW_OUTPUT_REF_KEY];
>>> // add to array
>>> [ret addObject:dict];
>>>
>>> lastIndex = (swModule->Key()).Index();
>>> (*swModule)++;
>>> if(lastIndex == (swModule->Key()).Index())
>>> break;
>>> }while (element && swModule->Key() <= vk);
>>> }
>>> ---------------------
>>> This code also has the locale problem but it doesn't crash.
>>> The problem is however that I don't know the right way of pulling
>>> out text and I don't really understand some portions of the above
>>> code. These two loops really confuse me. I would be happy if
>>> someone could tell me line by line what happens here.
>>> I had the impression that actually the code above, which crashes,
>>> is correct. But it seems, it is not.
>>>
>>>
>>>
>>> Regards,
>>> Manfred
>>>
>>>
>>> _______________________________________________
>>> sword-devel mailing list: sword-devel at 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 at 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 at crosswire.org
> http://www.crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page
More information about the sword-devel
mailing list