10 #define _RPMDS_INTERNAL
128 availableIndex ai = &al->
index;
141 static int alGetSize(
const rpmal al)
144 return (al != NULL ? al->
size : 0);
153 return ((
alNum)pkgKey);
162 return ((
alKey)pkgNum);
174 static availablePackage alGetPkg(
const rpmal al,
179 availablePackage alp = NULL;
181 if (al != NULL && pkgNum >= 0 && pkgNum < alGetSize(al)) {
182 if (al->
list != NULL)
183 alp = al->
list + pkgNum;
192 availableIndex ai = &al->
index;
209 availablePackage alp;
216 if ((alp = al->
list) != NULL)
217 for (i = 0; i < al->
size; i++, alp++) {
222 if ((die = al->
dirs) != NULL)
223 for (i = 0; i < al->
numDirs; i++, die++) {
247 const dirInfo a = (
const dirInfo) one;
248 const dirInfo b = (
const dirInfo) two;
286 fprintf(stderr,
"\t\tstrcmp(%p:%p, %p:%p)", a, a->
baseName, b, b->
baseName);
288 fprintf(stderr,
" a %s", a->
baseName);
290 fprintf(stderr,
" b %s", a->
baseName);
291 fprintf(stderr,
"\n");
302 availablePackage alp;
305 if (al == NULL || al->
list == NULL)
308 alp = al->
list + pkgNum;
312 fprintf(stderr,
"*** del %p[%d]\n", al->
list, pkgNum);
316 if ((fi = alp->
fi) != NULL)
321 memset(
alloca(
sizeof(*dieNeedle)), 0,
sizeof(*dieNeedle));
328 if (al->
dirs != NULL)
329 for (dx =
rpmfiDC(fi) - 1; dx >= 0; dx--)
339 ? strlen(dieNeedle->
dirName) : 0);
349 fprintf(stderr,
"--- die[%5d] %p [%3d] %s\n", (
int)(die - al->
dirs), die, die->
dirNameLen, die->
dirName);
353 fie = die->
files + last - 1;
354 for (i = last - 1; i >= 0; i--, fie--) {
355 if (fie->
pkgNum != pkgNum)
359 if (i < die->numFiles) {
362 fprintf(stderr,
"\t%p[%3d] memmove(%p:%p,%p:%p,0x%x) %s <- %s\n", die->
files, die->
numFiles, fie, fie->
baseName, fie+1, (fie+1)->
baseName, (
unsigned) ((die->
numFiles - i) *
sizeof(*fie)), fie->
baseName, (fie+1)->baseName);
366 memmove(fie, fie+1, (die->
numFiles - i) *
sizeof(*fie));
371 fprintf(stderr,
"\t%p[%3d] memset(%p,0,0x%x) %p [%3d] %s\n", die->
files, die->
numFiles, die->
files + die->
numFiles, (
unsigned)
sizeof(*fie), fie->
baseName, fie->
baseNameLen, fie->
baseName);
388 fprintf(stderr,
" die[%5d] memmove(%p,%p,0x%x)\n", (
int)(die - al->
dirs), die, die+1, (
unsigned)((al->
numDirs - (die - al->
dirs)) *
sizeof(*die)));
392 memmove(die, die+1, (al->
numDirs - (die - al->
dirs)) *
sizeof(*die));
398 fprintf(stderr,
" die[%5d] memset(%p,0,0x%x)\n", al->
numDirs, al->
dirs + al->
numDirs, (
unsigned)
sizeof(*die));
403 if (origNumDirs > al->
numDirs) {
415 memset(alp, 0,
sizeof(*alp));
426 availablePackage alp;
434 if (pkgNum >= 0 && pkgNum < al->
size) {
444 if (al->
list == NULL)
447 alp = al->
list + pkgNum;
454 fprintf(stderr,
"*** add %p[%d] 0x%x\n", al->
list, pkgNum, tscolor);
464 memset(
alloca(
sizeof(*dieNeedle)), 0,
sizeof(*dieNeedle));
468 int * dirMapping =
alloca(
sizeof(*dirMapping) * dc);
469 int * dirUnique =
alloca(
sizeof(*dirUnique) * dc);
483 for (dx = 0; dx < dc; dx++) {
488 for (i = 0; i < dx; i++) {
492 if (iDN != NULL && !strcmp(DN, iDN))
499 for (dx = 0; dx < dc; dx++) {
502 if (dirUnique[dx] < dx) {
503 dirMapping[dx] = dirMapping[dirUnique[dx]];
513 #if defined(__ia64__)
515 #define DNPREFIX "/emul/ia32-linux"
516 if (!strncmp(DN, DNPREFIX,
sizeof(DNPREFIX)-1))
517 DN +=
sizeof(DNPREFIX)-1;
524 ? strlen(dieNeedle->
dirName) : 0);
525 die = bsearch(dieNeedle, al->
dirs, origNumDirs,
528 dirMapping[dx] = die - al->
dirs;
532 if (dieNeedle->
dirName != NULL)
546 for (first =
rpmfiNext(fi); first >= 0;) {
556 if (next < 0) next =
rpmfiFC(fi);
558 die = al->
dirs + dirMapping[dx];
566 fprintf(stderr,
" die[%5d] %p->files [%p[%d],%p) -> [%p[%d],%p)\n", dirMapping[dx], die,
568 fie, (next - first), fie + (next - first));
573 while ((first =
rpmfiNext(fi)) >= 0 && first < next) {
593 if (origNumDirs != al->
numDirs)
600 assert(((
alNum)(alp - al->
list)) == pkgNum);
611 static int indexcmp(
const void * one,
const void * two)
632 availableIndex ai = &al->
index;
633 availableIndexEntry aie;
636 if (provides == NULL || pkgNum < 0 || pkgNum >= al->
size)
638 if (ai->
index == NULL || ai->
k < 0 || ai->
k >= ai->
size)
644 if ((Name = provides->N[provides->i]) == NULL)
649 if (tscolor && dscolor && !(tscolor & dscolor))
663 assert(ix < 0x10000);
666 aie->
type = IET_PROVIDES;
673 availablePackage alp;
676 if (al == NULL || al->
list == NULL)
return;
680 for (i = 0; i < al->
size; i++) {
685 if (ai->
size == 0)
return;
689 for (i = 0; i < al->
size; i++) {
706 const char * baseName;
708 memset(
alloca(
sizeof(*dieNeedle)), 0,
sizeof(*dieNeedle));
710 fileIndexEntry fieNeedle =
711 memset(
alloca(
sizeof(*fieNeedle)), 0,
sizeof(*fieNeedle));
713 availablePackage alp;
715 const char * fileName;
719 if (al == NULL || (fileName =
rpmdsN(ds)) == NULL || *fileName !=
'/')
727 dirName = t =
xstrdup(fileName);
728 if ((t = strrchr(t,
'/')) != NULL) {
734 dieNeedle->
dirName = (
char *) dirName;
745 if ((baseName = strrchr(fileName,
'/')) == NULL)
750 for (found = 0, ret = NULL;
757 fprintf(stderr,
"==> die %p %s\n", die, (die->
dirName ? die->
dirName :
"(nil)"));
771 fprintf(stderr,
"==> fie %p %s\n", fie, (fie->
baseName ? fie->
baseName :
"(nil)"));
779 if (tscolor && ficolor && !(tscolor & ficolor))
784 ret =
xrealloc(ret, (found+2) *
sizeof(*ret));
786 ret[found] = alp->
key;
794 dirName =
_free(dirName);
804 availableIndexEntry needle;
805 availableIndexEntry match;
809 availablePackage alp;
814 if (al == NULL || ds == NULL || (KName =
rpmdsN(ds)) == NULL)
820 if (ret != NULL && *ret != NULL)
830 needle = memset(
alloca(
sizeof(*needle)), 0,
sizeof(*needle));
832 needle->
entry = KName;
844 if (al->
list != NULL)
845 for (ret = NULL, found = 0;
853 switch (match->
type) {
868 ret =
xrealloc(ret, (found + 2) *
sizeof(*ret));
870 ret[found] = alp->
key;