summaryrefslogtreecommitdiffstats
path: root/lib/dpkg/parsedump.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dpkg/parsedump.h')
-rw-r--r--lib/dpkg/parsedump.h176
1 files changed, 176 insertions, 0 deletions
diff --git a/lib/dpkg/parsedump.h b/lib/dpkg/parsedump.h
new file mode 100644
index 0000000..31b0bdc
--- /dev/null
+++ b/lib/dpkg/parsedump.h
@@ -0,0 +1,176 @@
+/*
+ * libdpkg - Debian packaging suite library routines
+ * parsedump.h - declarations for in-core database reading/writing
+ *
+ * Copyright © 1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
+ * Copyright © 2001 Wichert Akkerman
+ * Copyright © 2008-2011 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef LIBDPKG_PARSEDUMP_H
+#define LIBDPKG_PARSEDUMP_H
+
+#include <stdint.h>
+
+#include <dpkg/error.h>
+
+DPKG_BEGIN_DECLS
+
+/**
+ * @defgroup parsedump In-core package database parsing and reading
+ * @ingroup dpkg-public
+ * @{
+ */
+
+struct fieldinfo;
+
+/**
+ * Parse action.
+ */
+enum parsedbtype {
+ pdb_file_update,
+ pdb_file_status,
+ pdb_file_control,
+ pdb_file_available,
+};
+
+struct parsedb_state {
+ enum parsedbtype type;
+ enum parsedbflags flags;
+ struct dpkg_error err;
+ struct varbuf errmsg;
+ struct pkginfo *pkg;
+ struct pkgbin *pkgbin;
+ char *data;
+ char *dataptr;
+ char *endptr;
+ const char *filename;
+ int fd;
+ int lno;
+};
+
+#define parse_at_eof(ps) ((ps)->dataptr >= (ps)->endptr)
+#define parse_getc(ps) *(ps)->dataptr++
+#define parse_ungetc(c, ps) (ps)->dataptr--
+
+struct field_state {
+ const char *fieldstart;
+ const char *valuestart;
+ struct varbuf value;
+ int fieldlen;
+ int valuelen;
+ int *fieldencountered;
+};
+
+struct parsedb_state *
+parsedb_new(const char *filename, int fd, enum parsedbflags flags);
+struct parsedb_state *
+parsedb_open(const char *filename, enum parsedbflags flags);
+void
+parsedb_load(struct parsedb_state *ps);
+int
+parsedb_parse(struct parsedb_state *ps, struct pkginfo **pkgp);
+void
+parsedb_close(struct parsedb_state *ps);
+
+typedef void parse_field_func(struct parsedb_state *ps, struct field_state *fs,
+ void *parse_obj);
+
+bool parse_stanza(struct parsedb_state *ps, struct field_state *fs,
+ parse_field_func *parse_field, void *parse_obj);
+
+#define STRUCTFIELD(klass, off, type) (*(type *)((uintptr_t)(klass) + (off)))
+
+#define PKGIFPOFF(f) (offsetof(struct pkgbin, f))
+#define ARCHIVEFOFF(f) (offsetof(struct archivedetails, f))
+
+typedef void freadfunction(struct pkginfo *pkg, struct pkgbin *pkgbin,
+ struct parsedb_state *ps,
+ const char *value, const struct fieldinfo *fip);
+freadfunction f_name;
+freadfunction f_charfield;
+freadfunction f_priority;
+freadfunction f_obs_class;
+freadfunction f_section;
+freadfunction f_status;
+freadfunction f_boolean;
+freadfunction f_dependency;
+freadfunction f_conffiles;
+freadfunction f_version;
+freadfunction f_obs_revision;
+freadfunction f_obs_dependency;
+freadfunction f_configversion;
+freadfunction f_multiarch;
+freadfunction f_architecture;
+freadfunction f_trigpend, f_trigaw;
+freadfunction f_archives;
+
+enum fwriteflags {
+ /** Print field header and trailing newline. */
+ fw_printheader = DPKG_BIT(0),
+};
+
+typedef void fwritefunction(struct varbuf*,
+ const struct pkginfo *, const struct pkgbin *,
+ enum fwriteflags flags, const struct fieldinfo*);
+fwritefunction w_name, w_charfield, w_priority, w_section, w_status, w_configversion;
+fwritefunction w_version, w_null, w_booleandefno, w_dependency, w_conffiles;
+fwritefunction w_multiarch;
+fwritefunction w_architecture;
+fwritefunction w_trigpend, w_trigaw;
+fwritefunction w_archives;
+
+void
+varbuf_add_arbfield(struct varbuf *vb, const struct arbitraryfield *arbfield,
+ enum fwriteflags flags);
+
+#define FIELD(name) name, sizeof(name) - 1
+
+struct fieldinfo {
+ const char *name;
+ size_t namelen;
+ freadfunction *rcall;
+ fwritefunction *wcall;
+ size_t integer;
+};
+
+int
+parse_db_version(struct parsedb_state *ps,
+ struct dpkg_version *version, const char *value)
+ DPKG_ATTR_REQRET;
+
+void parse_error(struct parsedb_state *ps, const char *fmt, ...)
+ DPKG_ATTR_NORET DPKG_ATTR_PRINTF(2);
+void parse_warn(struct parsedb_state *ps, const char *fmt, ...)
+ DPKG_ATTR_PRINTF(2);
+void
+parse_problem(struct parsedb_state *ps, const char *fmt, ...)
+ DPKG_ATTR_PRINTF(2);
+
+void parse_must_have_field(struct parsedb_state *ps,
+ const char *value, const char *what);
+void parse_ensure_have_field(struct parsedb_state *ps,
+ const char **value, const char *what);
+
+#define MSDOS_EOF_CHAR '\032' /* ^Z */
+
+extern const struct fieldinfo fieldinfos[];
+
+/** @} */
+
+DPKG_END_DECLS
+
+#endif /* LIBDPKG_PARSEDUMP_H */