From fa167822d1f3426ce75bb36b4080e64537ae6362 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Droz?= Date: Tue, 30 Aug 2011 16:27:44 +0200 Subject: [PATCH] custom output format (3/4): added the --outformatstr option * Allows the definition of a custom output format using placeholders. * Registers the two functions: custom_export_database() and custom_print_item() respectively for e_filters and u_filters. --outformatstr only applies if --outformat=custom has been specified and if we are querying the database (presence of the --mutt-query option) If the first character of --outformatstr is a '!', then each entry is checked before output: it will be full skipped if any of its fields among those requested is NULL. Example: $ abook --mutt-query "Max" --outformat custom --outformatstr "!{nick}: {mobile}" max: +336863331XX While querying is no more mutt-centric the --mutt-query option name has *not* been duplicated nor renamed, given its wide use. (http://sourceforge.net/mailarchive/message.php?msg_id=27849095) --- abook.c | 11 +++++++++++ filter.c | 2 ++ 2 files changed, 13 insertions(+) diff --git a/abook.c b/abook.c index 9f95655..b5a941e 100644 --- a/abook.c +++ b/abook.c @@ -320,6 +320,7 @@ parse_command_line(int argc, char **argv) OPT_CONVERT, OPT_INFORMAT, OPT_OUTFORMAT, + OPT_OUTFORMAT_STR, OPT_INFILE, OPT_OUTFILE, OPT_FORMATS @@ -334,6 +335,7 @@ parse_command_line(int argc, char **argv) { "convert", 0, 0, OPT_CONVERT }, { "informat", 1, 0, OPT_INFORMAT }, { "outformat", 1, 0, OPT_OUTFORMAT }, + { "outformatstr", 1, 0, OPT_OUTFORMAT_STR }, { "infile", 1, 0, OPT_INFILE }, { "outfile", 1, 0, OPT_OUTFILE }, { "formats", 0, 0, OPT_FORMATS }, @@ -378,6 +380,10 @@ parse_command_line(int argc, char **argv) outformat = optarg; selected_item_filter = select_output_item_filter(outformat); break; + case OPT_OUTFORMAT_STR: + strncpy(custom_format, optarg, FORMAT_STRING_LEN - 1); + custom_format[FORMAT_STRING_LEN] = 0; + break; case OPT_INFILE: set_convert_var(infile); break; @@ -394,6 +400,11 @@ parse_command_line(int argc, char **argv) if(! selected_item_filter.func) selected_item_filter = select_output_item_filter("muttq"); + else if (! strcmp(outformat, "custom") && *custom_format) { + parsed_custom_format = (char *)malloc(FORMAT_STRING_LEN * sizeof(char*)); + custom_format_fields = (enum field_types *)malloc(FORMAT_STRING_MAX_FIELDS * sizeof(enum field_types *)); + parse_custom_format(custom_format, parsed_custom_format, custom_format_fields); + } if(optind < argc) { fprintf(stderr, _("%s: unrecognized arguments on command line\n"), argv[0]); diff --git a/filter.c b/filter.c index a58868c..4f20f00 100644 --- a/filter.c +++ b/filter.c @@ -100,11 +100,13 @@ struct abook_output_filter e_filters[] = { { "wl", N_("Wanderlust address book"), wl_export_database }, { "spruce", N_("Spruce address book"), spruce_export_database }, { "bsdcal", N_("BSD calendar"), bsdcal_export_database }, + { "custom", N_("Custom format"), custom_export_database }, { "\0", NULL, NULL } }; struct abook_output_item_filter u_filters[] = { { "muttq", N_("mutt alias"), muttq_print_item }, + { "custom", N_("Custom format"), custom_print_item }, { "\0", NULL } }; -- 2.39.2