r770 - trunk
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sun Sep 18 18:27:05 EDT 2005
Author: icculus
Date: 2005-09-18 18:27:05 -0400 (Sun, 18 Sep 2005)
New Revision: 770
Modified:
trunk/CHANGELOG
trunk/physfs.c
Log:
Don't leave internal structures temporarily modified before calling an
application callback, so that state is sane if they call into the API
from inside the callback.
Modified: trunk/CHANGELOG
===================================================================
--- trunk/CHANGELOG 2005-09-18 21:44:42 UTC (rev 769)
+++ trunk/CHANGELOG 2005-09-18 22:27:05 UTC (rev 770)
@@ -5,7 +5,9 @@
09182005 - API BREAKAGE: PHYSFS_enumerateFilesCallback() now passes the
original directory name back to the app in the callback. This
API was only in 1.1.0, and wasn't promised to be stable at this
- point. Please update your apps.
+ point. Please update your apps! Cleaned out a FIXME in file
+ enumeration that would confuse the library under certain
+ circumstances.
09092005 - Some tweaks to PHYSFS_Allocator. Apparently configure.in doesn't
work like I thought for version bumps, so it thinks 1.1.0 isn't
binary compatible with 1.0...fixed, I think.
Modified: trunk/physfs.c
===================================================================
--- trunk/physfs.c 2005-09-18 21:44:42 UTC (rev 769)
+++ trunk/physfs.c 2005-09-18 22:27:05 UTC (rev 770)
@@ -1545,6 +1545,25 @@
} /* PHYSFS_enumerateFiles */
+/*
+ * Broke out to seperate function so we can use alloca() gratuitously.
+ */
+static void enumerateFromMountPoint(DirHandle *i, const char *arcfname,
+ PHYSFS_EnumFilesCallback callback,
+ const char *_fname, void *data)
+{
+ size_t len = strlen(arcfname);
+ char *mountPoint = (char *) alloca(strlen(i->mountPoint) + 1);
+ strcpy(mountPoint, i->mountPoint);
+ char *ptr = mountPoint + ((len) ? len + 1 : 0);
+ char *end = strchr(ptr, '/');
+ assert(end); /* should always find a terminating '/'. */
+ *end = '\0';
+ callback(data, _fname, ptr);
+} /* enumerateFromMountPoint */
+
+
+
void PHYSFS_enumerateFilesCallback(const char *_fname,
PHYSFS_EnumFilesCallback callback,
void *data)
@@ -1564,15 +1583,7 @@
{
char *arcfname = fname;
if (partOfMountPoint(i, arcfname))
- {
- size_t len = strlen(arcfname);
- char *ptr = i->mountPoint + ((len) ? len + 1 : 0);
- char *end = strchr(ptr, '/');
- assert(end); /* should always find a terminating '/'. */
- *end = '\0'; /* !!! FIXME: not safe in a callback... */
- callback(data, _fname, ptr);
- *end = '/'; /* !!! FIXME: not safe in a callback... */
- } /* if */
+ enumerateFromMountPoint(i, arcfname, callback, _fname, data);
else if (verifyPath(i, &arcfname, 0))
{
More information about the physfs-commits
mailing list