From 0831f7e39213d27494292c7e65e1627153e53c1a Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Mon, 26 Jan 2026 18:31:04 +0100 Subject: [PATCH] App: Avoid C string compare Since we are linking to boost anyway, use boost function for case insensitive string compare. While there, make affected methods accept std::string arguments, which simplifies code a bit. --- src/App/Application.cpp | 61 ++++++++++++++------------------------- src/App/Application.h | 16 +++++----- src/App/ApplicationPy.cpp | 2 +- src/Gui/FileDialog.cpp | 8 ++--- src/Gui/MainWindow.cpp | 4 +-- 5 files changed, 36 insertions(+), 55 deletions(-) diff --git a/src/App/Application.cpp b/src/App/Application.cpp index b658d196b9..1486a0463a 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -34,6 +34,7 @@ # define WINVER 0x502 // needed for SetDllDirectory # include # endif +# include # include # include # include @@ -1339,18 +1340,15 @@ void Application::changeImportModule(const char* filter, const char* oldModuleNa } } -std::vector Application::getImportModules(const char* extension) const +std::vector Application::getImportModules(const std::string& extension) const { std::vector modules; for (const auto & it : _mImportTypes) { const std::vector& types = it.types; for (const auto & jt : types) { -#ifdef __GNUC__ - if (strcasecmp(extension, jt.c_str()) == 0) -#else - if (_stricmp(extension, jt.c_str()) == 0) -#endif + if (boost::iequals(extension, jt)) { modules.push_back(it.module); + } } } @@ -1369,16 +1367,13 @@ std::vector Application::getImportModules() const return modules; } -std::vector Application::getImportTypes(const char* Module) const +std::vector Application::getImportTypes(const std::string& Module) const { std::vector types; for (const auto & it : _mImportTypes) { -#ifdef __GNUC__ - if (strcasecmp(Module,it.module.c_str()) == 0) -#else - if (_stricmp(Module,it.module.c_str()) == 0) -#endif + if (boost::iequals(Module, it.module)) { types.insert(types.end(), it.types.begin(), it.types.end()); + } } return types; @@ -1397,18 +1392,15 @@ std::vector Application::getImportTypes() const return types; } -std::map Application::getImportFilters(const char* extension) const +std::map Application::getImportFilters(const std::string& extension) const { std::map moduleFilter; for (const auto & it : _mImportTypes) { const std::vector& types = it.types; for (const auto & jt : types) { -#ifdef __GNUC__ - if (strcasecmp(extension,jt.c_str()) == 0) -#else - if (_stricmp(extension,jt.c_str()) == 0) -#endif + if (boost::iequals(extension, jt)) { moduleFilter[it.filter] = it.module; + } } } @@ -1464,18 +1456,15 @@ void Application::changeExportModule(const char* filter, const char* oldModuleNa } } -std::vector Application::getExportModules(const char* extension) const +std::vector Application::getExportModules(const std::string& extension) const { std::vector modules; for (const auto & it : _mExportTypes) { const std::vector& types = it.types; for (const auto & jt : types) { -#ifdef __GNUC__ - if (strcasecmp(extension,jt.c_str()) == 0) -#else - if (_stricmp(extension,jt.c_str()) == 0) -#endif + if (boost::iequals(extension, jt)) { modules.push_back(it.module); + } } } @@ -1494,16 +1483,13 @@ std::vector Application::getExportModules() const return modules; } -std::vector Application::getExportTypes(const char* Module) const +std::vector Application::getExportTypes(const std::string& Module) const { std::vector types; for (const auto & it : _mExportTypes) { -#ifdef __GNUC__ - if (strcasecmp(Module,it.module.c_str()) == 0) -#else - if (_stricmp(Module,it.module.c_str()) == 0) -#endif + if (boost::iequals(Module, it.module)) { types.insert(types.end(), it.types.begin(), it.types.end()); + } } return types; @@ -1522,18 +1508,15 @@ std::vector Application::getExportTypes() const return types; } -std::map Application::getExportFilters(const char* extension) const +std::map Application::getExportFilters(const std::string& extension) const { std::map moduleFilter; for (const auto & it : _mExportTypes) { const std::vector& types = it.types; for (const auto & jt : types) { -#ifdef __GNUC__ - if (strcasecmp(extension,jt.c_str()) == 0) -#else - if (_stricmp(extension,jt.c_str()) == 0) -#endif + if (boost::iequals(extension, jt)) { moduleFilter[it.filter] = it.module; + } } } @@ -2847,8 +2830,7 @@ std::list Application::processFiles(const std::list& f } } else { - std::string ext = file.extension(); - std::vector mods = GetApplication().getImportModules(ext.c_str()); + std::vector mods = GetApplication().getImportModules(file.extension()); if (!mods.empty()) { std::string escapedstr = Base::Tools::escapedUnicodeFromUtf8(file.filePath().c_str()); escapedstr = Base::Tools::escapeEncodeFilename(escapedstr); @@ -2905,9 +2887,8 @@ void Application::processCmdLineFiles() output = Base::Tools::escapeEncodeFilename(output); const Base::FileInfo fi(output); - const std::string ext = fi.extension(); try { - const std::vector mods = GetApplication().getExportModules(ext.c_str()); + const std::vector mods = GetApplication().getExportModules(fi.extension()); if (!mods.empty()) { Base::Interpreter().loadModule(mods.front().c_str()); Base::Interpreter().runStringArg("import %s",mods.front().c_str()); diff --git a/src/App/Application.h b/src/App/Application.h index 68331e12cf..38d7adb39e 100644 --- a/src/App/Application.h +++ b/src/App/Application.h @@ -561,7 +561,7 @@ public: * * @param[in] extension The file type extension. */ - std::vector getImportModules(const char* extension) const; + std::vector getImportModules(const std::string& extension) const; /// Get a list of all import modules. std::vector getImportModules() const; @@ -572,7 +572,7 @@ public: * @param[in] Module The module name. * @return A list of file types (extensions) supported by the module. */ - std::vector getImportTypes(const char* Module) const; + std::vector getImportTypes(const std::string& Module) const; /// Get a list of all import filetypes represented as extensions. std::vector getImportTypes() const; @@ -583,7 +583,7 @@ public: * @param[in] extension The file type represented by its extension. * @return A map of filter description to module name. */ - std::map getImportFilters(const char* extension) const; + std::map getImportFilters(const std::string& extension) const; /// Get a mapping of all import filters to their modules. std::map getImportFilters() const; @@ -605,7 +605,7 @@ public: * * @copydetails getImportModules */ - std::vector getExportModules(const char* extension) const; + std::vector getExportModules(const std::string& extension) const; /// Get a list of all export modules. std::vector getExportModules() const; @@ -613,9 +613,9 @@ public: /** * @brief Get a list of filetypes that are supported by a module for export. * - * @copydetails App::Application::getImportTypes(const char*) const + * @copydetails App::Application::getImportTypes(const std::string&) const */ - std::vector getExportTypes(const char* Module) const; + std::vector getExportTypes(const std::string& Module) const; /// Get a list of all export filetypes. std::vector getExportTypes() const; @@ -623,9 +623,9 @@ public: /** * @brief Get the export filters with modules of a given filetype. * - * @copydetails App::Application::getImportFilters(const char*) const + * @copydetails App::Application::getImportFilters(const std::string&) const */ - std::map getExportFilters(const char* extension) const; + std::map getExportFilters(const std::string& extension) const; /// Get a mapping of all export filters to their modules. std::map getExportFilters() const; diff --git a/src/App/ApplicationPy.cpp b/src/App/ApplicationPy.cpp index 406b88a745..c1315679ae 100644 --- a/src/App/ApplicationPy.cpp +++ b/src/App/ApplicationPy.cpp @@ -760,7 +760,7 @@ PyObject* Application::sGetExportType(PyObject* /*self*/, PyObject* args) Py::Dict dict; std::vector types = GetApplication().getExportTypes(); for (const auto& it : types) { - std::vector modules = GetApplication().getExportModules(it.c_str()); + std::vector modules = GetApplication().getExportModules(it); if (modules.empty()) { dict.setItem(it.c_str(), Py::None()); } diff --git a/src/Gui/FileDialog.cpp b/src/Gui/FileDialog.cpp index 58c3cf725c..40b8065c05 100644 --- a/src/Gui/FileDialog.cpp +++ b/src/Gui/FileDialog.cpp @@ -1098,12 +1098,12 @@ SelectModule::Dict SelectModule::exportHandler(const QStringList& fileNames, con QFileInfo fi(fileName); QString ext = fi.completeSuffix().toLower(); std::map filters = App::GetApplication().getExportFilters( - ext.toLatin1() + ext.toStdString() ); if (filters.empty()) { ext = fi.suffix().toLower(); - filters = App::GetApplication().getExportFilters(ext.toLatin1()); + filters = App::GetApplication().getExportFilters(ext.toStdString()); } fileExtension[ext].push_back(fileName); @@ -1168,12 +1168,12 @@ SelectModule::Dict SelectModule::importHandler(const QStringList& fileNames, con QFileInfo fi(fileName); QString ext = fi.completeSuffix().toLower(); std::map filters = App::GetApplication().getImportFilters( - ext.toLatin1() + ext.toStdString() ); if (filters.empty()) { ext = fi.suffix().toLower(); - filters = App::GetApplication().getImportFilters(ext.toLatin1()); + filters = App::GetApplication().getImportFilters(ext.toStdString()); } fileExtension[ext].push_back(fileName); diff --git a/src/Gui/MainWindow.cpp b/src/Gui/MainWindow.cpp index 70f5d207d5..0bb8e02ddf 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -2453,10 +2453,10 @@ void MainWindow::loadUrls(App::Document* doc, const QList& urls) info.setFile(info.symLinkTarget()); } std::vector module = App::GetApplication().getImportModules( - info.completeSuffix().toLatin1() + info.completeSuffix().toStdString() ); if (module.empty()) { - module = App::GetApplication().getImportModules(info.suffix().toLatin1()); + module = App::GetApplication().getImportModules(info.suffix().toStdString()); } if (!module.empty()) { // ok, we support files with this extension