2 * Copyright (c) 2007, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
8 /* we need FNM_CASEFOLD */
20 #include "poolvendor.h"
24 * const char *vendorsclasses[] = {
25 * "!openSUSE Build Service*",
30 * "Silicon Graphics*",
31 * "Jpackage Project*",
32 * "ATI Technologies Inc.*",
39 /* allows for 32 different vendor classes */
41 Id pool_vendor2mask(Pool *pool, Id vendor)
48 if (vendor == 0 || !pool->vendorclasses)
50 for (i = 0; i < pool->vendormap.count; i += 2)
51 if (pool->vendormap.elements[i] == vendor)
52 return pool->vendormap.elements[i + 1];
53 vstr = pool_id2str(pool, vendor);
56 for (v = pool->vendorclasses; ; )
59 if (vs == 0) /* end of block? */
65 break; /* sorry, out of bits */
66 m <<= 1; /* next vendor equivalence class */
68 if (fnmatch(*vs == '!' ? vs + 1 : vs, vstr, FNM_CASEFOLD) == 0)
72 while (*v) /* forward to next block */
76 queue_push(&pool->vendormap, vendor);
77 queue_push(&pool->vendormap, mask);
82 pool_setvendorclasses(Pool *pool, const char **vendorclasses)
87 if (pool->vendorclasses)
89 for (v = pool->vendorclasses; v[0] || v[1]; v++)
90 solv_free((void *)*v);
91 pool->vendorclasses = solv_free((void *)pool->vendorclasses);
93 if (!vendorclasses || !vendorclasses[0])
95 for (v = vendorclasses; v[0] || v[1]; v++)
97 pool->vendorclasses = solv_calloc(v - vendorclasses + 2, sizeof(const char *));
98 for (v = vendorclasses, i = 0; v[0] || v[1]; v++, i++)
99 pool->vendorclasses[i] = *v ? solv_strdup(*v) : 0;
100 pool->vendorclasses[i++] = 0;
101 pool->vendorclasses[i] = 0;
102 queue_empty(&pool->vendormap);
106 pool_addvendorclass(Pool *pool, const char **vendorclass)
110 if (!vendorclass || !vendorclass[0])
112 for (j = 1; vendorclass[j]; j++)
115 if (pool->vendorclasses)
117 for (i = 0; pool->vendorclasses[i] || pool->vendorclasses[i + 1]; i++)
122 pool->vendorclasses = solv_realloc2((void *)pool->vendorclasses, i + j + 2, sizeof(const char *));
123 for (j = 0; vendorclass[j]; j++)
124 pool->vendorclasses[i++] = solv_strdup(vendorclass[j]);
125 pool->vendorclasses[i++] = 0;
126 pool->vendorclasses[i] = 0;
127 queue_empty(&pool->vendormap);