]>
Commit | Line | Data |
---|---|---|
1 | --- rpm-4.0.4/lib/depends.c~org Wed Aug 1 22:14:31 2001 | |
2 | +++ rpm-4.0.4/lib/depends.c Wed Aug 1 22:15:57 2001 | |
3 | @@ -335,18 +335,24 @@ | |
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, al->numDirs, | |
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 (dirMatch==NULL || dirInfoCompare(dirMatch, &dirNeedle)!=0) { | |
19 | + if(dirMatch==NULL) | |
20 | + dirMatch=al->dirs+al->numDirs; | |
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 | + for(i=0;i<dirNum;i++) | |
29 | + if(dirMapping[i] >= dirMatch - al->dirs) | |
30 | + dirMapping[i]++; | |
31 | } | |
32 | + dirMapping[dirNum] = dirMatch - al->dirs; | |
33 | + | |
34 | } | |
35 | ||
36 | free(dirNames); | |
37 | @@ -374,9 +380,6 @@ | |
38 | ||
39 | first = last + 1; | |
40 | } | |
41 | - | |
42 | - if (origNumDirs + al->numDirs) | |
43 | - qsort(al->dirs, al->numDirs, sizeof(dirNeedle), dirInfoCompare); | |
44 | ||
45 | } | |
46 | ||
47 | --- ./lib/misc.c~org Wed Aug 1 22:14:31 2001 | |
48 | +++ ./lib/misc.c Wed Aug 1 22:13:33 2001 | |
49 | @@ -869,3 +869,39 @@ | |
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)(). | |
58 | + * Return element not less then KEY. Return NULL if all elements are | |
59 | + * less then KEY | |
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 | + } | |
83 | + if(nmemb == 0 || l > nmemb-1) | |
84 | + return NULL; | |
85 | + p = (void *) (((const char *) base) + (l * size)); | |
86 | + return (void *)p; | |
87 | +} | |
88 | + | |
89 | --- ./lib/misc.h~org Wed Aug 1 22:14:31 2001 | |
90 | +++ ./lib/misc.h Wed Aug 1 22:13:33 2001 | |
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 |