- delete fixed vendor classes, add pool_setvendorclasses() method
authorMichael Schroeder <mls@suse.de>
Wed, 23 Mar 2011 14:55:01 +0000 (15:55 +0100)
committerMichael Schroeder <mls@suse.de>
Wed, 23 Mar 2011 14:55:39 +0000 (15:55 +0100)
src/pool.c
src/pool.h
src/poolvendor.c
src/poolvendor.h

index a17f491..880d0dd 100644 (file)
@@ -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]);
index fc08d2f..05013d5 100644 (file)
@@ -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)));
 
index 35ffb50..baaab19 100644 (file)
 #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);
+}
+
index ad3ee47..2025e34 100644 (file)
@@ -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 */