summaryrefslogtreecommitdiff
path: root/src/filesdb.c
diff options
context:
space:
mode:
authorGuillem Jover <guillem@debian.org>2010-06-22 10:57:47 +0200
committerGuillem Jover <guillem@debian.org>2010-06-25 18:51:28 +0200
commitc43931e799d36275cf6d44be94c63512b94b1c9e (patch)
tree1b33a4449f0d850c35c0bafb416ed0253095fbeb /src/filesdb.c
parent632e855a51070ca42532341e9f8f0f0006f1a23d (diff)
downloaddpkg-c43931e799d36275cf6d44be94c63512b94b1c9e.tar.gz
dpkg: Use iterators instead of exposing packageslump directly
Diffstat (limited to 'src/filesdb.c')
-rw-r--r--src/filesdb.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/filesdb.c b/src/filesdb.c
index 1c07ea192..73f53e31a 100644
--- a/src/filesdb.c
+++ b/src/filesdb.c
@@ -51,6 +51,62 @@
#include "filesdb.h"
#include "main.h"
+
+/* filepackages support for tracking packages owning a file. */
+
+#define PERFILEPACKAGESLUMP 10
+
+struct filepackages {
+ struct filepackages *more;
+
+ /* pkgs is a NULL-pointer-terminated list; anything after the first NULL
+ * is garbage. */
+ struct pkginfo *pkgs[PERFILEPACKAGESLUMP];
+};
+
+struct filepackages_iterator {
+ struct filepackages *pkg_lump;
+ int pkg_idx;
+};
+
+struct filepackages_iterator *
+filepackages_iter_new(struct filenamenode *fnn)
+{
+ struct filepackages_iterator *iter;
+
+ iter = m_malloc(sizeof(*iter));
+ iter->pkg_lump = fnn->packages;
+ iter->pkg_idx = 0;
+
+ return iter;
+}
+
+struct pkginfo *
+filepackages_iter_next(struct filepackages_iterator *iter)
+{
+ struct pkginfo *pkg;
+
+ while (iter->pkg_lump) {
+ pkg = iter->pkg_lump->pkgs[iter->pkg_idx];
+
+ if (iter->pkg_idx < PERFILEPACKAGESLUMP && pkg) {
+ iter->pkg_idx++;
+ return pkg;
+ } else {
+ iter->pkg_lump = iter->pkg_lump->more;
+ iter->pkg_idx = 0;
+ }
+ }
+
+ return NULL;
+}
+
+void
+filepackages_iter_free(struct filepackages_iterator *iter)
+{
+ free(iter);
+}
+
/*** Generic data structures and routines ***/
static bool allpackagesdone = false;