Fixed version of locateInStringList() from Matze Braun.

This commit is contained in:
Ryan C. Gordon 2005-10-12 22:03:28 +00:00
parent c28540fe89
commit b7a3aeaccd
3 changed files with 18 additions and 26 deletions

View File

@ -2,6 +2,7 @@
* CHANGELOG. * CHANGELOG.
*/ */
10122005 - Fixed locateInStringList() in physfs.c (thanks, Matze!).
09192005 - Make unix mutexes recursive above pthread layer...fixes deadlock on 09192005 - Make unix mutexes recursive above pthread layer...fixes deadlock on
MacOS X, for now. MacOS X, for now.
09182005 - API BREAKAGE: PHYSFS_enumerateFilesCallback() now passes the 09182005 - API BREAKAGE: PHYSFS_enumerateFilesCallback() now passes the

View File

@ -84,7 +84,8 @@ MacOS Classic fixes,
MPW support: MPW support:
Chris Taylor Chris Taylor
Mingw support: Mingw support,
General bug fixes:
Matze Braun Matze Braun
Bug fixes: Bug fixes:

View File

@ -1459,37 +1459,30 @@ static int locateInStringList(const char *str,
char **list, char **list,
PHYSFS_uint32 *pos) PHYSFS_uint32 *pos)
{ {
PHYSFS_uint32 hi = *pos - 1; PHYSFS_uint32 len = *pos;
PHYSFS_uint32 half_len;
PHYSFS_uint32 lo = 0; PHYSFS_uint32 lo = 0;
PHYSFS_uint32 i = hi >> 1; PHYSFS_uint32 middle;
int cmp; int cmp;
assert(*pos != 0); /* this doesn't work with empty lists! */ while (len > 0)
while (hi != lo)
{ {
cmp = strcmp(list[i], str); half_len = len >> 1;
middle = lo + half_len;
cmp = strcmp(list[middle], str);
if (cmp == 0) /* it's in the list already. */ if (cmp == 0) /* it's in the list already. */
return(1); return(1);
else if (cmp < 0) else if (cmp > 0)
{ len = half_len;
hi = i;
i = lo + ((hi - lo) >> 1);
} /* else if */
else else
{ {
lo = i + 1; lo = middle + 1;
i = lo + ((1 + hi - lo) >> 1); len -= half_len + 1;
} /* else */ } /* else */
} /* while */ } /* while */
/* hi == lo, check it in case it's the match... */ *pos = lo;
cmp = strcmp(list[lo], str);
if (cmp == 0)
return(1);
/* not in the list, set insertion point... */
*pos = (cmp < 0) ? lo : lo + 1;
return(0); return(0);
} /* locateInStringList */ } /* locateInStringList */
@ -1506,11 +1499,8 @@ static void enumFilesCallback(void *data, const char *origdir, const char *str)
* alphabetically... * alphabetically...
*/ */
pos = pecd->size; pos = pecd->size;
if (pos > 0) if (locateInStringList(str, pecd->list, &pos))
{ return; /* already in the list. */
if (locateInStringList(str, pecd->list, &pos))
return; /* already in the list. */
} /* if */
ptr = allocator.Realloc(pecd->list, (pecd->size + 2) * sizeof (char *)); ptr = allocator.Realloc(pecd->list, (pecd->size + 2) * sizeof (char *));
newstr = (char *) allocator.Malloc(strlen(str) + 1); newstr = (char *) allocator.Malloc(strlen(str) + 1);