fixed currentdir and added appdir search path

This commit is contained in:
oy 2017-09-16 19:10:19 +02:00
parent bd84c98893
commit 10eb5fad87
2 changed files with 74 additions and 53 deletions

View file

@ -19,32 +19,38 @@ public:
char m_aaStoragePaths[MAX_PATHS][MAX_PATH_LENGTH]; char m_aaStoragePaths[MAX_PATHS][MAX_PATH_LENGTH];
int m_NumPaths; int m_NumPaths;
char m_aDatadir[MAX_PATH_LENGTH]; char m_aDataDir[MAX_PATH_LENGTH];
char m_aUserdir[MAX_PATH_LENGTH]; char m_aUserDir[MAX_PATH_LENGTH];
char m_aCurrentdir[MAX_PATH_LENGTH]; char m_aCurrentDir[MAX_PATH_LENGTH];
char m_aAppDir[MAX_PATH_LENGTH];
CStorage() CStorage()
{ {
mem_zero(m_aaStoragePaths, sizeof(m_aaStoragePaths)); mem_zero(m_aaStoragePaths, sizeof(m_aaStoragePaths));
m_NumPaths = 0; m_NumPaths = 0;
m_aDatadir[0] = 0; m_aDataDir[0] = 0;
m_aUserdir[0] = 0; m_aUserDir[0] = 0;
m_aCurrentDir[0] = 0;
m_aAppDir[0] = 0;
} }
int Init(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) int Init(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments)
{ {
// get userdir // get userdir
fs_storage_path(pApplicationName, m_aUserdir, sizeof(m_aUserdir)); fs_storage_path(pApplicationName, m_aUserDir, sizeof(m_aUserDir));
// get appdir
FindAppDir(ppArguments[0]);
// get datadir // get datadir
FindDatadir(ppArguments[0]); FindDataDir();
// get currentdir // get currentdir
if(!fs_getcwd(m_aCurrentdir, sizeof(m_aCurrentdir))) if(!fs_getcwd(m_aCurrentDir, sizeof(m_aCurrentDir)))
m_aCurrentdir[0] = 0; m_aCurrentDir[0] = 0;
// load paths from storage.cfg // load paths from storage.cfg
LoadPaths(ppArguments[0]); LoadPaths();
if(!m_NumPaths) if(!m_NumPaths)
{ {
@ -81,26 +87,18 @@ public:
return m_NumPaths ? 0 : 1; return m_NumPaths ? 0 : 1;
} }
void LoadPaths(const char *pArgv0) void LoadPaths()
{ {
// check current directory // check current directory
IOHANDLE File = io_open("storage.cfg", IOFLAG_READ); IOHANDLE File = io_open("storage.cfg", IOFLAG_READ);
if(!File) if(!File)
{ {
// check usable path in argv[0] // check usable path in argv[0]
unsigned int Pos = ~0U;
for(unsigned i = 0; pArgv0[i]; i++)
if(pArgv0[i] == '/' || pArgv0[i] == '\\')
Pos = i;
if(Pos < MAX_PATH_LENGTH)
{
char aBuffer[MAX_PATH_LENGTH]; char aBuffer[MAX_PATH_LENGTH];
str_copy(aBuffer, pArgv0, Pos+1); str_copy(aBuffer, m_aAppDir, sizeof(aBuffer));
str_append(aBuffer, "/storage.cfg", sizeof(aBuffer)); str_append(aBuffer, "/storage.cfg", sizeof(aBuffer));
File = io_open(aBuffer, IOFLAG_READ); File = io_open(aBuffer, IOFLAG_READ);
} if(!File)
if(Pos >= MAX_PATH_LENGTH || !File)
{ {
dbg_msg("storage", "couldn't open storage.cfg"); dbg_msg("storage", "couldn't open storage.cfg");
return; return;
@ -128,6 +126,7 @@ public:
AddPath("$USERDIR"); AddPath("$USERDIR");
AddPath("$DATADIR"); AddPath("$DATADIR");
AddPath("$CURRENTDIR"); AddPath("$CURRENTDIR");
AddPath("$APPDIR");
} }
void AddPath(const char *pPath) void AddPath(const char *pPath)
@ -137,24 +136,35 @@ public:
if(!str_comp(pPath, "$USERDIR")) if(!str_comp(pPath, "$USERDIR"))
{ {
if(m_aUserdir[0]) if(m_aUserDir[0])
{ {
str_copy(m_aaStoragePaths[m_NumPaths++], m_aUserdir, MAX_PATH_LENGTH); str_copy(m_aaStoragePaths[m_NumPaths++], m_aUserDir, MAX_PATH_LENGTH);
dbg_msg("storage", "added path '$USERDIR' ('%s')", m_aUserdir); dbg_msg("storage", "added path '$USERDIR' ('%s')", m_aUserDir);
} }
} }
else if(!str_comp(pPath, "$DATADIR")) else if(!str_comp(pPath, "$DATADIR"))
{ {
if(m_aDatadir[0]) if(m_aDataDir[0])
{ {
str_copy(m_aaStoragePaths[m_NumPaths++], m_aDatadir, MAX_PATH_LENGTH); str_copy(m_aaStoragePaths[m_NumPaths++], m_aDataDir, MAX_PATH_LENGTH);
dbg_msg("storage", "added path '$DATADIR' ('%s')", m_aDatadir); dbg_msg("storage", "added path '$DATADIR' ('%s')", m_aDataDir);
} }
} }
else if(!str_comp(pPath, "$CURRENTDIR")) else if(!str_comp(pPath, "$CURRENTDIR"))
{ {
m_aaStoragePaths[m_NumPaths++][0] = 0; if(m_aCurrentDir[0])
dbg_msg("storage", "added path '$CURRENTDIR' ('%s')", m_aCurrentdir); {
str_copy(m_aaStoragePaths[m_NumPaths++], m_aCurrentDir, MAX_PATH_LENGTH);
dbg_msg("storage", "added path '$CURRENTDIR' ('%s')", m_aCurrentDir);
}
}
else if(!str_comp(pPath, "$APPDIR"))
{
if(m_aAppDir[0])
{
str_copy(m_aaStoragePaths[m_NumPaths++], m_aAppDir, MAX_PATH_LENGTH);
dbg_msg("storage", "added path '$APPDIR' ('%s')", m_aAppDir);
}
} }
else else
{ {
@ -166,41 +176,49 @@ public:
} }
} }
void FindDatadir(const char *pArgv0) void FindAppDir(const char *pArgv0)
{
// check for usable path in argv[0]
unsigned int Pos = ~0U;
for(unsigned i = 0; pArgv0[i]; ++i)
if(pArgv0[i] == '/' || pArgv0[i] == '\\')
Pos = i;
if(Pos < MAX_PATH_LENGTH)
{
str_copy(m_aAppDir, pArgv0, Pos+1);
if(!fs_is_dir(m_aAppDir))
m_aAppDir[0] = 0;
}
}
void FindDataDir()
{ {
// 1) use data-dir in PWD if present // 1) use data-dir in PWD if present
if(fs_is_dir("data/mapres")) if(fs_is_dir("data/mapres"))
{ {
str_copy(m_aDatadir, "data", sizeof(m_aDatadir)); str_copy(m_aDataDir, "data", sizeof(m_aDataDir));
return; return;
} }
// 2) use compiled-in data-dir if present // 2) use compiled-in data-dir if present
if(fs_is_dir(DATA_DIR "/mapres")) if(fs_is_dir(DATA_DIR "/mapres"))
{ {
str_copy(m_aDatadir, DATA_DIR, sizeof(m_aDatadir)); str_copy(m_aDataDir, DATA_DIR, sizeof(m_aDataDir));
return; return;
} }
// 3) check for usable path in argv[0] // 3) check for usable path in argv[0]
{
unsigned int Pos = ~0U;
for(unsigned i = 0; pArgv0[i]; i++)
if(pArgv0[i] == '/' || pArgv0[i] == '\\')
Pos = i;
if(Pos < MAX_PATH_LENGTH)
{ {
char aBaseDir[MAX_PATH_LENGTH]; char aBaseDir[MAX_PATH_LENGTH];
str_copy(aBaseDir, pArgv0, Pos+1); str_copy(aBaseDir, m_aAppDir, sizeof(aBaseDir));
str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", aBaseDir); str_format(m_aDataDir, sizeof(m_aDataDir), "%s/data", aBaseDir);
str_append(aBaseDir, "/data/mapres", sizeof(aBaseDir)); str_append(aBaseDir, "/data/mapres", sizeof(aBaseDir));
if(fs_is_dir(aBaseDir)) if(fs_is_dir(aBaseDir))
return; return;
else else
m_aDatadir[0] = 0; m_aDataDir[0] = 0;
}
} }
#if defined(CONF_FAMILY_UNIX) #if defined(CONF_FAMILY_UNIX)
@ -224,7 +242,7 @@ public:
str_format(aBuf, sizeof(aBuf), "%s/mapres", aDirs[i]); str_format(aBuf, sizeof(aBuf), "%s/mapres", aDirs[i]);
if(fs_is_dir(aBuf)) if(fs_is_dir(aBuf))
{ {
str_copy(m_aDatadir, aDirs[i], sizeof(m_aDatadir)); str_copy(m_aDataDir, aDirs[i], sizeof(m_aDataDir));
return; return;
} }
} }

View file

@ -14,6 +14,8 @@
# release # release
# $CURRENTDIR # $CURRENTDIR
# - current working directory # - current working directory
# $APPDIR
# - usable path provided by argv[0]
# #
# #
# The default file has the following entries: # The default file has the following entries:
@ -29,3 +31,4 @@
add_path $USERDIR add_path $USERDIR
add_path $DATADIR add_path $DATADIR
add_path $CURRENTDIR add_path $CURRENTDIR
add_path $APPDIR