Fixed version of locateInStringList() from Matze Braun.
This commit is contained in:
parent
c28540fe89
commit
b7a3aeaccd
|
@ -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
|
||||||
|
|
3
CREDITS
3
CREDITS
|
@ -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:
|
||||||
|
|
40
physfs.c
40
physfs.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue