[sword-devel] Finding Devotional modules

David "Judah's Shadow" Blue yudahsshadow at gmx.com
Mon Mar 18 14:21:40 EDT 2024


On Tuesday, March 12, 2024 4:31:07 PM EDT David "Judah's Shadow" Blue wrote:
> After grepping around in the BibleTime source code, I settled on using their
> solution of using module category and/or features showing the module is a
> devotional. I'm doing the following assignment
> 
> category = tempMod->getConfigEntry("Category");
> 
> If category is a std::string I get a segfault. If category is a const char*
> it works. Is there some reason the return value of getConfigEntry isn't
> compatible with std::string in this instance? Or have I found a magic/more
> magic switch?

Based on other weirdness I get from this function, I want to say it's a magic/
more magic switch. That said, I would really like to declare category as a 
std::string instead of a const char* so I can do a straight literal comparison 
instead of mucking around with strncmp (which at the moment is also crashing). 
For devotionals, maps, and image based modules I can fall back to 
getConfig.has("Feature",feature). But I don't have such a fallback for "Cult / 
Unorthodox / Questionable Material" category works, which is what I'm 
currently trying to filter out. I've included my function as it stands 
currently using const char* and strncmp.

std::list<std::string> Library::getModuleList(std::string moduleType) {
    std::string module = "";
    sword::ModMap::iterator libraryIterator;
    std::list<std::string> moduleList;
    std::string selectedType;
    std::string modType;

    std::string bible = sword::SWMgr::MODTYPE_BIBLES;
    std::string comentary = sword::SWMgr::MODTYPE_COMMENTARIES;
    std::string devo = sword::SWMgr::MODTYPE_DAILYDEVOS;
    std::string book = sword::SWMgr::MODTYPE_GENBOOKS;
    std::string dict = sword::SWMgr::MODTYPE_LEXDICTS;

    const char *category;

    sword::SWModule *tempMod;

    if(moduleType == "bible") {
        selectedType = bible;
    }
    else if(moduleType == "commentary") {
        selectedType = comentary;
    }
    else if(moduleType == "devotion") {
            selectedType = devo;
    }
    else if(moduleType == "book") {
            selectedType = book;
    }
    else if(moduleType == "dictionary") {
            selectedType = dict;
    }
    else {
            //We should never get here but you never know.
            module = "Invalid type";
            moduleList.push_back(module);
            return moduleList;
    }

    for(libraryIterator = this->swordLibrary->Modules.begin();
        libraryIterator != this->swordLibrary->Modules.end();
        libraryIterator++) {

        tempMod = libraryIterator->second;

        category = tempMod->getConfigEntry("Category");

        //Devotions will never match on straight type, so check category or
        //features and set the module type to devotion, otherwise accept the
        //type from the module.
        if(strncmp("Devotional",category,11) == 0 ||
            tempMod->getConfig().has("Feature","DailyDevotion")) {

            modType = devo;
        }
        //Modules with images aren't supported since this is a text only
        //application so set the type to something selectedType will never
        //match against
        else if(strncmp(category, "Maps",4) == 0 ||
            strncmp(category,"Images",6) == 0 ||
            tempMod->getConfig().has("Feature", "Images")) {
            modType = "Unsupported";
        }
        else if(strncmp(category, "Cults / Unorthodox / Questionable Material"   
,42)) {
            modType = "cultish";
        }
        else {
            modType = tempMod->getType();
        }

        if(modType == selectedType) {
            module = "For ";
            module += tempMod->getDescription();
            module += " select ";
            module += tempMod->getName();
            moduleList.push_front(module);
            module = "";
        }

    }

    return moduleList;

}




More information about the sword-devel mailing list