From 4e54ea54ac43a2b0e0b813783868b55934d61e9f Mon Sep 17 00:00:00 2001 From: harry Date: Sat, 7 Jan 2023 01:19:29 -0500 Subject: [PATCH] Refactor Qt GUI function fceuExecutablePath to be more efficient. Since the path to the executable never changes during the lifetime of the process, save it off the first time this function is called for later use. Function interface changed to just pass back a pointer to the saved string. Saves on stack memory and is more efficient since it does not have to continually copy data onto the stack. --- src/drivers/Qt/ConsoleUtilities.cpp | 28 ++++++++++++++++------------ src/drivers/Qt/ConsoleUtilities.h | 2 +- src/drivers/Qt/GuiConf.cpp | 12 ++++++------ src/drivers/Qt/LuaControl.cpp | 6 +++--- src/drivers/Qt/PaletteConf.cpp | 4 ++-- src/drivers/Qt/PaletteEditor.cpp | 4 ++-- 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/drivers/Qt/ConsoleUtilities.cpp b/src/drivers/Qt/ConsoleUtilities.cpp index abdc5981..1d0ca517 100644 --- a/src/drivers/Qt/ConsoleUtilities.cpp +++ b/src/drivers/Qt/ConsoleUtilities.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,7 @@ #include "Qt/fceuWrapper.h" #include "Qt/ConsoleUtilities.h" +static std::string fceuExecPath; //--------------------------------------------------------------------------- int getDirFromFile( const char *path, char *dir, size_t bufSize ) { @@ -229,13 +231,9 @@ int parseFilepath( const char *filepath, char *dir, char *base, char *suffix ) } //--------------------------------------------------------------------------- // Returns the path of fceux.exe as a string. -int fceuExecutablePath( char *outputPath, size_t outputSize ) +static int _fceuExecutablePath( std::string &outputPath ) { - if ( (outputPath == NULL) || (outputSize <= 0) ) - { - return -1; - } - outputPath[0] = 0; + outputPath.clear(); #ifdef WIN32 char fullPath[2048]; @@ -246,8 +244,7 @@ int fceuExecutablePath( char *outputPath, size_t outputSize ) GetModuleFileNameA(NULL, fullPath, 2048); _splitpath(fullPath, driveLetter, directory, NULL, NULL); snprintf(finalPath, sizeof(finalPath), "%s%s", driveLetter, directory); - strncpy( outputPath, finalPath, outputSize ); - outputPath[outputSize-1] = 0; + outputPath.assign( finalPath ); return 0; #elif __linux__ || __unix__ @@ -265,8 +262,7 @@ int fceuExecutablePath( char *outputPath, size_t outputSize ) if ( dir ) { //printf("DIR Path: '%s' \n", dir ); - strncpy( outputPath, dir, outputSize ); - outputPath[outputSize-1] = 0; + outputPath.assign( dir ); return 0; } } @@ -286,8 +282,7 @@ int fceuExecutablePath( char *outputPath, size_t outputSize ) if ( dir ) { //printf("DIR Path: '%s' \n", dir ); - strncpy( outputPath, dir, outputSize ); - outputPath[outputSize-1] = 0; + outputPath.assign( dir ); return 0; } } @@ -295,6 +290,15 @@ int fceuExecutablePath( char *outputPath, size_t outputSize ) return -1; } //--------------------------------------------------------------------------- +const char *fceuExecutablePath(void) +{ + if (fceuExecPath.size() == 0) + { + _fceuExecutablePath( fceuExecPath ); + } + return fceuExecPath.c_str(); +} +//--------------------------------------------------------------------------- int fceuLoadConfigColor( const char *confName, QColor *color ) { std::string colorString; diff --git a/src/drivers/Qt/ConsoleUtilities.h b/src/drivers/Qt/ConsoleUtilities.h index c995f13e..90fb6059 100644 --- a/src/drivers/Qt/ConsoleUtilities.h +++ b/src/drivers/Qt/ConsoleUtilities.h @@ -17,7 +17,7 @@ int getFileBaseName( const char *filepath, char *base, char *suffix = NULL ); int parseFilepath( const char *filepath, char *dir, char *base, char *suffix = NULL ); -int fceuExecutablePath( char *outputPath, size_t outputSize ); +const char *fceuExecutablePath(void); int fceuLoadConfigColor( const char *confName, QColor *color ); diff --git a/src/drivers/Qt/GuiConf.cpp b/src/drivers/Qt/GuiConf.cpp index 491f59e9..e7e699a8 100644 --- a/src/drivers/Qt/GuiConf.cpp +++ b/src/drivers/Qt/GuiConf.cpp @@ -370,12 +370,12 @@ void GuiConfDialog_t::openQss(void) QString filename; std::string last, iniPath; char dir[512]; - char exePath[512]; + const char *exePath = nullptr; QFileDialog dialog(this, tr("Open Qt Stylesheet (QSS)")); QList urls; QDir d; - fceuExecutablePath(exePath, sizeof(exePath)); + exePath = fceuExecutablePath(); //urls = dialog.sidebarUrls(); urls << QUrl::fromLocalFile(QDir::rootPath()); @@ -474,12 +474,12 @@ void GuiConfDialog_t::openQPal(void) QString filename; std::string last, iniPath; char dir[512]; - char exePath[512]; + const char *exePath = nullptr; QFileDialog dialog(this, tr("Open Qt QPalette File (QPAL)")); QList urls; QDir d; - fceuExecutablePath(exePath, sizeof(exePath)); + exePath = fceuExecutablePath(); //urls = dialog.sidebarUrls(); urls << QUrl::fromLocalFile(QDir::rootPath()); @@ -1177,13 +1177,13 @@ void GuiPaletteEditDialog_t::paletteSaveAs(void) QString filename; std::string last, iniPath; char dir[512]; - char exePath[512]; + const char *exePath = nullptr; QFileDialog dialog(this, tr("Save QPalette (qpal)")); QList urls; QDir d; QPalette pal = this->palette(); - fceuExecutablePath(exePath, sizeof(exePath)); + exePath = fceuExecutablePath(); //urls = dialog.sidebarUrls(); urls << QUrl::fromLocalFile(QDir::rootPath()); diff --git a/src/drivers/Qt/LuaControl.cpp b/src/drivers/Qt/LuaControl.cpp index 56f68600..b66ed4d4 100644 --- a/src/drivers/Qt/LuaControl.cpp +++ b/src/drivers/Qt/LuaControl.cpp @@ -280,13 +280,13 @@ void LuaControlDialog_t::openLuaScriptFile(void) QString filename; std::string last; char dir[2048]; - char exePath[2048]; - const char *luaPath; + const char *exePath = nullptr; + const char *luaPath = nullptr; QFileDialog dialog(this, tr("Open LUA Script")); QList urls; QDir d; - fceuExecutablePath(exePath, sizeof(exePath)); + exePath = fceuExecutablePath(); //urls = dialog.sidebarUrls(); urls << QUrl::fromLocalFile(QDir::rootPath()); diff --git a/src/drivers/Qt/PaletteConf.cpp b/src/drivers/Qt/PaletteConf.cpp index df783ccc..6b185f22 100644 --- a/src/drivers/Qt/PaletteConf.cpp +++ b/src/drivers/Qt/PaletteConf.cpp @@ -495,12 +495,12 @@ void PaletteConfDialog_t::openPaletteFile(void) QString filename; std::string last, iniPath; char dir[512]; - char exePath[512]; + const char *exePath = nullptr; QFileDialog dialog(this, tr("Open NES Palette")); QList urls; QDir d; - fceuExecutablePath(exePath, sizeof(exePath)); + exePath = fceuExecutablePath(); //urls = dialog.sidebarUrls(); urls << QUrl::fromLocalFile(QDir::rootPath()); diff --git a/src/drivers/Qt/PaletteEditor.cpp b/src/drivers/Qt/PaletteEditor.cpp index 442952a8..e6c6d4d4 100644 --- a/src/drivers/Qt/PaletteEditor.cpp +++ b/src/drivers/Qt/PaletteEditor.cpp @@ -315,13 +315,13 @@ void PaletteEditorDialog_t::openPaletteFileDialog(void) int ret, useNativeFileDialogVal; QString filename; char dir[512]; - char exePath[512]; + const char *exePath = nullptr; std::string last, iniPath; QFileDialog dialog(this, tr("Open Palette From File") ); QList urls; QDir d; - fceuExecutablePath( exePath, sizeof(exePath) ); + exePath = fceuExecutablePath(); //urls = dialog.sidebarUrls(); urls << QUrl::fromLocalFile( QDir::rootPath() );