X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=abook.c;h=502aae228ed1b11f293ccd3c06e0b7225a97d63e;hb=ca5c3086c7ff9c99645a66fd0c21167ef60ba0e9;hp=e9f8841dccee9c3eb23be9a2e882e3be2fdcb99f;hpb=141acfcc1bb611ec8b1bafd229bb34845feadd51;p=pkg%2Fabook.git diff --git a/abook.c b/abook.c index e9f8841..502aae2 100644 --- a/abook.c +++ b/abook.c @@ -50,6 +50,8 @@ static void add_email(int); char *datafile = NULL; static char *rcfile = NULL; +// custom formatting +char custom_format[FORMAT_STRING_LEN] = "{nick} ({name}): {mobile}"; struct abook_output_item_filter selected_item_filter; bool alternative_datafile = FALSE; @@ -316,6 +318,7 @@ parse_command_line(int argc, char **argv) OPT_CONVERT, OPT_INFORMAT, OPT_OUTFORMAT, + OPT_OUTFORMAT_STR, OPT_INFILE, OPT_OUTFILE, OPT_FORMATS @@ -330,13 +333,14 @@ 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 }, { 0, 0, 0, 0 } }; - c = getopt_long(argc, argv, "hC:", + c = getopt_long(argc, argv, "hC:f:", long_options, &option_index); if(c == -1) @@ -371,9 +375,22 @@ parse_command_line(int argc, char **argv) set_convert_var(informat); break; case OPT_OUTFORMAT: + if(mode != MODE_CONVERT && mode != MODE_QUERY) { + fprintf(stderr, + _("please use option --outformat after --convert or --mutt-query option\n")); + exit(EXIT_FAILURE); + } + // ascii-name is stored, it's used to traverse + // e_filters[] in MODE_CONVERT (see export_file()) outformat = optarg; + // but in case a query-compatible filter is requested + // try to guess right now which one it is, from u_filters[] selected_item_filter = select_output_item_filter(outformat); break; + case OPT_OUTFORMAT_STR: + strncpy(custom_format, optarg, FORMAT_STRING_LEN); + custom_format[FORMAT_STRING_LEN - 1] = 0; + break; case OPT_INFILE: set_convert_var(infile); break; @@ -388,8 +405,20 @@ parse_command_line(int argc, char **argv) } } + // if the output format requested does not allow filtered querying + // (not in u_filter[]) and --convert has not been specified; bailout + if(! selected_item_filter.func && mode != MODE_CONVERT) { + printf("output format %s not supported or incompatible with --mutt-query\n", outformat); + exit(EXIT_FAILURE); + } if(! selected_item_filter.func) selected_item_filter = select_output_item_filter("muttq"); + else if (! strcmp(outformat, "custom")) { + if(! *custom_format) { + fprintf(stderr, _("Invalid custom format string\n")); + exit(EXIT_FAILURE); + } + } if(optind < argc) { fprintf(stderr, _("%s: unrecognized arguments on command line\n"), argv[0]); @@ -412,10 +441,10 @@ parse_command_line(int argc, char **argv) static void show_usage() { - puts (PACKAGE " v " VERSION "\n"); + puts (PACKAGE " v" VERSION "\n"); puts (_(" -h --help show usage")); puts (_(" -C --config use an alternative configuration file")); - puts (_(" --datafile use an alternative addressbook file")); + puts (_(" -f --datafile use an alternative addressbook file")); puts (_(" --mutt-query make a query for mutt")); puts (_(" --add-email " "read an e-mail message from stdin and\n" @@ -435,6 +464,8 @@ show_usage() puts (_(" (default: text)")); puts (_(" --outfile destination file")); puts (_(" (default: stdout)")); + puts (_(" --outformatstr format to use for \"custom\" --outformat")); + puts (_(" (default: \"{nick} ({name}): {mobile}\")")); puts (_(" --formats list available formats")); } @@ -466,7 +497,12 @@ mutt_query(char *str) printf("Not found\n"); quit_mutt_query(EXIT_FAILURE); } - putchar('\n'); + // mutt expects a leading line containing + // a message about the query. + // Others output filter supporting query (vcard, custom) + // don't needs this. + if(!strcmp(selected_item_filter.filtname, "muttq")) + putchar('\n'); while(i >= 0) { e_write_item(stdout, i, selected_item_filter.func); i = find_item(str, i + 1, search_fields); @@ -663,7 +699,7 @@ convert(char *srcformat, char *srcfile, char *dstformat, char *dstfile) * --add-email handling */ -static int add_email_count = 0; +static int add_email_count = 0, add_email_found = 0; static void quit_add_email() @@ -674,7 +710,7 @@ quit_add_email() exit(EXIT_FAILURE); } printf(_("%d item(s) added to %s\n"), add_email_count, datafile); - } else { + } else if (add_email_found == 0) { puts(_("Valid sender address not found")); } @@ -773,6 +809,7 @@ add_email(int quiet) do { line = getaline(stdin); if(line && !strncasecmp("From:", line, 5) ) { + add_email_found++; getname(line, &name, &email); add_email_count += add_email_add_item(quiet, name, email);