Skip to content

Commit

Permalink
Initial debugging: dropped PhysicsFS routines into the Build engine,
Browse files Browse the repository at this point in the history
replacing Ken's groupfile management. Not finished, but lots of initial
debugging is complete. More bugs, likely in OUR groupfile code, are waiting
to be fixed, but the KenBuild editor runs without crashing (er...but the
palette doesn't seem to be loading... :)  )

  --ryan.
  • Loading branch information
icculus committed Jul 8, 2001
1 parent 5918534 commit f97faa2
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 20 deletions.
8 changes: 4 additions & 4 deletions archivers/dir.c
Expand Up @@ -107,7 +107,7 @@ static int DIR_isArchive(const char *filename, int forWriting)

static DirHandle *DIR_openArchive(const char *name, int forWriting)
{
const char *dirsep = __PHYSFS_platformDirSeparator;
const char *dirsep = PHYSFS_getDirSeparator();
DirHandle *retval = NULL;
int namelen = strlen(name);
int seplen = strlen(dirsep);
Expand All @@ -121,7 +121,7 @@ static DirHandle *DIR_openArchive(const char *name, int forWriting)
if (retval->opaque == NULL)
{
free(retval);
BAIL_IF_MACRO(0, ERR_OUT_OF_MEMORY, NULL);
BAIL_IF_MACRO(1, ERR_OUT_OF_MEMORY, NULL);
} /* if */

/* make sure there's a dir separator at the end of the string */
Expand Down Expand Up @@ -195,7 +195,7 @@ static FileHandle *doOpen(DirHandle *h, const char *name, const char *mode)
if (!retval)
{
free(f);
BAIL_IF_MACRO(0, ERR_OUT_OF_MEMORY, NULL);
BAIL_IF_MACRO(1, ERR_OUT_OF_MEMORY, NULL);
} /* if */

errno = 0;
Expand All @@ -206,7 +206,7 @@ static FileHandle *doOpen(DirHandle *h, const char *name, const char *mode)
if (!rc)
{
free(retval);
BAIL_IF_MACRO(0, str, NULL);
BAIL_IF_MACRO(1, str, NULL);
} /* if */

retval->opaque = (void *) rc;
Expand Down
101 changes: 92 additions & 9 deletions physfs.c
Expand Up @@ -11,6 +11,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include "physfs.h"

Expand Down Expand Up @@ -276,9 +277,82 @@ static char *calculateUserDir(void)
} /* calculateUserDir */


static int appendDirSep(char **dir)
{
const char *dirsep = PHYSFS_getDirSeparator();
char *ptr;

if (strcmp((*dir + strlen(*dir)) - strlen(dirsep), dirsep) == 0)
return(1);

ptr = realloc(*dir, strlen(*dir) + strlen(dirsep) + 1);
if (!ptr)
{
free(*dir);
return(0);
} /* if */

strcat(ptr, dirsep);
*dir = ptr;
return(1);
} /* appendDirSep */


static char *calculateBaseDir(const char *argv0)
{
assert(0); return(NULL);
const char *dirsep = PHYSFS_getDirSeparator();
char *retval;
char *ptr;
int allocSize = 0;

/*
* See if the platform driver wants to handle this for us...
*/
retval = __PHYSFS_platformCalcBaseDir(argv0);
if (retval != NULL)
return(retval);

/*
* Determine if there's a path on argv0. If there is, that's the base dir.
*/
ptr = strstr(argv0, dirsep);
if (ptr != NULL)
{
char *p = ptr;
size_t size;
while (p != NULL)
{
ptr = p;
p = strstr(p + 1, dirsep);
} /* while */

size = (size_t) (ptr - argv0); /* !!! is this portable? */
retval = (char *) malloc(size + 1);
BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
memcpy(retval, argv0, size);
retval[size] = '\0';
return(retval);
} /* if */

/*
* Last ditch effort: it's the current working directory. (*shrug*)
*/
do
{
allocSize += 100;
ptr = (char *) realloc(retval, allocSize);
if (ptr == NULL)
{
if (retval != NULL)
free(retval);
BAIL_IF_MACRO(1, ERR_OUT_OF_MEMORY, NULL);
} /* if */

retval = ptr;
ptr = getcwd(retval, allocSize);
} while (ptr == NULL);

return(retval);
} /* calculateBaseDir */


Expand All @@ -289,9 +363,10 @@ int PHYSFS_init(const char *argv0)

baseDir = calculateBaseDir(argv0);
BAIL_IF_MACRO(baseDir == NULL, NULL, 0);
BAIL_IF_MACRO(!appendDirSep(&baseDir), NULL, 0);

userDir = calculateUserDir();
if (userDir == NULL)
if ((userDir == NULL) || (!appendDirSep(&userDir)))
{
free(baseDir);
baseDir = NULL;
Expand Down Expand Up @@ -449,23 +524,26 @@ int PHYSFS_addToSearchPath(const char *newDir, int appendToPath)
BAIL_IF_MACRO(di == NULL, NULL, 0);

if (appendToPath)
{
di->next = searchPath;
searchPath = di;
} /* if */
else
{
DirInfo *i = searchPath;
DirInfo *prev = NULL;

di->next = NULL;
while (i != NULL)
{
prev = i;
i = i->next;
} /* while */

if (prev == NULL)
searchPath = di;
else
prev->next = di;
} /* if */
else
{
di->next = searchPath;
searchPath = di;
} /* else */

return(1);
Expand Down Expand Up @@ -1020,14 +1098,19 @@ PHYSFS_file *PHYSFS_openAppend(const char *filename)

PHYSFS_file *PHYSFS_openRead(const char *fname)
{
PHYSFS_file *retval = (PHYSFS_file *) malloc(sizeof (PHYSFS_file));
PHYSFS_file *retval;
FileHandle *rc = NULL;
FileHandleList *list;
DirInfo *i;

retval = (PHYSFS_file *) malloc(sizeof (PHYSFS_file));
BAIL_IF_MACRO(!retval, ERR_OUT_OF_MEMORY, NULL);
list = (FileHandleList *) malloc(sizeof (FileHandleList));
BAIL_IF_MACRO(!list, ERR_OUT_OF_MEMORY, NULL);
if (!list)
{
free(retval);
BAIL_IF_MACRO(1, ERR_OUT_OF_MEMORY, NULL);
} /* if */

for (i = searchPath; i != NULL; i = i->next)
{
Expand Down
3 changes: 3 additions & 0 deletions physfs.h
Expand Up @@ -200,6 +200,9 @@ void PHYSFS_getLinkedVersion(PHYSFS_Version *ver);
* Initialize PhysicsFS. This must be called before any other PhysicsFS
* function.
*
* This should be called prior to any attempts to change your process's
* current working directory.
*
* @param argv0 the argv[0] string passed to your program's mainline.
* @return nonzero on success, zero on error. Specifics of the error can be
* gleaned from PHYSFS_getLastError().
Expand Down
2 changes: 1 addition & 1 deletion physfs_internal.h
Expand Up @@ -316,7 +316,7 @@ char **__PHYSFS_platformDetectAvailableCDs(void);
* calculateBaseDir() in physfs.c ...)
* Caller will free() the retval if it's not NULL.
*/
char *__PHYSFS_platformCalcBaseDir(char *argv0);
char *__PHYSFS_platformCalcBaseDir(const char *argv0);

/*
* Get the platform-specific user name.
Expand Down
57 changes: 51 additions & 6 deletions platform/unix.c
Expand Up @@ -57,12 +57,6 @@ char **__PHYSFS_platformDetectAvailableCDs(void)
} /* __PHYSFS_detectAvailableCDs */


char *__PHYSFS_platformCalcBaseDir(char *argv0)
{
return(NULL); /* default PhysicsFS behaviour is acceptable. */
} /* __PHYSFS_platformCalcBaseDir */


static char *copyEnvironmentVariable(const char *varname)
{
const char *envr = getenv(varname);
Expand All @@ -79,6 +73,57 @@ static char *copyEnvironmentVariable(const char *varname)
} /* copyEnvironmentVariable */


/* !!! this is ugly. */
char *__PHYSFS_platformCalcBaseDir(const char *argv0)
{
/* If there isn't a path on argv0, then look through the $PATH for it. */

char *retval = NULL;
char *envr;
char *start;
char *ptr;
char *exe;

if (strchr(argv0, '/') != NULL) /* default behaviour can handle this. */
return(NULL);

envr = copyEnvironmentVariable("PATH");
BAIL_IF_MACRO(!envr, NULL, NULL);

start = envr;
do
{
ptr = strchr(start, ':');
if (ptr)
*ptr = '\0';

exe = (char *) malloc(strlen(start) + strlen(argv0) + 2);
if (!exe)
{
free(envr);
BAIL_IF_MACRO(1, ERR_OUT_OF_MEMORY, NULL);
} /* if */
strcpy(exe, start);
if (start[strlen(start) - 1] != '/')
strcat(start, "/");
strcat(start, argv0);
if (access(exe, X_OK) != 0)
free(exe);
else
{
retval = exe;
strcpy(retval, start); /* i'm lazy. piss off. */
break;
} /* else */

start = ptr + 1;
} while (ptr != NULL);

free(envr);
return(retval);
} /* __PHYSFS_platformCalcBaseDir */


static char *getUserNameByUID(void)
{
uid_t uid = getuid();
Expand Down

0 comments on commit f97faa2

Please sign in to comment.