]> git.pld-linux.org Git - packages/rpm.git/blob - rpm-fast-alAddPackage.patch
rpm-lfind patch replaced by rpm-alAddPackage.patch
[packages/rpm.git] / rpm-fast-alAddPackage.patch
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
This page took 0.043638 seconds and 3 git commands to generate.