- get rid of static variables used by join2
[platform/upstream/libsolv.git] / ext / repo_susetags.c
index 3f40be5..6395425 100644 (file)
@@ -24,18 +24,21 @@ struct datashare {
   Id evr;
   Id arch;
 };
+
 struct parsedata {
-  char *kind;
+  Pool *pool;
   Repo *repo;
   Repodata *data;
+  char *kind;
   int flags;
-  struct parsedata_common common;
   int last_found_source;
   struct datashare *share_with;
   int nshare;
-  Id (*dirs)[3]; // dirid, size, nfiles
+  Id (*dirs)[3];                       /* dirid, size, nfiles */
   int ndirs;
-  Id langcache[ID_NUM_INTERNAL];
+  struct joindata jd;
+  char *language;                      /* the default language */
+  Id langcache[ID_NUM_INTERNAL];       /* cache for the default language */
   int lineno;
 };
 
@@ -52,13 +55,14 @@ static char *flagtab[] = {
 static Id
 langtag(struct parsedata *pd, Id tag, const char *language)
 {
-  if (language && !language[0])
-    language = 0;
-  if (!language || tag >= ID_NUM_INTERNAL)
+  if (language && *language)
     return pool_id2langid(pd->repo->pool, tag, language, 1);
-  return pool_id2langid(pd->repo->pool, tag, language, 1);
+  if (!pd->language)
+    return tag;
+  if (tag >= ID_NUM_INTERNAL)
+    return pool_id2langid(pd->repo->pool, tag, pd->language, 1);
   if (!pd->langcache[tag])
-    pd->langcache[tag] = pool_id2langid(pd->repo->pool, tag, language, 1);
+    pd->langcache[tag] = pool_id2langid(pd->repo->pool, tag, pd->language, 1);
   return pd->langcache[tag];
 }
 
@@ -88,7 +92,7 @@ adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, char *line, Id ma
           exit(1);
         }
       if (kind)
-        id = pool_str2id(pool, join2(kind, ":", sp[0]), 1);
+        id = pool_str2id(pool, join2(&pd->jd, kind, ":", sp[0]), 1);
       else
         id = pool_str2id(pool, sp[0], 1);
       if (i == 3)
@@ -120,6 +124,9 @@ add_source(struct parsedata *pd, char *line, Solvable *s, Id handle)
   Repo *repo = s->repo;
   Pool *pool = repo->pool;
   char *sp[5];
+  Id name;
+  Id evr;
+  Id arch;
 
   if (split(line, sp, 5) != 4)
     {
@@ -127,9 +134,9 @@ add_source(struct parsedata *pd, char *line, Solvable *s, Id handle)
       exit(1);
     }
 
-  Id name = pool_str2id(pool, sp[0], 1);
-  Id evr = makeevr(pool, join2(sp[1], "-", sp[2]));
-  Id arch = pool_str2id(pool, sp[3], 1);
+  name = pool_str2id(pool, sp[0], 1);
+  evr = makeevr(pool, join2(&pd->jd, sp[1], "-", sp[2]));
+  arch = pool_str2id(pool, sp[3], 1);
   /* XXX: could record a dep here, depends on where we want to store the data */
   if (name == s->name)
     repodata_set_void(pd->data, handle, SOLVABLE_SOURCENAME);
@@ -152,17 +159,20 @@ static void
 add_dirline(struct parsedata *pd, char *line)
 {
   char *sp[6];
+  long filesz;
+  long filenum;
+  unsigned dirid;
   if (split(line, sp, 6) != 5)
     return;
   pd->dirs = solv_extend(pd->dirs, pd->ndirs, 1, sizeof(pd->dirs[0]), 31);
-  long filesz = strtol(sp[1], 0, 0);
+  filesz = strtol(sp[1], 0, 0);
   filesz += strtol(sp[2], 0, 0);
-  long filenum = strtol(sp[3], 0, 0);
+  filenum = strtol(sp[3], 0, 0);
   filenum += strtol(sp[4], 0, 0);
   /* hack: we know that there's room for a / */
   if (*sp[0] != '/')
     *--sp[0] = '/';
-  unsigned dirid = repodata_str2dir(pd->data, sp[0], 1);
+  dirid = repodata_str2dir(pd->data, sp[0], 1);
 #if 0
 fprintf(stderr, "%s -> %d\n", sp[0], dirid);
 #endif
@@ -572,10 +582,11 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
   line = malloc(1024);
   aline = 1024;
 
-  pd.repo = pd.common.repo = repo;
+  pd.pool = pool;
+  pd.repo = repo;
   pd.data = data;
-  pd.common.pool = pool;
   pd.flags = flags;
+  pd.language = language && *language ? solv_strdup(language) : 0;
 
   linep = line;
   s = 0;
@@ -717,19 +728,21 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
        continue;
       if (! (line[0] && line[1] && line[2] && line[3] && (line[4] == ':' || line[4] == '.')))
         continue;
+      line_lang[0] = 0;
       if (line[4] == '.')
         {
           char *endlang;
           endlang = strchr(line + 5, ':');
           if (endlang)
             {
+             int langsize = endlang - (line + 5);
               keylen = endlang - line - 1;
-              strncpy(line_lang, line + 5, 5);
-              line_lang[endlang - line - 5] = 0;
+             if (langsize > 5)
+               langsize = 5;
+              strncpy(line_lang, line + 5, langsize);
+              line_lang[langsize] = 0;
             }
         }
-      else
-        line_lang[0] = 0;
       tag = tag_from_string(line);
 
       if (indelta)
@@ -749,7 +762,7 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
                if (split(line + 5, sp, 5) != 5)
                  continue;
                repodata_set_id(data, handle, DELTA_SEQ_NAME, pool_str2id(pool, sp[0], 1));
-               evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+               evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
                repodata_set_id(data, handle, DELTA_SEQ_EVR, evr);
                /* repodata_set_id(data, handle, DELTA_SEQ_ARCH, pool_str2id(pool, sp[3], 1)); */
                repodata_set_str(data, handle, DELTA_SEQ_NUM, sp[4]);
@@ -805,7 +818,7 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
            }
          handle = repodata_new_handle(data);
          repodata_set_id(data, handle, DELTA_PACKAGE_NAME, pool_str2id(pool, sp[0], 1));
-         repodata_set_id(data, handle, DELTA_PACKAGE_EVR, makeevr(pool, join2(sp[1], "-", sp[2])));
+         repodata_set_id(data, handle, DELTA_PACKAGE_EVR, makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2])));
          repodata_set_id(data, handle, DELTA_PACKAGE_ARCH, pool_str2id(pool, sp[3], 1));
          repodata_add_flexarray(data, SOLVID_META, REPOSITORY_DELTAINFO, handle);
          indelta = 1;
@@ -846,10 +859,10 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
              Id name, evr, arch;
              /* we don't use the create flag here as a simple pre-check for existance */
              if (pd.kind)
-               name = pool_str2id(pool, join2(pd.kind, ":", sp[0]), 0);
+               name = pool_str2id(pool, join2(&pd.jd, pd.kind, ":", sp[0]), 0);
              else
                name = pool_str2id(pool, sp[0], 0);
-             evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+             evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
              arch = pool_str2id(pool, sp[3], 0);
              if (name && arch)
                {
@@ -871,10 +884,10 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
              /* normal operation. create a new solvable. */
              s = pool_id2solvable(pool, repo_add_solvable(repo));
              if (pd.kind)
-               s->name = pool_str2id(pool, join2(pd.kind, ":", sp[0]), 1);
+               s->name = pool_str2id(pool, join2(&pd.jd, pd.kind, ":", sp[0]), 1);
              else
                s->name = pool_str2id(pool, sp[0], 1);
-             s->evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+             s->evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
              s->arch = pool_str2id(pool, sp[3], 1);
              s->vendor = defvendor;
              createdpkgs = 1;
@@ -1009,19 +1022,19 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
            repodata_set_str(data, handle, SOLVABLE_AUTHORS, line + 6);
            continue;
           case CTAG('=', 'S', 'u', 'm'):
-            repodata_set_str(data, handle, langtag(&pd, SOLVABLE_SUMMARY, language ? language : line_lang), line + 3 + keylen );
+            repodata_set_str(data, handle, langtag(&pd, SOLVABLE_SUMMARY, line_lang), line + 3 + keylen);
             continue;
           case CTAG('=', 'D', 'e', 's'):
-           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_DESCRIPTION, language ? language : line_lang), line + 3 + keylen );
+           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_DESCRIPTION, line_lang), line + 3 + keylen);
            continue;
           case CTAG('=', 'E', 'u', 'l'):
-           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_EULA, language), line + 6);
+           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_EULA, line_lang), line + 6);
            continue;
           case CTAG('=', 'I', 'n', 's'):
-           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEINS, language), line + 6);
+           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEINS, line_lang), line + 6);
            continue;
           case CTAG('=', 'D', 'e', 'l'):
-           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEDEL, language), line + 6);
+           repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEDEL, line_lang), line + 6);
            continue;
           case CTAG('=', 'V', 'i', 's'):
            {
@@ -1029,7 +1042,7 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
              unsigned k;
              k = atoi(line + 6);
              if (k || !strcasecmp(line + 6, "true"))
-               repodata_set_void(data, handle, SOLVABLE_ISVISIBLE );
+               repodata_set_void(data, handle, SOLVABLE_ISVISIBLE);
            }
            continue;
           case CTAG('=', 'S', 'h', 'r'):
@@ -1041,7 +1054,7 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
                  exit(1);
                }
              name = pool_str2id(pool, sp[0], 1);
-             evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+             evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
              arch = pool_str2id(pool, sp[3], 1);
              if (last_found_pack >= pd.nshare)
                {
@@ -1084,16 +1097,18 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
            repodata_set_str(data, handle, SOLVABLE_ICON, line + 6);
            break;
          case CTAG('=', 'E', 'x', 't'):
-           repodata_add_poolstr_array(data, handle, SOLVABLE_EXTENDS, join2("pattern", ":", line + 6));
+           repodata_add_poolstr_array(data, handle, SOLVABLE_EXTENDS, join2(&pd.jd, "pattern", ":", line + 6));
            break;
          case CTAG('=', 'I', 'n', 'c'):
-           repodata_add_poolstr_array(data, handle, SOLVABLE_INCLUDES, join2("pattern", ":", line + 6));
+           repodata_add_poolstr_array(data, handle, SOLVABLE_INCLUDES, join2(&pd.jd, "pattern", ":", line + 6));
            break;
          case CTAG('=', 'C', 'k', 's'):
            set_checksum(&pd, data, handle, SOLVABLE_CHECKSUM, line + 6);
            break;
          case CTAG('=', 'L', 'a', 'n'):
-           language = solv_strdup(line + 6);
+           pd.language = solv_free(pd.language);
+           if (line[6])
+             pd.language = solv_strdup(line + 6);
            break;
 
          case CTAG('=', 'F', 'l', 's'):
@@ -1203,9 +1218,8 @@ repo_add_susetags(Repo *repo, FILE *fp, Id defvendor, const char *language, int
   if (!(flags & REPO_NO_INTERNALIZE))
     repodata_internalize(data);
 
-  if (pd.common.tmp)
-    free(pd.common.tmp);
+  solv_free(pd.language);
   free(line);
-  join_freemem();
+  join_freemem(&pd.jd);
   return 0;
 }