Przeglądaj źródła

libdpkg: Add new pkg_array_foreach() function

Guillem Jover 11 lat temu
rodzic
commit
55553c41c1
3 zmienionych plików z 30 dodań i 2 usunięć
  1. 1 0
      lib/dpkg/libdpkg.map
  2. 24 1
      lib/dpkg/pkg-array.c
  3. 5 1
      lib/dpkg/pkg-array.h

+ 1 - 0
lib/dpkg/libdpkg.map

@@ -260,6 +260,7 @@ LIBDPKG_PRIVATE {
 	# Package array handling
 	pkg_array_init_from_db;
 	pkg_array_init_from_names;
+	pkg_array_foreach;
 	pkg_array_sort;
 	pkg_array_destroy;
 

+ 24 - 1
lib/dpkg/pkg-array.c

@@ -3,7 +3,7 @@
  * pkg-array.c - primitives for pkg array handling
  *
  * Copyright © 1995,1996 Ian Jackson <ian@chiark.greenend.org.uk>
- * Copyright © 2009-2014 Guillem Jover <guillem@debian.org>
+ * Copyright © 2009-2015 Guillem Jover <guillem@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -77,6 +77,29 @@ pkg_array_init_from_db(struct pkg_array *a)
 	assert(i == a->n_pkgs);
 }
 
+/**
+ * Visit each non-NULL package in a package array.
+ *
+ * @param a The array to visit.
+ * @param pkg_visitor The function to visit each item of the array.
+ * @param pkg_data Data to pass pkg_visit for each package visited.
+ */
+void
+pkg_array_foreach(struct pkg_array *a, pkg_array_visitor_func *pkg_visitor,
+                  void *pkg_data)
+{
+	int i;
+
+	for (i = 0; i < a->n_pkgs; i++) {
+		struct pkginfo *pkg = a->pkgs[i];
+
+		if (pkg == NULL)
+			continue;
+
+		pkg_visitor(a, pkg, pkg_data);
+	}
+}
+
 /**
  * Sort a package array.
  *

+ 5 - 1
lib/dpkg/pkg-array.h

@@ -2,7 +2,7 @@
  * libdpkg - Debian packaging suite library routines
  * pkg-array.h - primitives for pkg array handling
  *
- * Copyright © 2009-2014 Guillem Jover <guillem@debian.org>
+ * Copyright © 2009-2015 Guillem Jover <guillem@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -41,10 +41,14 @@ struct pkg_array {
 };
 
 typedef struct pkginfo *pkg_mapper_func(const char *name);
+typedef void pkg_array_visitor_func(struct pkg_array *a, struct pkginfo *pkg,
+                                    void *pkg_data);
 
 void pkg_array_init_from_db(struct pkg_array *a);
 void pkg_array_init_from_names(struct pkg_array *a, pkg_mapper_func *pkg_mapper,
                                const char **pkg_names);
+void pkg_array_foreach(struct pkg_array *a, pkg_array_visitor_func *pkg_visitor,
+                       void *pkg_data);
 void pkg_array_sort(struct pkg_array *a, pkg_sorter_func *pkg_sort);
 void pkg_array_destroy(struct pkg_array *a);