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