add solver_rule2rules: learnt rule introspection
authorMichael Schroeder <mls@suse.de>
Fri, 13 Sep 2013 15:39:35 +0000 (17:39 +0200)
committerMichael Schroeder <mls@suse.de>
Fri, 13 Sep 2013 15:39:35 +0000 (17:39 +0200)
src/libsolv.ver
src/rules.c
src/rules.h

index 555b676..a902591 100644 (file)
@@ -357,6 +357,7 @@ SOLV_1.0 {
                solver_problemruleinfo2str;
                solver_rule2job;
                solver_rule2jobidx;
+               solver_rule2rules;
                solver_rule2solvable;
                solver_ruleclass;
                solver_ruleinfo;
index cefae35..af3b6b1 100644 (file)
@@ -2291,6 +2291,7 @@ solver_rule2jobidx(Solver *solv, Id rid)
   return solv->ruletojob.elements[rid - solv->jobrules] + 1;
 }
 
+/* job rule introspection */
 Id
 solver_rule2job(Solver *solv, Id rid, Id *whatp)
 {
@@ -2307,6 +2308,7 @@ solver_rule2job(Solver *solv, Id rid, Id *whatp)
   return solv->job.elements[idx];
 }
 
+/* update/feature rule introspection */
 Id
 solver_rule2solvable(Solver *solv, Id rid)
 {
@@ -2317,6 +2319,47 @@ solver_rule2solvable(Solver *solv, Id rid)
   return 0;
 }
 
+static void
+solver_rule2rules_rec(Solver *solv, Id rid, Queue *q, Map *seen)
+{
+  int i;
+  Id rid2;
+
+  if (seen)
+    MAPSET(seen, rid);
+  for (i = solv->learnt_why.elements[rid - solv->learntrules]; (rid2 = solv->learnt_pool.elements[i]) != 0; i++)
+    {
+      if (seen)
+       {
+         if (MAPTST(seen, rid2))
+           continue;
+         if (rid2 >= solv->learntrules)
+           solver_rule2rules_rec(solv, rid2, q, seen);
+         continue;
+       }
+      queue_push(q, rid2);
+    }
+}
+
+/* learnt rule introspection */
+void
+solver_rule2rules(Solver *solv, Id rid, Queue *q, int recursive)
+{
+  queue_empty(q);
+  if (rid < solv->learntrules || rid >= solv->nrules)
+    return;
+  if (recursive)
+    {
+      Map seen;
+      map_init(&seen, solv->nrules);
+      solver_rule2rules_rec(solv, rid, q, &seen);
+      map_free(&seen);
+    }
+  else
+    solver_rule2rules_rec(solv, rid, q, 0);
+}
+
+
 /* check if the newest versions of pi still provides the dependency we're looking for */
 static int
 solver_choicerulecheck(Solver *solv, Id pi, Rule *r, Map *m)
index 42e8285..34caf21 100644 (file)
@@ -139,6 +139,7 @@ extern void solver_ruleliterals(struct _Solver *solv, Id rid, Queue *q);
 extern int  solver_rule2jobidx(struct _Solver *solv, Id rid);
 extern Id   solver_rule2job(struct _Solver *solv, Id rid, Id *whatp);
 extern Id   solver_rule2solvable(struct _Solver *solv, Id rid);
+extern void solver_rule2rules(struct _Solver *solv, Id rid, Queue *q, int recursive);
 
 
 #ifdef __cplusplus