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