--- ./lib/depends.c.org Sat Jun 16 14:14:11 2001 +++ ./lib/depends.c Sat Jun 16 14:19:12 2001 @@ -335,18 +335,19 @@ for (dirNum = 0; dirNum < numDirs; dirNum++) { dirNeedle.dirName = (char *) dirNames[dirNum]; dirNeedle.dirNameLen = strlen(dirNames[dirNum]); - dirMatch = bsearch(&dirNeedle, al->dirs, origNumDirs, + dirMatch = bsearchnl(&dirNeedle, al->dirs, origNumDirs, sizeof(dirNeedle), dirInfoCompare); - if (dirMatch) { - dirMapping[dirNum] = dirMatch - al->dirs; - } else { - dirMapping[dirNum] = al->numDirs; - al->dirs[al->numDirs].dirName = xstrdup(dirNames[dirNum]); - al->dirs[al->numDirs].dirNameLen = strlen(dirNames[dirNum]); - al->dirs[al->numDirs].files = NULL; - al->dirs[al->numDirs].numFiles = 0; + if (dirInfoCompare(dirMatch, &dirNeedle)!=0) { + memmove(dirMatch+1, dirMatch, + ((al->dirs+al->numDirs) - dirMatch)*sizeof(*al->dirs)); + dirMatch->dirName = xstrdup(dirNames[dirNum]); + dirMatch->dirNameLen = strlen(dirNames[dirNum]); + dirMatch->files = NULL; + dirMatch->numFiles = 0; al->numDirs++; } + dirMapping[dirNum] = dirMatch - al->dirs; + } free(dirNames); @@ -374,9 +375,6 @@ first = last + 1; } - - if (origNumDirs + al->numDirs) - qsort(al->dirs, al->numDirs, sizeof(dirNeedle), dirInfoCompare); } --- ./lib/misc.c.org Sat Jun 16 14:14:12 2001 +++ ./lib/misc.c Sat Jun 16 14:14:30 2001 @@ -869,3 +869,38 @@ &pEVR, 1); } } + +/* Based on glibc's function bsearch. + * Modified by Pawel Kolodziej + * Perform a binary search for KEY in BASE which has NMEMB elements + * of SIZE bytes each. The comparisons are done by (*COMPAR)(). + * Return element not less then KEY. Never return NULL + */ +void * +bsearchnl (const void *key, const void *base, size_t nmemb, size_t size, + int (*compar) (const void *, const void *)) +{ + size_t l, u, idx; + const void *p; + int comparison; + + l = 0; + u = nmemb; + while (l < u) + { + idx = (l + u) / 2; + p = (void *) (((const char *) base) + (idx * size)); + comparison = (*compar) (key, p); + if (comparison < 0) + u = idx; + else if (comparison > 0) + l = idx + 1; + else + return (void *) p; + } + if(l > nmemb-1) + l=nmemb-1; + p = (void *) (((const char *) base) + (l * size)); + return (void *)p; +} + --- ./lib/misc.h.org Sat Jun 16 14:14:12 2001 +++ ./lib/misc.h Sat Jun 16 14:14:30 2001 @@ -102,6 +102,12 @@ */ void providePackageNVR(Header h); + +void * +bsearchnl (const void *key, const void *base, size_t nmemb, size_t size, + int (*compar) (const void *, const void *)); + + #ifdef __cplusplus } #endif