From: Michael Schroeder Date: Wed, 23 Mar 2011 14:55:01 +0000 (+0100) Subject: - delete fixed vendor classes, add pool_setvendorclasses() method X-Git-Tag: BASE-SuSE-Code-12_1-Branch~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=18579bb4c39283c45f3a323652d763097f0186de;p=thirdparty%2Flibsolv.git - delete fixed vendor classes, add pool_setvendorclasses() method --- diff --git a/src/pool.c b/src/pool.c index a17f491a..880d0dd3 100644 --- a/src/pool.c +++ b/src/pool.c @@ -87,6 +87,7 @@ pool_free(Pool *pool) sat_free(pool->solvables); stringpool_free(&pool->ss); sat_free(pool->rels); + pool_setvendorclasses(pool, 0); queue_free(&pool->vendormap); for (i = 0; i < POOL_TMPSPACEBUF; i++) sat_free(pool->tmpspacebuf[i]); diff --git a/src/pool.h b/src/pool.h index fc08d2fe..05013d56 100644 --- a/src/pool.h +++ b/src/pool.h @@ -44,13 +44,13 @@ struct _Repodata; struct _Repokey; struct _KeyValue; -typedef struct _Repopos { +typedef struct _Datapos { struct _Repo *repo; Id solvid; Id repodataid; Id schema; Id dp; -} Repopos; +} Datapos; struct _Pool { void *appdata; /* application private pointer */ @@ -92,6 +92,7 @@ struct _Pool { Id lastarch; /* last valid entry in id2arch/id2color */ Queue vendormap; /* map vendor to vendorclasses mask */ + const char **vendorclasses; /* vendor equivalence classes */ /* providers data, as two-step indirect list * whatprovides[Id] -> Offset into whatprovidesdata for name @@ -126,7 +127,7 @@ struct _Pool { void *loadcallbackdata; /* search position */ - Repopos pos; + Datapos pos; }; #ifdef MULTI_SEMANTICS @@ -190,6 +191,7 @@ extern void pool_setdebuglevel(Pool *pool, int level); #ifdef MULTI_SEMANTICS extern void pool_setdisttype(Pool *pool, int disttype); #endif +extern void pool_setvendorclasses(Pool *pool, const char **vendorclasses); extern void pool_debug(Pool *pool, int type, const char *format, ...) __attribute__((format(printf, 3, 4))); diff --git a/src/poolvendor.c b/src/poolvendor.c index 35ffb500..baaab19e 100644 --- a/src/poolvendor.c +++ b/src/poolvendor.c @@ -21,19 +21,23 @@ #include "poolvendor.h" #include "util.h" -const char *vendors[] = { - "!openSUSE Build Service*", - "SUSE*", - "openSUSE*", - "SGI*", - "Novell*", - "Silicon Graphics*", - "Jpackage Project*", - "ATI Technologies Inc.*", - "Nvidia*", - 0, - 0, -}; +/* + * const char *vendorsclasses[] = { + * "!openSUSE Build Service*", + * "SUSE*", + * "openSUSE*", + * "SGI*", + * "Novell*", + * "Silicon Graphics*", + * "Jpackage Project*", + * "ATI Technologies Inc.*", + * "Nvidia*", + * 0, + * 0, + * }; + */ + +/* allows for 32 different vendor classes */ Id pool_vendor2mask(Pool *pool, Id vendor) { @@ -42,7 +46,7 @@ Id pool_vendor2mask(Pool *pool, Id vendor) Id mask, m; const char **v, *vs; - if (vendor == 0) + if (vendor == 0 || !pool->vendorclasses) return 0; for (i = 0; i < pool->vendormap.count; i += 2) if (pool->vendormap.elements[i] == vendor) @@ -50,7 +54,7 @@ Id pool_vendor2mask(Pool *pool, Id vendor) vstr = id2str(pool, vendor); m = 1; mask = 0; - for (v = vendors; ; v++) + for (v = pool->vendorclasses; ; v++) { vs = *v; if (vs == 0) /* end of block? */ @@ -59,7 +63,7 @@ Id pool_vendor2mask(Pool *pool, Id vendor) if (*v == 0) break; if (m == (1 << 31)) - break; + break; /* sorry, out of bits */ m <<= 1; /* next vendor equivalence class */ } if (fnmatch(*vs == '!' ? vs + 1 : vs, vstr, FNM_CASEFOLD) == 0) @@ -74,3 +78,28 @@ Id pool_vendor2mask(Pool *pool, Id vendor) queue_push(&pool->vendormap, mask); return mask; } + +void +pool_setvendorclasses(Pool *pool, const char **vendorclasses) +{ + int i; + const char **v; + + if (pool->vendorclasses) + { + for (v = pool->vendorclasses; v[0] || v[1]; v++) + sat_free((void *)*v); + pool->vendorclasses = sat_free(pool->vendorclasses); + } + if (!vendorclasses || !vendorclasses[0]) + return; + for (v = vendorclasses; v[0] || v[1]; v++) + ; + pool->vendorclasses = sat_calloc(v - vendorclasses + 2, sizeof(const char *)); + for (v = vendorclasses, i = 0; v[0] || v[1]; v++, i++) + pool->vendorclasses[i] = *v ? strdup(*v) : 0; + pool->vendorclasses[i++] = 0; + pool->vendorclasses[i] = 0; + queue_empty(&pool->vendormap); +} + diff --git a/src/poolvendor.h b/src/poolvendor.h index ad3ee47f..2025e343 100644 --- a/src/poolvendor.h +++ b/src/poolvendor.h @@ -11,5 +11,6 @@ #include "pool.h" Id pool_vendor2mask(Pool *pool, Id vendor); +void pool_setvendorclasses(Pool *pool, const char **vendorclasses); #endif /* SATSOLVER_POOLVENDOR_H */