X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpoolvendor.c;h=adb84d825fed3adcc0f9695dc7a3333b87a42615;hb=e1659dc4ce74d3c47f465103951dafff8fc0cf9f;hp=35ffb5007fdfc1619b2766ee72944cf7b30d9097;hpb=6f7d6f2fd07b10ada507d60e81248deccbbcec34;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/poolvendor.c b/src/poolvendor.c index 35ffb50..adb84d8 100644 --- a/src/poolvendor.c +++ b/src/poolvendor.c @@ -5,15 +5,14 @@ * for further information */ -#include -#include -#include - /* we need FNM_CASEFOLD */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#include +#include +#include #include #include "pool.h" @@ -21,19 +20,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,15 +45,15 @@ 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) return pool->vendormap.elements[i + 1]; - vstr = id2str(pool, vendor); + vstr = pool_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 +62,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 +77,52 @@ 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++) + solv_free((void *)*v); + pool->vendorclasses = solv_free((void *)pool->vendorclasses); + } + if (!vendorclasses || !vendorclasses[0]) + return; + for (v = vendorclasses; v[0] || v[1]; v++) + ; + pool->vendorclasses = solv_calloc(v - vendorclasses + 2, sizeof(const char *)); + for (v = vendorclasses, i = 0; v[0] || v[1]; v++, i++) + pool->vendorclasses[i] = *v ? solv_strdup(*v) : 0; + pool->vendorclasses[i++] = 0; + pool->vendorclasses[i] = 0; + queue_empty(&pool->vendormap); +} + +void +pool_addvendorclass(Pool *pool, const char **vendorclass) +{ + int i, j; + + if (!vendorclass || !vendorclass[0]) + return; + for (j = 1; vendorclass[j]; j++) + ; + i = 0; + if (pool->vendorclasses) + { + for (i = 0; pool->vendorclasses[i] || pool->vendorclasses[i + 1]; i++) + ; + if (i) + i++; + } + pool->vendorclasses = solv_realloc2((void *)pool->vendorclasses, i + j + 2, sizeof(const char *)); + for (j = 0; vendorclass[j]; j++) + pool->vendorclasses[i++] = solv_strdup(vendorclass[j]); + pool->vendorclasses[i++] = 0; + pool->vendorclasses[i] = 0; + queue_empty(&pool->vendormap); +}