summaryrefslogtreecommitdiff
path: root/src/app_info.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2020-05-04 21:45:11 +0300
committerTimo Teräs <timo.teras@iki.fi>2020-05-06 13:05:25 +0300
commit1d7123d83796182f851ccccaf056063955343718 (patch)
treeca675fd3363af3584694d0db5a3b65e618ae894b /src/app_info.c
parent791f93fcbe7a543e0bb844887ba395be8ed8ea44 (diff)
downloadapk-tools-1d7123d83796182f851ccccaf056063955343718.tar.gz
apk-tools-1d7123d83796182f851ccccaf056063955343718.tar.bz2
apk-tools-1d7123d83796182f851ccccaf056063955343718.tar.xz
apk-tools-1d7123d83796182f851ccccaf056063955343718.zip
rewrite option descriptors to be single string
This reduces the number of relocations on PIE binaries, and also reduces the executable size. Parsing of the options is slightly sped up as only the exact matching option group parser is called.
Diffstat (limited to 'src/app_info.c')
-rw-r--r--src/app_info.c92
1 files changed, 54 insertions, 38 deletions
diff --git a/src/app_info.c b/src/app_info.c
index 9b2bcb1..553dd2e 100644
--- a/src/app_info.c
+++ b/src/app_info.c
@@ -366,57 +366,93 @@ static void print_name_info(struct apk_database *db, const char *match, struct a
info_subaction(ctx, p->pkg);
}
-static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg)
+enum {
+ OPT_INFO_all,
+ OPT_INFO_contents,
+ OPT_INFO_depends,
+ OPT_INFO_description,
+ OPT_INFO_install_if,
+ OPT_INFO_installed,
+ OPT_INFO_license,
+ OPT_INFO_provides,
+ OPT_INFO_rdepends,
+ OPT_INFO_replaces,
+ OPT_INFO_rinstall_if,
+ OPT_INFO_size,
+ OPT_INFO_triggers,
+ OPT_INFO_webpage,
+ OPT_INFO_who_owns,
+};
+
+static const char option_desc[] =
+ APK_OPTAPPLET
+ APK_OPT2n("all", "a")
+ APK_OPT2n("contents", "L")
+ APK_OPT2n("depends", "R")
+ APK_OPT2n("description", "d")
+ APK_OPT1n("install-if")
+ APK_OPT2n("installed", "e")
+ APK_OPT1n("license")
+ APK_OPT2n("provides", "P")
+ APK_OPT2n("rdepends", "r")
+ APK_OPT1n("replaces")
+ APK_OPT1n("rinstall-if")
+ APK_OPT2n("size", "s")
+ APK_OPT2n("triggers", "t")
+ APK_OPT2n("webpage", "w")
+ APK_OPT2n("who-owns", "W");
+
+static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
struct info_ctx *ctx = (struct info_ctx *) pctx;
ctx->action = NULL;
- switch (optch) {
- case 'e':
+ switch (opt) {
+ case OPT_INFO_installed:
ctx->action = info_exists;
dbopts->open_flags |= APK_OPENF_NO_REPOS;
break;
- case 'W':
+ case OPT_INFO_who_owns:
ctx->action = info_who_owns;
dbopts->open_flags |= APK_OPENF_NO_REPOS;
break;
- case 'w':
+ case OPT_INFO_webpage:
ctx->subaction_mask |= APK_INFO_URL;
break;
- case 'R':
+ case OPT_INFO_depends:
ctx->subaction_mask |= APK_INFO_DEPENDS;
break;
- case 'P':
+ case OPT_INFO_provides:
ctx->subaction_mask |= APK_INFO_PROVIDES;
break;
- case 'r':
+ case OPT_INFO_rdepends:
ctx->subaction_mask |= APK_INFO_RDEPENDS;
break;
- case 0x10002:
+ case OPT_INFO_install_if:
ctx->subaction_mask |= APK_INFO_INSTALL_IF;
break;
- case 0x10003:
+ case OPT_INFO_rinstall_if:
ctx->subaction_mask |= APK_INFO_RINSTALL_IF;
break;
- case 's':
+ case OPT_INFO_size:
ctx->subaction_mask |= APK_INFO_SIZE;
break;
- case 'd':
+ case OPT_INFO_description:
ctx->subaction_mask |= APK_INFO_DESC;
break;
- case 'L':
+ case OPT_INFO_contents:
ctx->subaction_mask |= APK_INFO_CONTENTS;
break;
- case 't':
+ case OPT_INFO_triggers:
ctx->subaction_mask |= APK_INFO_TRIGGERS;
break;
- case 0x10000:
+ case OPT_INFO_replaces:
ctx->subaction_mask |= APK_INFO_REPLACES;
break;
- case 0x10001:
+ case OPT_INFO_license:
ctx->subaction_mask |= APK_INFO_LICENSE;
break;
- case 'a':
+ case OPT_INFO_all:
ctx->subaction_mask = 0xffffffff;
break;
default:
@@ -449,28 +485,8 @@ static int info_main(void *ctx, struct apk_database *db, struct apk_string_array
return ictx->errors;
}
-static const struct apk_option options_applet[] = {
- { 'L', "contents" },
- { 'e', "installed" },
- { 'W', "who-owns" },
- { 'R', "depends" },
- { 'P', "provides" },
- { 'r', "rdepends" },
- { 0x10000, "replaces" },
- { 0x10002, "install-if" },
- { 0x10003, "rinstall-if" },
- { 'w', "webpage" },
- { 's', "size" },
- { 'd', "description" },
- { 0x10001, "license" },
- { 't', "triggers" },
- { 'a', "all" },
-};
-
static const struct apk_option_group optgroup_applet = {
- .name = "Info",
- .options = options_applet,
- .num_options = ARRAY_SIZE(options_applet),
+ .desc = option_desc,
.parse = option_parse_applet,
};