Imported Upstream version 0.6.28
[platform/upstream/libsolv.git] / src / poolvendor.c
index 35ffb50..adb84d8 100644 (file)
@@ -5,15 +5,14 @@
  * for further information
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
 /* we need FNM_CASEFOLD */
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <fnmatch.h>
 
 #include "pool.h"
 #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);
+}