[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