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.

This commit is contained in:
harry 2023-01-07 01:19:29 -05:00
parent b3717c008b
commit 4e54ea54ac
6 changed files with 30 additions and 26 deletions

View File

@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <QWindow>
#include <QScreen>
@ -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;

View File

@ -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 );

View File

@ -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<QUrl> 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<QUrl> 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<QUrl> urls;
QDir d;
QPalette pal = this->palette();
fceuExecutablePath(exePath, sizeof(exePath));
exePath = fceuExecutablePath();
//urls = dialog.sidebarUrls();
urls << QUrl::fromLocalFile(QDir::rootPath());

View File

@ -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<QUrl> urls;
QDir d;
fceuExecutablePath(exePath, sizeof(exePath));
exePath = fceuExecutablePath();
//urls = dialog.sidebarUrls();
urls << QUrl::fromLocalFile(QDir::rootPath());

View File

@ -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<QUrl> urls;
QDir d;
fceuExecutablePath(exePath, sizeof(exePath));
exePath = fceuExecutablePath();
//urls = dialog.sidebarUrls();
urls << QUrl::fromLocalFile(QDir::rootPath());

View File

@ -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<QUrl> urls;
QDir d;
fceuExecutablePath( exePath, sizeof(exePath) );
exePath = fceuExecutablePath();
//urls = dialog.sidebarUrls();
urls << QUrl::fromLocalFile( QDir::rootPath() );