From 030e84f3563248c767a3a195c583574b10662901 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 21 Mar 2007 05:22:48 +0000 Subject: [PATCH] Cleanups in calculateBaseDir. --- physfs.c | 64 ++++++++++++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/physfs.c b/physfs.c index c12818b7..d1419475 100644 --- a/physfs.c +++ b/physfs.c @@ -651,35 +651,38 @@ static int appendDirSep(char **dir) static char *calculateBaseDir(const char *argv0) { - const char *dirsep = PHYSFS_getDirSeparator(); - char *retval; - char *ptr; + char *retval = NULL; + const char *dirsep = NULL; + char *ptr = NULL; - /* - * See if the platform driver wants to handle this for us... - */ + /* Give the platform layer first shot at this. */ retval = __PHYSFS_platformCalcBaseDir(argv0); if (retval != NULL) return(retval); - /* we need argv0 to be sane to go on. */ - BAIL_IF_MACRO(argv0 == NULL, ERR_INVALID_ARGUMENT, NULL); + /* We need argv0 to go on. */ + BAIL_IF_MACRO(argv0 == NULL, ERR_ARGV0_IS_NULL, NULL); - /* - * Determine if there's a path on argv0. If there is, that's the base dir. - */ - ptr = strstr(argv0, dirsep); - if (ptr != NULL) + dirsep = PHYSFS_getDirSeparator(); + if (strlen(dirsep) == 1) /* fast path. */ + ptr = strrchr(argv0, *dirsep); + else { - char *p = ptr; - size_t size; - while (p != NULL) + ptr = strstr(argv0, dirsep); + if (ptr != NULL) { - ptr = p; - p = strstr(p + 1, dirsep); - } /* while */ + char *p = ptr; + while (p != NULL) + { + ptr = p; + p = strstr(p + 1, dirsep); + } /* while */ + } /* if */ + } /* else */ - size = (size_t) (ptr - argv0); + if (ptr != NULL) + { + size_t size = (size_t) (ptr - argv0); retval = (char *) allocator.Malloc(size + 1); BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL); memcpy(retval, argv0, size); @@ -687,23 +690,9 @@ static char *calculateBaseDir(const char *argv0) return(retval); } /* if */ - /* !!! FIXME: should probably just fail here instead of being heroic. */ - - /* - * Last ditch effort: it's the current working directory. (*shrug*) - */ - retval = __PHYSFS_platformCurrentDir(); - if (retval != NULL) - return(retval); - - /* - * Ok, current directory doesn't exist, use the root directory. - * Not a good alternative, but it only happens if the current - * directory was deleted from under the program. - */ - retval = (char *) allocator.Malloc(strlen(dirsep) + 1); - strcpy(retval, dirsep); - return(retval); + /* argv0 wasn't helpful. */ + BAIL_MACRO(ERR_INVALID_ARGUMENT, NULL); + return(NULL); } /* calculateBaseDir */ @@ -752,6 +741,7 @@ int PHYSFS_init(const char *argv0) baseDir = calculateBaseDir(argv0); BAIL_IF_MACRO(baseDir == NULL, NULL, 0); + /* !!! FIXME: only call this if we got this from argv0 (unreliable). */ ptr = __PHYSFS_platformRealPath(baseDir); allocator.Free(baseDir); BAIL_IF_MACRO(ptr == NULL, NULL, 0);