X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fpoolvendor.c;h=83ee15bdcbebb15f8e54f59e5555e569040036de;hb=447441ca05a1c100689afab5281f6bae32d97c83;hp=b818445385f66c00d30b31c6ab12e6fbe1ccf255;hpb=18871f075d0aab1aa86ce6cdc6aff5ce77a27cf9;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/poolvendor.c b/src/poolvendor.c index b818445..83ee15b 100644 --- a/src/poolvendor.c +++ b/src/poolvendor.c @@ -1,8 +1,18 @@ +/* + * Copyright (c) 2007, Novell Inc. + * + * This program is licensed under the BSD license, read LICENSE.BSD + * for further information + */ + +/* we need FNM_CASEFOLD */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include #include #include - -#define _GNU_SOURCE 1 #include #include "pool.h" @@ -10,49 +20,56 @@ #include "poolvendor.h" #include "util.h" -const char *vendors[] = { - "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) { const char *vstr; int i; Id mask, m; - const char **v; + 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; ; ) { - if (*v == 0) + vs = *v++; + if (vs == 0) /* end of block? */ { - v++; - if (*v == 0) + vs = *v++; + if (vs == 0) break; if (m == (1 << 31)) - break; - m <<= 1; + break; /* sorry, out of bits */ + m <<= 1; /* next vendor equivalence class */ } - if (fnmatch(*v, vstr, FNM_CASEFOLD) == 0) + if (fnmatch(*vs == '!' ? vs + 1 : vs, vstr, FNM_CASEFOLD) == 0) { - mask |= m; - while (v[1]) + if (*vs != '!') + mask |= m; + while (*v) /* forward to next block */ v++; } } @@ -60,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); +}