summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGuillem Jover <guillem@debian.org>2019-02-23 04:56:14 +0100
committerGuillem Jover <guillem@debian.org>2019-02-23 17:57:18 +0100
commit3a017177110da9f54668b614f78aeb98bf73796d (patch)
tree94965d9a9d6a1c693f2fa97a85d1b2c66f1e677e /lib
parent80b9ae537f0d1d1c1f4dbb7f046c434618ee6363 (diff)
downloaddpkg-3a017177110da9f54668b614f78aeb98bf73796d.tar.gz
libdpkg: Merge nicknames table into fieldinfos
The current code first does a lookup to see if the fieldname is in the nicknames table, if found fixes up the fieldname to the new alias, and then always does a lookup for the normalized name in fieldinfos table. This penalizes the common case (i.e. non-obsolete fieldnames) substantially. Also moving the nicknames into the fieldinfos table will allow to print correct fieldnames on error as those are not mangled any more, and to provide new wrapper parse functions that print warnings for the obsolete fieldnames.
Diffstat (limited to 'lib')
-rw-r--r--lib/dpkg/parse.c29
-rw-r--r--lib/dpkg/parsedump.h8
2 files changed, 7 insertions, 30 deletions
diff --git a/lib/dpkg/parse.c b/lib/dpkg/parse.c
index 2a96e7e46..b5e8a37c7 100644
--- a/lib/dpkg/parse.c
+++ b/lib/dpkg/parse.c
@@ -64,7 +64,6 @@ const struct fieldinfo fieldinfos[]= {
{ FIELD("Multi-Arch"), f_multiarch, w_multiarch, PKGIFPOFF(multiarch) },
{ FIELD("Source"), f_charfield, w_charfield, PKGIFPOFF(source) },
{ FIELD("Version"), f_version, w_version, PKGIFPOFF(version) },
- { FIELD("Revision"), f_revision, w_null },
{ FIELD("Config-Version"), f_configversion, w_configversion },
{ FIELD("Replaces"), f_dependency, w_dependency, dep_replaces },
{ FIELD("Provides"), f_dependency, w_dependency, dep_provides },
@@ -84,17 +83,13 @@ const struct fieldinfo fieldinfos[]= {
{ FIELD("Triggers-Pending"), f_trigpend, w_trigpend },
{ FIELD("Triggers-Awaited"), f_trigaw, w_trigaw },
/* Note that aliases are added to the nicknames table. */
- { NULL }
-};
-
-static const struct nickname nicknames[] = {
- /* Note: Capitalization of these strings is important. */
- { NICK("Recommended"), .canon = "Recommends" },
- { NICK("Optional"), .canon = "Suggests" },
- { NICK("Class"), .canon = "Priority" },
- { NICK("Package-Revision"), .canon = "Revision" },
- { NICK("Package_Revision"), .canon = "Revision" },
- { .nick = NULL }
+ { FIELD("Revision"), f_revision, w_null },
+ { FIELD("Recommended"), f_dependency, w_null },
+ { FIELD("Optional"), f_dependency, w_null },
+ { FIELD("Class"), f_priority, w_null },
+ { FIELD("Package-Revision"), f_revision, w_null },
+ { FIELD("Package_Revision"), f_revision, w_null },
+ { NULL }
};
/**
@@ -116,19 +111,9 @@ pkg_parse_field(struct parsedb_state *ps, struct field_state *fs,
void *parse_obj)
{
struct pkg_parse_object *pkg_obj = parse_obj;
- const struct nickname *nick;
const struct fieldinfo *fip;
int *ip;
- for (nick = nicknames; nick->nick; nick++)
- if (nick->nicklen == (size_t)fs->fieldlen &&
- strncasecmp(nick->nick, fs->fieldstart, fs->fieldlen) == 0)
- break;
- if (nick->nick) {
- fs->fieldstart = nick->canon;
- fs->fieldlen = strlen(fs->fieldstart);
- }
-
for (fip = fieldinfos, ip = fs->fieldencountered; fip->name; fip++, ip++)
if (fip->namelen == (size_t)fs->fieldlen &&
strncasecmp(fip->name, fs->fieldstart, fs->fieldlen) == 0)
diff --git a/lib/dpkg/parsedump.h b/lib/dpkg/parsedump.h
index 8e9a71056..ea29ff317 100644
--- a/lib/dpkg/parsedump.h
+++ b/lib/dpkg/parsedump.h
@@ -158,14 +158,6 @@ void parse_ensure_have_field(struct parsedb_state *ps,
#define MSDOS_EOF_CHAR '\032' /* ^Z */
-#define NICK(name) .nick = name, .nicklen = sizeof(name) - 1
-
-struct nickname {
- const char *nick;
- const char *canon;
- size_t nicklen;
-};
-
extern const struct fieldinfo fieldinfos[];
/** @} */