]>
Commit | Line | Data |
---|---|---|
9700d184 | 1 | --- ./lib/depends.c.org Sat Jun 16 14:14:11 2001 |
2 | +++ ./lib/depends.c Sat Jun 16 14:19:12 2001 | |
3 | @@ -335,18 +335,19 @@ | |
4 | for (dirNum = 0; dirNum < numDirs; dirNum++) { | |
5 | dirNeedle.dirName = (char *) dirNames[dirNum]; | |
6 | dirNeedle.dirNameLen = strlen(dirNames[dirNum]); | |
7 | - dirMatch = bsearch(&dirNeedle, al->dirs, origNumDirs, | |
8 | + dirMatch = bsearchnl(&dirNeedle, al->dirs, origNumDirs, | |
9 | sizeof(dirNeedle), dirInfoCompare); | |
10 | - if (dirMatch) { | |
11 | - dirMapping[dirNum] = dirMatch - al->dirs; | |
12 | - } else { | |
13 | - dirMapping[dirNum] = al->numDirs; | |
14 | - al->dirs[al->numDirs].dirName = xstrdup(dirNames[dirNum]); | |
15 | - al->dirs[al->numDirs].dirNameLen = strlen(dirNames[dirNum]); | |
16 | - al->dirs[al->numDirs].files = NULL; | |
17 | - al->dirs[al->numDirs].numFiles = 0; | |
18 | + if (dirInfoCompare(dirMatch, &dirNeedle)!=0) { | |
19 | + memmove(dirMatch+1, dirMatch, | |
20 | + ((al->dirs+al->numDirs) - dirMatch)*sizeof(*al->dirs)); | |
21 | + dirMatch->dirName = xstrdup(dirNames[dirNum]); | |
22 | + dirMatch->dirNameLen = strlen(dirNames[dirNum]); | |
23 | + dirMatch->files = NULL; | |
24 | + dirMatch->numFiles = 0; | |
25 | al->numDirs++; | |
26 | } | |
27 | + dirMapping[dirNum] = dirMatch - al->dirs; | |
28 | + | |
29 | } | |
30 | ||
31 | free(dirNames); | |
32 | @@ -374,9 +375,6 @@ | |
33 | ||
34 | first = last + 1; | |
35 | } | |
36 | - | |
37 | - if (origNumDirs + al->numDirs) | |
38 | - qsort(al->dirs, al->numDirs, sizeof(dirNeedle), dirInfoCompare); | |
39 | ||
40 | } | |
41 | ||
42 | --- ./lib/misc.c.org Sat Jun 16 14:14:12 2001 | |
43 | +++ ./lib/misc.c Sat Jun 16 14:14:30 2001 | |
44 | @@ -869,3 +869,38 @@ | |
45 | &pEVR, 1); | |
46 | } | |
47 | } | |
48 | + | |
49 | +/* Based on glibc's function bsearch. | |
50 | + * Modified by Pawel Kolodziej <pawelk@pld.org.pl> | |
51 | + * Perform a binary search for KEY in BASE which has NMEMB elements | |
52 | + * of SIZE bytes each. The comparisons are done by (*COMPAR)(). | |
53 | + * Return element not less then KEY. Never return NULL | |
54 | + */ | |
55 | +void * | |
56 | +bsearchnl (const void *key, const void *base, size_t nmemb, size_t size, | |
57 | + int (*compar) (const void *, const void *)) | |
58 | +{ | |
59 | + size_t l, u, idx; | |
60 | + const void *p; | |
61 | + int comparison; | |
62 | + | |
63 | + l = 0; | |
64 | + u = nmemb; | |
65 | + while (l < u) | |
66 | + { | |
67 | + idx = (l + u) / 2; | |
68 | + p = (void *) (((const char *) base) + (idx * size)); | |
69 | + comparison = (*compar) (key, p); | |
70 | + if (comparison < 0) | |
71 | + u = idx; | |
72 | + else if (comparison > 0) | |
73 | + l = idx + 1; | |
74 | + else | |
75 | + return (void *) p; | |
76 | + } | |
77 | + if(l > nmemb-1) | |
78 | + l=nmemb-1; | |
79 | + p = (void *) (((const char *) base) + (l * size)); | |
80 | + return (void *)p; | |
81 | +} | |
82 | + | |
83 | --- ./lib/misc.h.org Sat Jun 16 14:14:12 2001 | |
84 | +++ ./lib/misc.h Sat Jun 16 14:14:30 2001 | |
85 | @@ -102,6 +102,12 @@ | |
86 | */ | |
87 | void providePackageNVR(Header h); | |
88 | ||
89 | + | |
90 | +void * | |
91 | +bsearchnl (const void *key, const void *base, size_t nmemb, size_t size, | |
92 | + int (*compar) (const void *, const void *)); | |
93 | + | |
94 | + | |
95 | #ifdef __cplusplus | |
96 | } | |
97 | #endif |