diff options
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/info.c | 30 | ||||
-rw-r--r-- | src/search.c | 148 |
3 files changed, 150 insertions, 29 deletions
diff --git a/src/Makefile b/src/Makefile index 30fa0c7..b9414ae 100644 --- a/src/Makefile +++ b/src/Makefile @@ -26,6 +26,7 @@ apk_OBJS = \ ver.o \ index.o \ info.o \ + search.o \ audit.o \ apk.o @@ -35,30 +35,6 @@ static int info_list(struct apk_database *db, int argc, char **argv) return 0; } -static int info_repo_pkgs_print(apk_hash_item item, void *ctx) -{ - struct apk_database *db = (struct apk_database *) ctx; - struct apk_package *pkg = (struct apk_package *) item; - - printf("%s", pkg->name->name); - if (apk_verbosity > 0) - printf("-%s", pkg->version); - if (apk_verbosity > 1) { - printf("\n\t%s", db->repos[pkg->repos].url); - printf("\n\t%s", pkg->description); - } - printf("\n"); - - return 0; -} - -static int info_repo_pkgs(struct apk_database *db, int argc, char **argv) -{ - apk_hash_foreach(&db->available.packages, info_repo_pkgs_print, db); - - return 0; -} - static int info_exists(struct apk_database *db, int argc, char **argv) { struct apk_name *name; @@ -207,9 +183,6 @@ static int info_parse(void *ctx, int optch, int optindex, const char *optarg) case 'R': ictx->action = info_depends; break; - case 'o': - ictx->action = info_repo_pkgs; - break; default: return -1; } @@ -239,12 +212,11 @@ static struct option info_options[] = { { "installed", no_argument, NULL, 'e' }, { "who-owns", no_argument, NULL, 'W' }, { "depends", no_argument, NULL, 'R' }, - { "repo-pkgs", no_argument, NULL, 'o' }, }; static struct apk_applet apk_info = { .name = "info", - .usage = "[--repo-pkgs|-o]", + .usage = "", .context_size = sizeof(struct info_ctx), .num_options = ARRAY_SIZE(info_options), .options = info_options, diff --git a/src/search.c b/src/search.c new file mode 100644 index 0000000..dbbc2f4 --- /dev/null +++ b/src/search.c @@ -0,0 +1,148 @@ +/* info.c - Alpine Package Keeper (APK) + * + * Copyright (C) 2005-2009 Natanael Copa <n@tanael.org> + * Copyright (C) 2009 Timo Teräs <timo.teras@iki.fi> + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. See http://www.gnu.org/ for details. + */ + +#include <stdio.h> +#include "apk_defines.h" +#include "apk_applet.h" +#include "apk_package.h" +#include "apk_database.h" +#include "apk_state.h" + +struct search_ctx { + int (*action)(struct apk_database *db, int argc, char **argv); +}; + +struct search_query_ctx { + struct apk_database *db; + const char *query; +}; + +static int search_list_print(apk_hash_item item, void *ctx) +{ + //struct apk_database *db = (struct apk_database *) ctx; + struct apk_package *pkg = (struct apk_package *) item; + + printf("%s", pkg->name->name); + if (apk_verbosity > 0) + printf("-%s", pkg->version); + if (apk_verbosity > 1) { + printf(" - %s", pkg->description); + } + printf("\n"); + + return 0; +} + +static int search_query_print(apk_hash_item item, void *ctx) +{ + struct search_query_ctx *ictx = (struct search_query_ctx *) ctx; + struct apk_package *pkg = (struct apk_package *) item; + + if( strstr(pkg->name->name, ictx->query) == NULL ) + return 0; + search_list_print(item, ictx->db); + + return 0; +} + +static int search_list(struct apk_database *db, int argc, char **argv) +{ + int i; + struct search_query_ctx ctx; + + ctx.db = db; + + if (argc == 0) + apk_hash_foreach(&db->available.packages, search_list_print, db); + else + for (i=0; i<argc; i++) { + ctx.query = argv[i]; + apk_hash_foreach(&db->available.packages, search_query_print, &ctx); + } + + return 0; +} + +static int search_query_desc_print(apk_hash_item item, void *ctx) +{ + struct search_query_ctx *ictx = (struct search_query_ctx *) ctx; + struct apk_package *pkg = (struct apk_package *) item; + + if( strstr(pkg->description, ictx->query) == NULL ) + return 0; + search_list_print(item, ictx->db); + + return 0; +} + +static int search_desc(struct apk_database *db, int argc, char **argv) +{ + int i; + struct search_query_ctx ctx; + + ctx.db = db; + + for (i=0; i<argc; i++) { + ctx.query = argv[i]; + apk_hash_foreach(&db->available.packages, search_query_desc_print, &ctx); + } + + return 0; +} + +static int search_parse(void *ctx, int optch, int optindex, const char *optarg) +{ + struct search_ctx *ictx = (struct search_ctx *) ctx; + + switch (optch) { + case 'd': + ictx->action = search_desc; + break; + default: + return -1; + } + return 0; +} + +static int search_main(void *ctx, int argc, char **argv) +{ + struct search_ctx *ictx = (struct search_ctx *) ctx; + struct apk_database db; + int r; + + if (apk_db_open(&db, apk_root, APK_OPENF_READ) < 0) + return -1; + + if (ictx->action != NULL) + r = ictx->action(&db, argc, argv); + else + r = search_list(&db, argc, argv); + + apk_db_close(&db); + return r; +} + +static struct option search_options[] = { + { "description", no_argument, NULL, 'd' }, +}; + +static struct apk_applet apk_search = { + .name = "search", + .usage = "[--description|-d] [search_pattern]", + .context_size = sizeof(struct search_ctx), + .num_options = ARRAY_SIZE(search_options), + .options = search_options, + .parse = search_parse, + .main = search_main, +}; + +APK_DEFINE_APPLET(apk_search); + |