Add alternative header iterator method
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 30 Sep 2009 11:48:19 +0000 (14:48 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 30 Sep 2009 11:48:19 +0000 (14:48 +0300)
- we dont always want the actual contents of the tag to be copied
  on iteration, so add an interface that returns the next tag in the
  header
- this lets callers to decide what to do with the tag and how to
  retrieve it

lib/header.c
lib/header.h

index 441a0bc..77e2473 100644 (file)
@@ -1784,15 +1784,11 @@ HeaderIterator headerInitIterator(Header h)
     return hi;
 }
 
-int headerNext(HeaderIterator hi, rpmtd td)
+static indexEntry nextIndex(HeaderIterator hi)
 {
     Header h = hi->h;
     int slot;
     indexEntry entry = NULL;
-    int rc;
-
-    assert(td != NULL);
-    rpmtdReset(td);
 
     for (slot = hi->next_index; slot < h->indexUsed; slot++) {
        entry = h->index + slot;
@@ -1801,15 +1797,28 @@ int headerNext(HeaderIterator hi, rpmtd td)
     }
     hi->next_index = slot;
     if (entry == NULL || slot >= h->indexUsed)
-       return 0;
+       return NULL;
 
     hi->next_index++;
+    return entry;
+}
 
-    td->tag = entry->info.tag;
+rpmTag headerNextTag(HeaderIterator hi)
+{
+    indexEntry entry = nextIndex(hi);
+    return entry ? entry->info.tag : RPMTAG_NOT_FOUND;
+}
 
-    rc = copyTdEntry(entry, td, HEADERGET_DEFAULT);
+int headerNext(HeaderIterator hi, rpmtd td)
+{
+    indexEntry entry = nextIndex(hi);
+    int rc = 0;
 
-    /* XXX 1 on success */
+    rpmtdReset(td);
+    if (entry) {
+       td->tag = entry->info.tag;
+       rc = copyTdEntry(entry, td, HEADERGET_DEFAULT);
+    }
     return ((rc == 1) ? 1 : 0);
 }
 
index e39b7a7..dff0b48 100644 (file)
@@ -309,7 +309,7 @@ HeaderIterator headerFreeIterator(HeaderIterator hi);
 HeaderIterator headerInitIterator(Header h);
 
 /** \ingroup header
- * Return next tag from header.
+ * Return next tag contents from header.
  * @param hi           header tag iterator
  * @retval td          tag data container
  * @return             1 on success, 0 on failure
@@ -317,6 +317,13 @@ HeaderIterator headerInitIterator(Header h);
 int headerNext(HeaderIterator hi, rpmtd td);
 
 /** \ingroup header
+ * Return next tag number from header.
+ * @param hi           header tag iterator
+ * @return             next tag, RPMTAG_NOT_FOUND to stop iteration
+ */
+rpmTag headerNextTag(HeaderIterator hi);
+
+/** \ingroup header
  * Return name, version, release strings from header.
  * @param h            header
  * @retval *np         name pointer (or NULL)