enforce options definitions to bind the enum and the descriptor

This uses some macro trickery to make sure that there's one-to-one
mapping with the option index enum and the descriptor. The down
side is that enum's are generated via #define's and editors might
not pick them up for auto completion, but the benefits are more:
it's no longer possible have mismatching enum value and descriptor
index, and the amount of source code lines is less.
cute-signatures
Timo Teräs 2020-08-24 13:35:36 +03:00
parent 82de29cf7b
commit edb45ae464
15 changed files with 165 additions and 278 deletions

136
src/apk.c
View File

@ -73,80 +73,48 @@ static struct apk_repository_list *apk_repository_new(const char *url)
return r;
}
enum {
OPT_GLOBAL_allow_untrusted,
OPT_GLOBAL_arch,
OPT_GLOBAL_cache_dir,
OPT_GLOBAL_cache_max_age,
OPT_GLOBAL_force,
OPT_GLOBAL_force_binary_stdout,
OPT_GLOBAL_force_broken_world,
OPT_GLOBAL_force_non_repository,
OPT_GLOBAL_force_old_apk,
OPT_GLOBAL_force_overwrite,
OPT_GLOBAL_force_refresh,
OPT_GLOBAL_help,
OPT_GLOBAL_interactive,
OPT_GLOBAL_keys_dir,
OPT_GLOBAL_no_cache,
OPT_GLOBAL_no_network,
OPT_GLOBAL_no_progress,
OPT_GLOBAL_print_arch,
OPT_GLOBAL_progress,
OPT_GLOBAL_progress_fd,
OPT_GLOBAL_purge,
OPT_GLOBAL_quiet,
OPT_GLOBAL_repositories_file,
OPT_GLOBAL_repository,
OPT_GLOBAL_root,
OPT_GLOBAL_update_cache,
OPT_GLOBAL_verbose,
OPT_GLOBAL_version,
OPT_GLOBAL_wait,
#ifdef TEST_MODE
OPT_GLOBAL_test_instdb,
OPT_GLOBAL_test_repo,
OPT_GLOBAL_test_world,
#endif
};
#define GLOBAL_OPTIONS(OPT) \
OPT(OPT_GLOBAL_allow_untrusted, "allow-untrusted") \
OPT(OPT_GLOBAL_arch, APK_OPT_ARG "arch") \
OPT(OPT_GLOBAL_cache_dir, APK_OPT_ARG "cache-dir") \
OPT(OPT_GLOBAL_cache_max_age, APK_OPT_ARG "cache-max-age") \
OPT(OPT_GLOBAL_force, APK_OPT_SH("f") "force") \
OPT(OPT_GLOBAL_force_binary_stdout, "force-binary-stdout") \
OPT(OPT_GLOBAL_force_broken_world, "force-broken-world") \
OPT(OPT_GLOBAL_force_non_repository, "force-non-repository") \
OPT(OPT_GLOBAL_force_old_apk, "force-old-apk") \
OPT(OPT_GLOBAL_force_overwrite, "force-overwrite") \
OPT(OPT_GLOBAL_force_refresh, "force-refresh") \
OPT(OPT_GLOBAL_help, APK_OPT_SH("h") "help") \
OPT(OPT_GLOBAL_interactive, APK_OPT_SH("i") "interactive") \
OPT(OPT_GLOBAL_keys_dir, APK_OPT_ARG "keys-dir") \
OPT(OPT_GLOBAL_no_cache, "no-cache") \
OPT(OPT_GLOBAL_no_network, "no-network") \
OPT(OPT_GLOBAL_no_progress, "no-progress") \
OPT(OPT_GLOBAL_print_arch, "print-arch") \
OPT(OPT_GLOBAL_progress, "progress") \
OPT(OPT_GLOBAL_progress_fd, APK_OPT_ARG "progress-fd") \
OPT(OPT_GLOBAL_purge, "purge") \
OPT(OPT_GLOBAL_quiet, APK_OPT_SH("q") "quiet") \
OPT(OPT_GLOBAL_repositories_file, APK_OPT_ARG "repositories-file") \
OPT(OPT_GLOBAL_repository, APK_OPT_ARG APK_OPT_SH("x") "repository") \
OPT(OPT_GLOBAL_root, APK_OPT_ARG APK_OPT_SH("p") "root") \
OPT(OPT_GLOBAL_update_cache, APK_OPT_SH("U") "update-cache") \
OPT(OPT_GLOBAL_verbose, APK_OPT_SH("v") "verbose") \
OPT(OPT_GLOBAL_version, APK_OPT_SH("V") "version") \
OPT(OPT_GLOBAL_wait, APK_OPT_ARG "wait") \
#define TEST_OPTIONS(OPT) \
OPT(OPT_GLOBAL_test_instdb, APK_OPT_ARG "test-instdb") \
OPT(OPT_GLOBAL_test_repo, APK_OPT_ARG "test-repo") \
OPT(OPT_GLOBAL_test_world, APK_OPT_ARG "test-world")
static const char optiondesc_global[] =
APK_OPTGROUP("Global")
APK_OPT1n("allow-untrusted")
APK_OPT1R("arch")
APK_OPT1R("cache-dir")
APK_OPT1R("cache-max-age")
APK_OPT2n("force", "f")
APK_OPT1n("force-binary-stdout")
APK_OPT1n("force-broken-world")
APK_OPT1n("force-non-repository")
APK_OPT1n("force-old-apk")
APK_OPT1n("force-overwrite")
APK_OPT1n("force-refresh")
APK_OPT2n("help", "h")
APK_OPT2n("interactive", "i")
APK_OPT1R("keys-dir")
APK_OPT1n("no-cache")
APK_OPT1n("no-network")
APK_OPT1n("no-progress")
APK_OPT1n("print-arch")
APK_OPT1n("progress")
APK_OPT1R("progress-fd")
APK_OPT1n("purge")
APK_OPT2n("quiet", "q")
APK_OPT1R("repositories-file")
APK_OPT2R("repository", "X")
APK_OPT2R("root", "p")
APK_OPT2n("update-cache", "U")
APK_OPT2n("verbose", "v")
APK_OPT2n("version", "V")
APK_OPT1R("wait")
#ifdef TEST_MODE
APK_OPT1R("test-instdb")
APK_OPT1R("test-repo")
APK_OPT1R("test-world")
APK_OPT_GROUP2(optiondesc_global, "Global", GLOBAL_OPTIONS, TEST_OPTIONS);
#else
APK_OPT_GROUP(optiondesc_global, "Global", GLOBAL_OPTIONS);
#endif
;
static int option_parse_global(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
@ -266,23 +234,15 @@ const struct apk_option_group optgroup_global = {
.parse = option_parse_global,
};
enum {
OPT_COMMIT_clean_protected,
OPT_COMMIT_initramfs_diskless_boot,
OPT_COMMIT_no_commit_hooks,
OPT_COMMIT_no_scripts,
OPT_COMMIT_overlay_from_stdin,
OPT_COMMIT_simulate,
};
#define COMMIT_OPTIONS(OPT) \
OPT(OPT_COMMIT_clean_protected, "clean-protected") \
OPT(OPT_COMMIT_initramfs_diskless_boot, "initramfs-diskless-boot") \
OPT(OPT_COMMIT_no_commit_hooks, "no-commit-hooks") \
OPT(OPT_COMMIT_no_scripts, "no-scripts") \
OPT(OPT_COMMIT_overlay_from_stdin, "overlay-from-stdin") \
OPT(OPT_COMMIT_simulate, APK_OPT_SH("s") "simulate")
static const char optiondesc_commit[] =
APK_OPTGROUP("commit")
APK_OPT1n("clean-protected")
APK_OPT1n("initramfs-diskless-boot")
APK_OPT1n("no-commit-hooks")
APK_OPT1n("no-scripts")
APK_OPT1n("overlay-from-stdin")
APK_OPT2n("simulate", "s");
APK_OPT_GROUP(optiondesc_commit, "Commit", COMMIT_OPTIONS);
static int option_parse_commit(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{
@ -387,7 +347,7 @@ static int parse_options(int argc, char **argv, struct apk_applet *applet, void
opt->has_arg = required_argument;
d++;
}
num_short = 1;
num_short = 0;
if ((unsigned char)*d >= 0xf0)
num_short = *d++ & 0x0f;
for (; num_short > 0; num_short--) {

View File

@ -15,12 +15,33 @@
#include "apk_defines.h"
#include "apk_database.h"
#define APK_OPTAPPLET "\x00"
#define APK_OPTGROUP(_name) _name "\x00"
#if 0
#define APK_OPT1n(_opt) "\xf0" _opt "\x00"
#define APK_OPT1R(_opt) "\xaf" "\xf0" _opt "\x00"
#define APK_OPT2n(_opt, _short) _short _opt "\x00"
#define APK_OPT2R(_opt, _short) "\xaf" _short _opt "\x00"
#endif
#define __APK_OPTAPPLET "\x00"
#define __APK_OPTGROUP(_name) _name "\x00"
#define __APK_OPT_ENUM(_enum,__desc) _enum,
#define __APK_OPT_DESC(_enum,__desc) __desc "\x00"
#define APK_OPT_ARG "\xaf"
#define APK_OPT_SH(x) "\xf1" x
#define APK_OPT_S2(x) "\xf2" x
#define APK_OPT_APPLET(var_name, init_macro) \
enum { init_macro(__APK_OPT_ENUM) }; \
static const char var_name[] = __APK_OPTAPPLET init_macro(__APK_OPT_DESC);
#define APK_OPT_GROUP(var_name, group_name, init_macro) \
enum { init_macro(__APK_OPT_ENUM) }; \
static const char var_name[] = __APK_OPTGROUP(group_name) init_macro(__APK_OPT_DESC);
#define APK_OPT_GROUP2(var_name, group_name, init_macro, init_macro2) \
enum { init_macro(__APK_OPT_ENUM) init_macro2(__APK_OPT_ENUM) }; \
static const char var_name[] = __APK_OPTGROUP(group_name) init_macro(__APK_OPT_DESC) init_macro2(__APK_OPT_DESC);
struct apk_option_group {
const char *desc;

View File

@ -21,21 +21,14 @@ struct add_ctx {
unsigned short extract_flags;
};
enum {
OPT_ADD_initdb,
OPT_ADD_latest,
OPT_ADD_no_chown,
OPT_ADD_upgrade,
OPT_ADD_virtual,
};
#define ADD_OPTIONS(OPT) \
OPT(OPT_ADD_initdb, "initdb") \
OPT(OPT_ADD_latest, APK_OPT_SH("l") "latest") \
OPT(OPT_ADD_no_chown, "no-chown") \
OPT(OPT_ADD_upgrade, APK_OPT_SH("u") "upgrade") \
OPT(OPT_ADD_virtual, APK_OPT_ARG APK_OPT_SH("t") "virtual")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT1n("initdb")
APK_OPT2n("latest", "l")
APK_OPT1n("no-chown")
APK_OPT2n("upgrade", "u")
APK_OPT2R("virtual", "t");
APK_OPT_APPLET(option_desc, ADD_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -35,21 +35,14 @@ struct audit_ctx {
unsigned packages_only : 1;
};
enum {
OPT_AUDIT_backup,
OPT_AUDIT_check_permissions,
OPT_AUDIT_packages,
OPT_AUDIT_recursive,
OPT_AUDIT_system,
};
#define AUDIT_OPTIONS(OPT) \
OPT(OPT_AUDIT_backup, "backup") \
OPT(OPT_AUDIT_check_permissions, "check-permissions") \
OPT(OPT_AUDIT_packages, "packages") \
OPT(OPT_AUDIT_recursive, APK_OPT_SH("r") "recursive") \
OPT(OPT_AUDIT_system, "system")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT1n("backup")
APK_OPT1n("check-permissions")
APK_OPT1n("packages")
APK_OPT2n("recursive", "r")
APK_OPT1n("system");
APK_OPT_APPLET(option_desc, AUDIT_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -28,15 +28,11 @@ struct cache_ctx {
unsigned short solver_flags;
};
enum {
OPT_CACHE_latest,
OPT_CACHE_upgrade,
};
#define CACHE_OPTIONS(OPT) \
OPT(OPT_CACHE_latest, APK_OPT_SH("l") "latest") \
OPT(OPT_CACHE_upgrade, APK_OPT_SH("u") "upgrade")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("latest", "l")
APK_OPT2n("upgrade", "u");
APK_OPT_APPLET(option_desc, CACHE_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -19,13 +19,10 @@ struct del_ctx {
int errors;
};
enum {
OPT_DEL_redepends,
};
#define DEL_OPTIONS(OPT) \
OPT(OPT_DEL_redepends, APK_OPT_SH("r") "rdepends")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("rdepends", "r");
APK_OPT_APPLET(option_desc, DEL_OPTIONS);
static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -22,15 +22,11 @@ struct dot_ctx {
int installed_only : 1;
};
enum {
OPT_DOT_errors,
OPT_DOT_installed,
};
#define DOT_OPTIONS(OPT) \
OPT(OPT_DOT_errors, "errors") \
OPT(OPT_DOT_installed, "installed")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT1n("errors")
APK_OPT1n("installed");
APK_OPT_APPLET(option_desc, DOT_OPTIONS);
static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -66,21 +66,14 @@ static int cup(void)
return write(STDOUT_FILENO, buf, len) != len;
}
enum {
OPT_FETCH_link,
OPT_FETCH_recursive,
OPT_FETCH_output,
OPT_FETCH_simulate,
OPT_FETCH_stdout,
};
#define FETCH_OPTIONS(OPT) \
OPT(OPT_FETCH_link, APK_OPT_SH("l") "link") \
OPT(OPT_FETCH_recursive, APK_OPT_SH("R") "recursive") \
OPT(OPT_FETCH_output, APK_OPT_ARG APK_OPT_SH("o") "output") \
OPT(OPT_FETCH_simulate, "simulate") \
OPT(OPT_FETCH_stdout, APK_OPT_SH("s") "stdout")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("link", "l")
APK_OPT2n("recursive", "R")
APK_OPT2R("output", "o")
APK_OPT1n("simulate")
APK_OPT2n("stdout", "s");
APK_OPT_APPLET(option_desc, FETCH_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -22,21 +22,14 @@ struct fix_ctx {
int errors;
};
enum {
OPT_FIX_depends,
OPT_FIX_directory_permissions,
OPT_FIX_reinstall,
OPT_FIX_upgrade,
OPT_FIX_xattr,
};
#define FIX_OPTIONS(OPT) \
OPT(OPT_FIX_depends, APK_OPT_SH("d") "depends") \
OPT(OPT_FIX_directory_permissions, "directory-permissions") \
OPT(OPT_FIX_reinstall, APK_OPT_SH("r") "reinstall") \
OPT(OPT_FIX_upgrade, APK_OPT_SH("u") "upgrade") \
OPT(OPT_FIX_xattr, APK_OPT_SH("x") "xattr")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("depends", "d")
APK_OPT1n("directory-permissions")
APK_OPT2n("reinstall", "r")
APK_OPT2n("upgrade", "u")
APK_OPT2n("xattr", "x");
APK_OPT_APPLET(option_desc, FIX_OPTIONS);
static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -33,21 +33,14 @@ struct index_ctx {
unsigned short index_flags;
};
enum {
OPT_INDEX_description,
OPT_INDEX_index,
OPT_INDEX_no_warnings,
OPT_INDEX_output,
OPT_INDEX_rewrite_arch,
};
#define INDEX_OPTIONS(OPT) \
OPT(OPT_INDEX_description, APK_OPT_ARG APK_OPT_SH("d") "description") \
OPT(OPT_INDEX_index, APK_OPT_ARG APK_OPT_SH("x") "index") \
OPT(OPT_INDEX_no_warnings, "no-warnings") \
OPT(OPT_INDEX_output, APK_OPT_ARG APK_OPT_SH("o") "output") \
OPT(OPT_INDEX_rewrite_arch, APK_OPT_ARG "rewrite-arch")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2R("description", "d")
APK_OPT2R("index", "x")
APK_OPT1n("no-warnings")
APK_OPT2R("output", "o")
APK_OPT1R("rewrite-arch");
APK_OPT_APPLET(option_desc, INDEX_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -364,41 +364,24 @@ static void print_name_info(struct apk_database *db, const char *match, struct a
info_subaction(ctx, p->pkg);
}
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,
};
#define INFO_OPTIONS(OPT) \
OPT(OPT_INFO_all, APK_OPT_SH("a") "all") \
OPT(OPT_INFO_contents, APK_OPT_SH("L") "contents") \
OPT(OPT_INFO_depends, APK_OPT_SH("R") "depends") \
OPT(OPT_INFO_description, APK_OPT_SH("d") "description") \
OPT(OPT_INFO_install_if, "install-if") \
OPT(OPT_INFO_installed, APK_OPT_SH("e") "installed") \
OPT(OPT_INFO_license, "license") \
OPT(OPT_INFO_provides, APK_OPT_SH("P") "provides") \
OPT(OPT_INFO_rdepends, APK_OPT_SH("r") "rdepends") \
OPT(OPT_INFO_replaces, "replaces") \
OPT(OPT_INFO_rinstall_if, "rinstall-if") \
OPT(OPT_INFO_size, APK_OPT_SH("s") "size") \
OPT(OPT_INFO_triggers, APK_OPT_SH("t") "triggers") \
OPT(OPT_INFO_webpage, APK_OPT_SH("w") "webpage") \
OPT(OPT_INFO_who_owns, APK_OPT_SH("W") "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");
APK_OPT_APPLET(option_desc, INFO_OPTIONS);
static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -177,25 +177,16 @@ static void print_result(struct apk_database *db, const char *match, struct apk_
iterate_providers(name, ctx);
}
enum {
OPT_LIST_available,
OPT_LIST_installed,
OPT_LIST_depends,
OPT_LIST_origin,
OPT_LIST_orphaned,
OPT_LIST_providers,
OPT_LIST_upgradeable,
};
#define LIST_OPTIONS(OPT) \
OPT(OPT_LIST_available, APK_OPT_SH("a") "available") \
OPT(OPT_LIST_installed, APK_OPT_SH("I") "installed") \
OPT(OPT_LIST_depends, APK_OPT_SH("d") "depends") \
OPT(OPT_LIST_origin, APK_OPT_SH("o") "origin") \
OPT(OPT_LIST_orphaned, APK_OPT_SH("O") "orphaned") \
OPT(OPT_LIST_providers, APK_OPT_SH("P") "providers") \
OPT(OPT_LIST_upgradeable, APK_OPT_SH("u") "upgradeable")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("available", "a")
APK_OPT2n("installed", "I")
APK_OPT2n("depends", "d")
APK_OPT2n("origin", "o")
APK_OPT2n("orphaned", "O")
APK_OPT2n("providers", "P")
APK_OPT2n("upgradeable", "u");
APK_OPT_APPLET(option_desc, LIST_OPTIONS);
static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -72,23 +72,15 @@ static void print_rdepends(struct search_ctx *ctx, struct apk_package *pkg)
apk_pkg_foreach_reverse_dependency(pkg, ctx->matches, print_rdep_pkg, ctx);
}
enum {
OPT_SEARCH_all,
OPT_SEARCH_description,
OPT_SEARCH_exact,
OPT_SEARCH_has_origin,
OPT_SEARCH_origin,
OPT_SEARCH_rdepends,
};
#define SEARCH_OPTIONS(OPT) \
OPT(OPT_SEARCH_all, APK_OPT_SH("a") "all") \
OPT(OPT_SEARCH_description, APK_OPT_SH("d") "description") \
OPT(OPT_SEARCH_exact, APK_OPT_S2("ex") "exact") \
OPT(OPT_SEARCH_has_origin, "has-origin") \
OPT(OPT_SEARCH_origin, APK_OPT_SH("o") "origin") \
OPT(OPT_SEARCH_rdepends, APK_OPT_SH("r") "rdepends") \
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("all", "a")
APK_OPT2n("description", "d")
APK_OPT2n("exact", "\xf2""ex")
APK_OPT1n("has-origin")
APK_OPT2n("origin", "o")
APK_OPT2n("rdepends", "r");
APK_OPT_APPLET(option_desc, SEARCH_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -24,21 +24,14 @@ struct upgrade_ctx {
int errors;
};
enum {
OPT_UPGRADE_available,
OPT_UPGRADE_ignore,
OPT_UPGRADE_latest,
OPT_UPGRADE_no_self_upgrade,
OPT_UPGRADE_self_upgrade_only,
};
#define UPGRADE_OPTIONS(OPT) \
OPT(OPT_UPGRADE_available, APK_OPT_SH("a") "available") \
OPT(OPT_UPGRADE_ignore, "ignore") \
OPT(OPT_UPGRADE_latest, APK_OPT_SH("l") "latest") \
OPT(OPT_UPGRADE_no_self_upgrade, "no-self-upgrade") \
OPT(OPT_UPGRADE_self_upgrade_only, "self-upgrade-only")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("available", "a")
APK_OPT1n("ignore")
APK_OPT2n("latest", "l")
APK_OPT1n("no-self-upgrade")
APK_OPT1n("self-upgrade-only");
APK_OPT_APPLET(option_desc, UPGRADE_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{

View File

@ -66,21 +66,14 @@ static int ver_validate(struct apk_database *db, struct apk_string_array *args)
return errors;
}
enum {
OPT_VERSION_all,
OPT_VERSION_check,
OPT_VERSION_indexes,
OPT_VERSION_limit,
OPT_VERSION_test,
};
#define VERSION_OPTIONS(OPT) \
OPT(OPT_VERSION_all, APK_OPT_SH("a") "all") \
OPT(OPT_VERSION_check, APK_OPT_SH("c") "check") \
OPT(OPT_VERSION_indexes, APK_OPT_SH("I") "indexes") \
OPT(OPT_VERSION_limit, APK_OPT_ARG APK_OPT_SH("l") "limit") \
OPT(OPT_VERSION_test, APK_OPT_SH("t") "test")
static const char option_desc[] =
APK_OPTAPPLET
APK_OPT2n("all", "a")
APK_OPT2n("check", "c")
APK_OPT2n("indexes", "I")
APK_OPT2R("limit", "l")
APK_OPT2n("test", "t");
APK_OPT_APPLET(option_desc, VERSION_OPTIONS);
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg)
{