The following commit has been merged in the master branch:
commit 45e5ee9e4c9195a488c2e0e246b855e4bcbe6b4f
Author: Guillem Jover <[email protected]>
Date: Wed Feb 11 03:28:19 2009 +0200
Refactor package array handling
Create a new pkg_array structure, and two new functions to initialize
from the db, and to sort the array.
diff --git a/src/Makefile.am b/src/Makefile.am
index d621431..cb3ec93 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -21,7 +21,7 @@ dpkg_SOURCES = \
help.c \
main.c main.h \
packages.c \
- pkg-array.c \
+ pkg-array.c pkg-array.h \
pkg-show.c \
processarc.c \
remove.c \
@@ -39,7 +39,7 @@ dpkg_LDADD = \
dpkg_query_SOURCES = \
filesdb.c filesdb.h \
- pkg-array.c \
+ pkg-array.c pkg-array.h \
pkg-show.c \
query.c
diff --git a/src/pkg-array.c b/src/pkg-array.c
index 1b2d306..d5504a0 100644
--- a/src/pkg-array.c
+++ b/src/pkg-array.c
@@ -3,6 +3,7 @@
* pkg-array.c - primitives for pkg array handling
*
* Copyright © 1995,1996 Ian Jackson <[email protected]>
+ * Copyright © 2009 Guillem Jover <[email protected]>
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -22,12 +23,16 @@
#include <config.h>
#include <compat.h>
+#include <assert.h>
#include <string.h>
+#include <stdlib.h>
#include <dpkg.h>
#include <dpkg-db.h>
#include <dpkg-priv.h>
+#include "pkg-array.h"
+
int
pkglistqsortcmp(const void *a, const void *b)
{
@@ -37,3 +42,27 @@ pkglistqsortcmp(const void *a, const void *b)
return strcmp(pa->name, pb->name);
}
+void
+pkg_array_init_from_db(struct pkg_array *a)
+{
+ struct pkgiterator *it;
+ struct pkginfo *pkg;
+ int i;
+
+ a->n_pkgs = countpackages();
+ a->pkgs = m_malloc(sizeof(a->pkgs[0]) * a->n_pkgs);
+
+ it = iterpkgstart();
+ for (i = 0; (pkg = iterpkgnext(it)); i++)
+ a->pkgs[i] = pkg;
+ iterpkgend(it);
+
+ assert(i == a->n_pkgs);
+}
+
+void
+pkg_array_sort(struct pkg_array *a, pkg_sorter_func *pkg_sort)
+{
+ qsort(a->pkgs, a->n_pkgs, sizeof(a->pkgs[0]), pkg_sort);
+}
+
diff --git a/lib/progress.h b/src/pkg-array.h
similarity index 68%
copy from lib/progress.h
copy to src/pkg-array.h
index dad6f3c..b8d336f 100644
--- a/lib/progress.h
+++ b/src/pkg-array.h
@@ -1,6 +1,6 @@
/*
* dpkg - main program for package management
- * progress.c - generic progress reporting
+ * pkg-array.h - primitives for pkg array handling
*
* Copyright © 2009 Guillem Jover <[email protected]>
*
@@ -19,28 +19,22 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#ifndef DPKG_PROGRESS_H
-#define DPKG_PROGRESS_H
+#include <config.h>
+#include <compat.h>
-#include <dpkg-def.h>
+#include <dpkg-db.h>
DPKG_BEGIN_DECLS
-struct progress {
- const char *text;
+typedef int pkg_sorter_func(const void *a, const void *b);
- int max;
- int cur;
- int last_percent;
-
- int on_tty;
+struct pkg_array {
+ int n_pkgs;
+ struct pkginfo **pkgs;
};
-void progress_init(struct progress *progress, const char *text, int max);
-void progress_step(struct progress *progress);
-void progress_done(struct progress *progress);
+void pkg_array_init_from_db(struct pkg_array *a);
+void pkg_array_sort(struct pkg_array *a, pkg_sorter_func *pkg_sort);
DPKG_END_DECLS
-#endif
-
diff --git a/src/query.c b/src/query.c
index 31597af..579bd6f 100644
--- a/src/query.c
+++ b/src/query.c
@@ -28,7 +28,6 @@
#include <string.h>
#include <stdlib.h>
#include <fnmatch.h>
-#include <assert.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -45,6 +44,7 @@
#include <dpkg-priv.h>
#include <myopt.h>
+#include "pkg-array.h"
#include "filesdb.h"
#include "main.h"
@@ -71,8 +71,9 @@ static int getwidth(void) {
}
}
-static void list1package(struct pkginfo *pkg, int *head,
- struct pkginfo **pkgl, int np) {
+static void
+list1package(struct pkginfo *pkg, int *head, struct pkg_array *array)
+{
int i,l,w;
static int nw,vw,dw;
const char *pdesc;
@@ -82,15 +83,16 @@ static void list1package(struct pkginfo *pkg, int *head,
w=getwidth();
if (w == -1) {
nw=14, vw=14, dw=44;
- for (i=0; i<np; i++) {
+ for (i = 0; i < array->n_pkgs; i++) {
const char *pdesc;
int plen, vlen, dlen;
pdesc = pkg->installed.valid ? pkg->installed.description : NULL;
if (!pdesc) pdesc= _("(no description available)");
- plen= strlen(pkgl[i]->name);
- vlen = strlen(versiondescribe(&pkgl[i]->installed.version,
vdew_nonambig));
+ plen = strlen(array->pkgs[i]->name);
+ vlen = strlen(versiondescribe(&array->pkgs[i]->installed.version,
+ vdew_nonambig));
dlen= strcspn(pdesc, "\n");
if (plen > nw) nw = plen;
if (vlen > vw) vw = vlen;
@@ -132,31 +134,22 @@ Desired=Unknown/Install/Remove/Purge/Hold\n\
}
void listpackages(const char *const *argv) {
- struct pkgiterator *it;
+ struct pkg_array array;
struct pkginfo *pkg;
- struct pkginfo **pkgl;
- int np, i, head;
+ int i, head;
modstatdb_init(admindir,msdbrw_readonly);
- np= countpackages();
- pkgl= m_malloc(sizeof(struct pkginfo*)*np);
- it= iterpkgstart(); i=0;
- while ((pkg= iterpkgnext(it))) {
- assert(i<np);
- pkgl[i++]= pkg;
- }
- iterpkgend(it);
- assert(i==np);
+ pkg_array_init_from_db(&array);
+ pkg_array_sort(&array, pkglistqsortcmp);
- qsort(pkgl, np, sizeof(struct pkginfo*), pkglistqsortcmp);
head = 0;
if (!*argv) {
- for (i=0; i<np; i++) {
- pkg= pkgl[i];
+ for (i = 0; i < array.n_pkgs; i++) {
+ pkg = array.pkgs[i];
if (pkg->status == stat_notinstalled) continue;
- list1package(pkg, &head, pkgl, np);
+ list1package(pkg, &head, &array);
}
} else {
int argc, ip, *found;
@@ -165,11 +158,11 @@ void listpackages(const char *const *argv) {
found = m_malloc(sizeof(int) * argc);
memset(found, 0, sizeof(int) * argc);
- for (i = 0; i < np; i++) {
- pkg = pkgl[i];
+ for (i = 0; i < array.n_pkgs; i++) {
+ pkg = array.pkgs[i];
for (ip = 0; ip < argc; ip++) {
if (!fnmatch(argv[ip], pkg->name, 0)) {
- list1package(pkg, &head, pkgl, np);
+ list1package(pkg, &head, &array);
found[ip]++;
break;
}
@@ -383,10 +376,9 @@ void enqperpackage(const char *const *argv) {
}
void showpackages(const char *const *argv) {
- struct pkgiterator *it;
+ struct pkg_array array;
struct pkginfo *pkg;
- struct pkginfo **pkgl;
- int np, i;
+ int i;
struct lstitem* fmt = parseformat(showformat);
if (!fmt) {
@@ -396,21 +388,12 @@ void showpackages(const char *const *argv) {
modstatdb_init(admindir,msdbrw_readonly);
- np= countpackages();
- pkgl= m_malloc(sizeof(struct pkginfo*)*np);
- it= iterpkgstart(); i=0;
- while ((pkg= iterpkgnext(it))) {
- assert(i<np);
- pkgl[i++]= pkg;
- }
- iterpkgend(it);
- assert(i==np);
+ pkg_array_init_from_db(&array);
+ pkg_array_sort(&array, pkglistqsortcmp);
- qsort(pkgl,np,sizeof(struct pkginfo*),pkglistqsortcmp);
-
if (!*argv) {
- for (i=0; i<np; i++) {
- pkg= pkgl[i];
+ for (i = 0; i < array.n_pkgs; i++) {
+ pkg = array.pkgs[i];
if (pkg->status == stat_notinstalled) continue;
show1package(fmt,pkg);
}
@@ -421,8 +404,8 @@ void showpackages(const char *const *argv) {
found = m_malloc(sizeof(int) * argc);
memset(found, 0, sizeof(int) * argc);
- for (i = 0; i < np; i++) {
- pkg = pkgl[i];
+ for (i = 0; i < array.n_pkgs; i++) {
+ pkg = array.pkgs[i];
for (ip = 0; ip < argc; ip++) {
if (!fnmatch(argv[ip], pkg->name, 0)) {
show1package(fmt, pkg);
diff --git a/src/select.c b/src/select.c
index c9d6bd6..426e07f 100644
--- a/src/select.c
+++ b/src/select.c
@@ -27,13 +27,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <assert.h>
#include <fnmatch.h>
#include <ctype.h>
#include <dpkg.h>
#include <dpkg-db.h>
+#include "pkg-array.h"
#include "filesdb.h"
#include "main.h"
@@ -46,38 +46,29 @@ static void getsel1package(struct pkginfo *pkg) {
}
void getselections(const char *const *argv) {
- struct pkgiterator *it;
+ struct pkg_array array;
struct pkginfo *pkg;
- struct pkginfo **pkgl;
const char *thisarg;
- int np, i, head, found;
+ int i, head, found;
modstatdb_init(admindir,msdbrw_readonly);
- np= countpackages();
- pkgl= m_malloc(sizeof(struct pkginfo*)*np);
- it= iterpkgstart(); i=0;
- while ((pkg= iterpkgnext(it))) {
- assert(i<np);
- pkgl[i++]= pkg;
- }
- iterpkgend(it);
- assert(i==np);
+ pkg_array_init_from_db(&array);
+ pkg_array_sort(&array, pkglistqsortcmp);
- qsort(pkgl,np,sizeof(struct pkginfo*),pkglistqsortcmp);
head=0;
if (!*argv) {
- for (i=0; i<np; i++) {
- pkg= pkgl[i];
+ for (i = 0; i < array.n_pkgs; i++) {
+ pkg = array.pkgs[i];
if (pkg->status == stat_notinstalled) continue;
getsel1package(pkg);
}
} else {
while ((thisarg= *argv++)) {
found= 0;
- for (i=0; i<np; i++) {
- pkg= pkgl[i];
+ for (i = 0; i < array.n_pkgs; i++) {
+ pkg = array.pkgs[i];
if (fnmatch(thisarg,pkg->name,0)) continue;
getsel1package(pkg); found++;
}
--
dpkg's main repository
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]