refactor testcase_str2dep
authorMichael Schroeder <mls@suse.de>
Wed, 12 Feb 2014 18:48:24 +0000 (19:48 +0100)
committerMichael Schroeder <mls@suse.de>
Wed, 12 Feb 2014 18:48:24 +0000 (19:48 +0100)
- no longer patch the string
- also support REL_AND (&) and REL_COND (IF)

ext/testcase.c
ext/testcase.h

index a067aff..a1c8ee6 100644 (file)
@@ -287,21 +287,14 @@ pool_isknownarch(Pool *pool, Id id)
   return 1;
 }
 
-Id
-testcase_str2dep(Pool *pool, char *s)
+static Id
+testcase_str2dep_simple(Pool *pool, const char **sp)
 {
-  char *n, *a;
+  const char *s = *sp;
+  const char *n, *a;
   Id id, evr;
   int flags;
 
-  if ((n = strchr(s, '|')) != 0)
-    {
-      id = testcase_str2dep(pool, n + 1);
-      *n = 0;
-      id = pool_rel2id(pool, testcase_str2dep(pool, s), id, REL_OR, 1);
-      *n = '|';
-      return id;
-    }
   while (*s == ' ' || *s == '\t')
     s++;
   n = s;
@@ -311,9 +304,9 @@ testcase_str2dep(Pool *pool, char *s)
        {
          while (*s && *s != ')')
            s++;
+         continue;
        }
-      else
-        s++;
+      s++;
     }
   if ((a = strchr(n, '.')) != 0 && a + 1 < s && s[-1] != ')')
     {
@@ -334,7 +327,10 @@ testcase_str2dep(Pool *pool, char *s)
   else
     id = pool_strn2id(pool, n, s - n, 1);
   if (!*s)
-    return id;
+    {
+      *sp = s;
+      return id;
+    }
   while (*s == ' ' || *s == '\t')
     s++;
   flags = 0;
@@ -355,7 +351,10 @@ testcase_str2dep(Pool *pool, char *s)
        break;
     }
   if (!flags)
-    return id;
+    {
+      *sp = s;
+      return id;
+    }
   while (*s == ' ' || *s == '\t')
     s++;
   n = s;
@@ -372,9 +371,41 @@ testcase_str2dep(Pool *pool, char *s)
        s++;
       evr = pool_rel2id(pool, evr, pool_strn2id(pool, n, s - n, 1), REL_COMPAT, 1);
     }
+  *sp = s;
   return pool_rel2id(pool, id, evr, flags, 1);
 }
 
+static Id
+testcase_str2dep_complex(Pool *pool, const char **sp)
+{
+  const char *s = *sp;
+  Id id;
+  id = testcase_str2dep_simple(pool, &s);
+  if (*s == '|')
+    {
+      s++;
+      id = pool_rel2id(pool, id, testcase_str2dep_complex(pool, &s), REL_OR, 1);
+    }
+  else if (*s == '&')
+    {
+      s++;
+      id = pool_rel2id(pool, id, testcase_str2dep_complex(pool, &s), REL_AND, 1);
+    }
+  else if (*s == 'I' && s[1] == 'F' && (s[2] == ' ' || s[2] == '\t'))
+    {
+      s += 2;
+      id = pool_rel2id(pool, id, testcase_str2dep_complex(pool, &s), REL_COND, 1);
+    }
+  *sp = s;
+  return id;
+}
+
+Id
+testcase_str2dep(Pool *pool, const char *s)
+{
+  return testcase_str2dep_complex(pool, &s);
+}
+
 const char *
 testcase_repoid2str(Pool *pool, Id repoid)
 {
index 20c7095..4243e4f 100644 (file)
@@ -15,7 +15,7 @@
 #define TESTCASE_RESULT_RECOMMENDED    (1 << 3)
 #define TESTCASE_RESULT_UNNEEDED       (1 << 4)
 
-extern Id testcase_str2dep(Pool *pool, char *s);
+extern Id testcase_str2dep(Pool *pool, const char *s);
 extern const char *testcase_repoid2str(Pool *pool, Id repoid);
 extern const char *testcase_solvid2str(Pool *pool, Id p);
 extern Repo *testcase_str2repo(Pool *pool, const char *str);