Skip to content
Permalink
Browse files
Cleanups in calculateBaseDir.
  • Loading branch information
icculus committed Mar 21, 2007
1 parent 075e676 commit 030e84f3563248c767a3a195c583574b10662901
Showing with 27 additions and 37 deletions.
  1. +27 −37 physfs.c
@@ -651,59 +651,48 @@ 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);
retval[size] = '\0';
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);

0 comments on commit 030e84f

Please sign in to comment.