Просмотр исходного кода

libdpkg: Refactor parsedb_parse() out from parsedb()

Guillem Jover лет назад: 12
Родитель
Сommit
7d98d267c8
2 измененных файлов с 29 добавлено и 12 удалено
  1. 27 12
      lib/dpkg/parse.c
  2. 2 0
      lib/dpkg/parsedump.h

+ 27 - 12
lib/dpkg/parse.c

@@ -709,13 +709,13 @@ parsedb_close(struct parsedb_state *ps)
 }
 }
 
 
 /**
 /**
- * Parse an RFC-822 style file.
+ * Parse deb822 style package data from a buffer.
  *
  *
  * donep may be NULL.
  * donep may be NULL.
  * If donep is not NULL only one package's information is expected.
  * If donep is not NULL only one package's information is expected.
  */
  */
-int parsedb(const char *filename, enum parsedbflags flags,
-            struct pkginfo **donep)
+int
+parsedb_parse(struct parsedb_state *ps, struct pkginfo **donep)
 {
 {
   struct pkgset tmp_set;
   struct pkgset tmp_set;
   struct pkginfo *new_pkg, *db_pkg;
   struct pkginfo *new_pkg, *db_pkg;
@@ -723,16 +723,13 @@ int parsedb(const char *filename, enum parsedbflags flags,
   struct pkg_parse_object pkg_obj;
   struct pkg_parse_object pkg_obj;
   int fieldencountered[array_count(fieldinfos)];
   int fieldencountered[array_count(fieldinfos)];
   int pdone;
   int pdone;
-  struct parsedb_state *ps;
   struct field_state fs;
   struct field_state fs;
 
 
   memset(&fs, 0, sizeof(fs));
   memset(&fs, 0, sizeof(fs));
   fs.fieldencountered = fieldencountered;
   fs.fieldencountered = fieldencountered;
 
 
-  ps = parsedb_open(filename, flags);
-
   new_pkg = &tmp_set.pkg;
   new_pkg = &tmp_set.pkg;
-  if (flags & pdb_recordavailable)
+  if (ps->flags & pdb_recordavailable)
     new_pkgbin = &new_pkg->available;
     new_pkgbin = &new_pkg->available;
   else
   else
     new_pkgbin = &new_pkg->installed;
     new_pkgbin = &new_pkg->installed;
@@ -760,12 +757,12 @@ int parsedb(const char *filename, enum parsedbflags flags,
     pkg_parse_verify(ps, new_pkg, new_pkgbin);
     pkg_parse_verify(ps, new_pkg, new_pkgbin);
 
 
     db_pkg = parse_find_pkg_slot(ps, new_pkg, new_pkgbin);
     db_pkg = parse_find_pkg_slot(ps, new_pkg, new_pkgbin);
-    if (flags & pdb_recordavailable)
+    if (ps->flags & pdb_recordavailable)
       db_pkgbin = &db_pkg->available;
       db_pkgbin = &db_pkg->available;
     else
     else
       db_pkgbin = &db_pkg->installed;
       db_pkgbin = &db_pkg->installed;
 
 
-    if (((flags & pdb_ignoreolder) || ps->type == pdb_file_available) &&
+    if (((ps->flags & pdb_ignoreolder) || ps->type == pdb_file_available) &&
         dpkg_version_is_informative(&db_pkgbin->version) &&
         dpkg_version_is_informative(&db_pkgbin->version) &&
         dpkg_version_compare(&new_pkgbin->version, &db_pkgbin->version) < 0)
         dpkg_version_compare(&new_pkgbin->version, &db_pkgbin->version) < 0)
       continue;
       continue;
@@ -779,14 +776,32 @@ int parsedb(const char *filename, enum parsedbflags flags,
       break;
       break;
   }
   }
 
 
-  parsedb_close(ps);
-
   varbuf_destroy(&fs.value);
   varbuf_destroy(&fs.value);
-  if (donep && !pdone) ohshit(_("no package information in `%.255s'"),filename);
+  if (donep && !pdone)
+    ohshit(_("no package information in `%.255s'"), ps->filename);
 
 
   return pdone;
   return pdone;
 }
 }
 
 
+/**
+ * Parse a deb822 style file.
+ *
+ * donep may be NULL.
+ * If donep is not NULL only one package's information is expected.
+ */
+int
+parsedb(const char *filename, enum parsedbflags flags, struct pkginfo **pkgp)
+{
+  struct parsedb_state *ps;
+  int count;
+
+  ps = parsedb_open(filename, flags);
+  count = parsedb_parse(ps, pkgp);
+  parsedb_close(ps);
+
+  return count;
+}
+
 /**
 /**
  * Copy dependency links structures.
  * Copy dependency links structures.
  *
  *

+ 2 - 0
lib/dpkg/parsedump.h

@@ -73,6 +73,8 @@ struct parsedb_state *
 parsedb_new(const char *filename, int fd, enum parsedbflags flags);
 parsedb_new(const char *filename, int fd, enum parsedbflags flags);
 struct parsedb_state *
 struct parsedb_state *
 parsedb_open(const char *filename, enum parsedbflags flags);
 parsedb_open(const char *filename, enum parsedbflags flags);
+int
+parsedb_parse(struct parsedb_state *ps, struct pkginfo **pkgp);
 void
 void
 parsedb_close(struct parsedb_state *ps);
 parsedb_close(struct parsedb_state *ps);