Skip to content

Commit

Permalink
Rewrote the file closing routines to not be so gay. Cleaned up the op…
Browse files Browse the repository at this point in the history
…ening

routines, too. One less malloc and free needed for an open/close pair, which
makes things frighteningly more manageable. --ryan.
  • Loading branch information
icculus committed Jul 9, 2001
1 parent ce29f03 commit 096d57e
Showing 1 changed file with 49 additions and 52 deletions.
101 changes: 49 additions & 52 deletions physfs.c
Expand Up @@ -35,7 +35,7 @@ typedef struct __PHYSFS_DIRINFO__

typedef struct __PHYSFS_FILEHANDLELIST__
{
PHYSFS_file *handle;
PHYSFS_file handle;
struct __PHYSFS_FILEHANDLELIST__ *next;
} FileHandleList;

Expand Down Expand Up @@ -236,7 +236,7 @@ static int freeDirInfo(DirInfo *di, FileHandleList *openList)

for (i = openList; i != NULL; i = i->next)
{
const DirHandle *h = ((FileHandle *) i->handle->opaque)->dirHandle;
const DirHandle *h = ((FileHandle *) &(i->handle.opaque))->dirHandle;
BAIL_IF_MACRO(h == di->dirHandle, ERR_FILES_STILL_OPEN, 0);
} /* for */

Expand Down Expand Up @@ -387,14 +387,13 @@ static int closeFileHandleList(FileHandleList **list)
for (i = *list; i != NULL; i = next)
{
next = i->next;
h = (FileHandle *) (i->handle->opaque);
if (!h->funcs->fileClose(i->handle->opaque))
h = (FileHandle *) (i->handle.opaque);
if (!h->funcs->fileClose(h))
{
*list = i;
return(0);
} /* if */

free(i->handle);
free(i);
} /* for */

Expand Down Expand Up @@ -1052,13 +1051,12 @@ int PHYSFS_isSymbolicLink(const char *fname)

static PHYSFS_file *doOpenWrite(const char *fname, int appending)
{
PHYSFS_file *retval = (PHYSFS_file *) malloc(sizeof (PHYSFS_file));
PHYSFS_file *retval = NULL;
FileHandle *rc = NULL;
DirHandle *h = (writeDir == NULL) ? NULL : writeDir->dirHandle;
const DirFunctions *f = (h == NULL) ? NULL : h->funcs;
FileHandleList *list;

BAIL_IF_MACRO(!retval, ERR_OUT_OF_MEMORY, NULL);
BAIL_IF_MACRO(!h, ERR_NO_WRITE_DIR, NULL);
BAIL_IF_MACRO(!__PHYSFS_verifySecurity(h, fname), NULL, NULL);

Expand All @@ -1067,17 +1065,13 @@ static PHYSFS_file *doOpenWrite(const char *fname, int appending)

rc = (appending) ? f->openAppend(h, fname) : f->openWrite(h, fname);
if (rc == NULL)
{
free(list);
free(retval);
retval = NULL;
} /* if */
else
{
retval->opaque = (void *) rc;
list->handle = retval;
list->handle.opaque = (void *) rc;
list->next = openWriteList;
openWriteList = list;
retval = &(list->handle);
} /* else */

return(retval);
Expand All @@ -1098,19 +1092,13 @@ PHYSFS_file *PHYSFS_openAppend(const char *filename)

PHYSFS_file *PHYSFS_openRead(const char *fname)
{
PHYSFS_file *retval;
PHYSFS_file *retval = NULL;
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));
if (!list)
{
free(retval);
BAIL_IF_MACRO(1, ERR_OUT_OF_MEMORY, NULL);
} /* if */
BAIL_IF_MACRO(!list, ERR_OUT_OF_MEMORY, NULL);

for (i = searchPath; i != NULL; i = i->next)
{
Expand All @@ -1124,57 +1112,66 @@ PHYSFS_file *PHYSFS_openRead(const char *fname)
} /* for */

if (rc == NULL)
{
free(list);
free(retval);
retval = NULL;
} /* if */
else
{
retval->opaque = (void *) rc;
list->handle = retval;
list->handle.opaque = (void *) rc;
list->next = openReadList;
openReadList = list;
retval = &(list->handle);
} /* else */

return(retval);
} /* PHYSFS_openRead */


int PHYSFS_close(PHYSFS_file *handle)
static int closeHandleInOpenList(FileHandleList **list, PHYSFS_file *handle)
{
FileHandle *h = (FileHandle *) handle->opaque;
FileHandleList *prev = NULL;
FileHandleList *i;
FileHandleList *prev;
FileHandleList **_lists[] = { &openWriteList, &openReadList, NULL };
FileHandleList ***lists = _lists; /* gay. */
int rc;

while (lists != NULL)
for (i = *list; i != NULL; i = i->next)
{
for (i = *(*lists), prev = NULL; i != NULL; prev = i, i = i->next)
if (&i->handle == handle) /* handle is in this list? */
{
if (i->handle == handle)
{
rc = h->funcs->fileClose(h);
if (!rc)
return(0);

if (prev == NULL)
*(*lists) = i->next;
else
prev->next = i->next;

free(handle);
free(i);
return(1);
} /* if */
} /* for */
lists++;
} /* while */
rc = h->funcs->fileClose(h);
if (!rc)
return(-1);

if (prev == NULL)
*list = i->next;
else
prev->next = i->next;

free(i);
return(1);
} /* if */
prev = i;
} /* for */

__PHYSFS_setError(ERR_NOT_A_HANDLE);
return(0);
} /* closeHandleInOpenList */


int PHYSFS_close(PHYSFS_file *handle)
{
int rc;

/* -1 == close failure. 0 == not found. 1 == success. */
rc = closeHandleInOpenList(&openReadList, handle);
BAIL_IF_MACRO(rc == -1, NULL, 0);
if (!rc)
{
rc = closeHandleInOpenList(&openWriteList, handle);
BAIL_IF_MACRO(rc == -1, NULL, 0);
} /* if */

if (!rc)
__PHYSFS_setError(ERR_NOT_A_HANDLE);

return(rc);
} /* PHYSFS_close */


Expand Down

0 comments on commit 096d57e

Please sign in to comment.