]> git.deb.at Git - pkg/abook.git/commitdiff
custom output format (3/4): added the --outformatstr option
authorRaphaël Droz <raphael.droz+floss@gmail.com>
Tue, 30 Aug 2011 14:27:44 +0000 (16:27 +0200)
committerRaphaël Droz <raphael.droz+floss@gmail.com>
Wed, 24 Oct 2012 16:24:03 +0000 (18:24 +0200)
* 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
filter.c

diff --git a/abook.c b/abook.c
index 9f956559b361cdcc01662d36a5e3d0d207d319e0..b5a941e259b6467afa32897804dd9b38a3bf3297 100644 (file)
--- 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]);
index a58868c5f8835352204a167cc4393dad7b2cc849..4f20f0060465d29996833c413511b13f3c9849a6 100644 (file)
--- 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 }
 };