- cleanup repo handlin API
[platform/upstream/libsolv.git] / tools / repo_helix.c
index 47975e1..0f2fdb2 100644 (file)
@@ -1,4 +1,10 @@
-/*  -*- mode: C; c-file-style: "gnu"; fill-column: 78 -*- */
+/*
+ * Copyright (c) 2007, Novell Inc.
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
+ */
+
 /*
  * repo_helix.c
  * 
@@ -27,6 +33,7 @@ enum state {
   STATE_SUBCHANNEL,
   STATE_PACKAGE,
   STATE_NAME,
+  STATE_VENDOR,
   STATE_HISTORY,
   STATE_UPDATE,
   STATE_EPOCH,
@@ -85,6 +92,7 @@ static struct stateswitch stateswitches[] = {
   { STATE_SUBCHANNEL,  "patch",           STATE_PACKAGE, 0 },
   { STATE_SUBCHANNEL,  "product",         STATE_PACKAGE, 0 },
   { STATE_PACKAGE,     "name",            STATE_NAME, 1 },
+  { STATE_PACKAGE,     "vendor",          STATE_VENDOR, 1 },
   { STATE_PACKAGE,     "epoch",           STATE_PEPOCH, 1 },
   { STATE_PACKAGE,     "version",         STATE_PVERSION, 1 },
   { STATE_PACKAGE,     "release",         STATE_PRELEASE, 1 },
@@ -435,7 +443,7 @@ startElement(void *userData, const char *name, const char **atts)
       if ((pd->pack & PACK_BLOCK) == 0)  /* alloc new block ? */
        {
          pool->solvables = (Solvable *)realloc(pool->solvables, (pool->nsolvables + pd->pack + PACK_BLOCK + 1) * sizeof(Solvable));
-         pd->start = pool->solvables + pd->repo->start;
+         pd->start = pool->solvables + pool->nsolvables;
           memset(pd->start + pd->pack, 0, (PACK_BLOCK + 1) * sizeof(Solvable));
        }
 
@@ -632,20 +640,15 @@ endElement(void *userData, const char *name)
          char *cflavor = strdup(flavor);       /* make pointer safe */
 
          Id npr;
-         Id pid, *pidp;
+         Id pid;
 
          /* this is either a kernel package or a kmp */
          if (s->provides)
            {
-             int prov;
+             Offset prov = s->provides;
              npr = 0;
-             for ( prov = s->provides; ( pidp = pd->repo->idarraydata + prov) != 0; ++prov)
+             while ((pid = pd->repo->idarraydata[prov++]) != 0)
                {
-                 if (!*pidp)
-                   break;
-
-                 pid = *pidp;
-
                  const char *depname = 0;
                  Reldep *prd = 0;
 
@@ -680,16 +683,10 @@ endElement(void *userData, const char *name)
 
          if (s->requires)
            {
-             int reqs;
+             Offset reqs = s->requires;
              npr = 0;
-
-             for ( reqs = s->requires; ( pidp = pd->repo->idarraydata + reqs) != 0; ++reqs)
+             while ((pid = pd->repo->idarraydata[reqs++]) != 0)
                {
-                 if (!*pidp)
-                   break;
-
-                 pid = *pidp;
-
                  const char *depname = 0;
                  Reldep *prd = 0;
 
@@ -728,6 +725,9 @@ endElement(void *userData, const char *name)
     case STATE_NAME:
       s->name = str2id(pool, pd->content, 1);
       break;
+    case STATE_VENDOR:
+      s->vendor = str2id(pool, pd->content, 1);
+      break;
     case STATE_UPDATE:                /* new version, keeping all other metadata */
       evr = evr2id(pool, pd,
                    pd->epoch   ? pd->evrspace + pd->epoch   : 0,
@@ -817,19 +817,21 @@ characterData(void *userData, const XML_Char *s, int len)
  * 
  */
 
-Repo *
-pool_addrepo_helix(Pool *pool, FILE *fp)
+void
+repo_add_helix(Repo *repo, FILE *fp)
 {
+  Pool *pool = repo->pool;
   Parsedata pd;
   char buf[BUFF_SIZE];
   int i, l;
-  Repo *repo;
   struct stateswitch *sw;
 
-  // create empty repo
-  repo = pool_addrepo_empty(pool);
+  if (repo->start && repo->start + repo->nsolvables != pool->nsolvables)
+    abort();
+  if (!repo->start)
+    repo->start = pool->nsolvables;
 
-  // prepare parsedata
+  /* prepare parsedata */
   memset(&pd, 0, sizeof(pd));
   for (i = 0, sw = stateswitches; sw->from != NUMSTATES; i++, sw++)
     {
@@ -872,10 +874,8 @@ pool_addrepo_helix(Pool *pool, FILE *fp)
 
   // adapt package count
   pool->nsolvables += pd.pack;
-  repo->nsolvables = pd.pack;
+  repo->nsolvables += pd.pack;
 
   free(pd.content);
   free(pd.evrspace);
-
-  return repo;
 }