diff options
author | Guillem Jover <guillem@debian.org> | 2010-06-22 10:57:47 +0200 |
---|---|---|
committer | Guillem Jover <guillem@debian.org> | 2010-06-25 18:51:28 +0200 |
commit | c43931e799d36275cf6d44be94c63512b94b1c9e (patch) | |
tree | 1b33a4449f0d850c35c0bafb416ed0253095fbeb /src/filesdb.c | |
parent | 632e855a51070ca42532341e9f8f0f0006f1a23d (diff) | |
download | dpkg-c43931e799d36275cf6d44be94c63512b94b1c9e.tar.gz |
dpkg: Use iterators instead of exposing packageslump directly
Diffstat (limited to 'src/filesdb.c')
-rw-r--r-- | src/filesdb.c | 56 |
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; |