X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=abook.c;h=dd05b5679bfa390675c6d5f48c95a46c07d3cea6;hb=7c88cafcd333277b6bfd55370a5ec1c5b76c2b0d;hp=c4d239ee2241b24ae4750646b0b3660beda969b7;hpb=3370ba68ac9cbbd583da6997c039b29b0fc43b7a;p=pkg%2Fabook.git diff --git a/abook.c b/abook.c index c4d239e..dd05b56 100644 --- a/abook.c +++ b/abook.c @@ -50,6 +50,12 @@ static void add_email(int); char *datafile = NULL; static char *rcfile = NULL; +// custom formatting +char custom_format[FORMAT_STRING_LEN] = "{nick} ({name}): {mobile}"; +char *parsed_custom_format = NULL; +enum field_types *custom_format_fields = 0; +struct abook_output_item_filter selected_item_filter; + bool alternative_datafile = FALSE; bool alternative_rcfile = FALSE; @@ -187,9 +193,11 @@ int main(int argc, char **argv) { #if defined(HAVE_SETLOCALE) && defined(HAVE_LOCALE_H) - setlocale(LC_ALL, ""); + setlocale(LC_MESSAGES, ""); + setlocale(LC_TIME, ""); + setlocale(LC_CTYPE, ""); + setlocale(LC_COLLATE, ""); #endif - bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -301,6 +309,7 @@ parse_command_line(int argc, char **argv) *infile = "-", *outfile = "-"; int c; + selected_item_filter = select_output_item_filter("muttq"); for(;;) { int option_index = 0; @@ -311,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 @@ -325,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 }, @@ -366,7 +377,21 @@ parse_command_line(int argc, char **argv) set_convert_var(informat); break; case OPT_OUTFORMAT: - set_convert_var(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 - 1); + custom_format[FORMAT_STRING_LEN] = 0; break; case OPT_INFILE: set_convert_var(infile); @@ -382,6 +407,19 @@ 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") && *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]); @@ -444,35 +482,13 @@ quit_mutt_query(int status) exit(status); } -static void -muttq_print_item(FILE *file, int item) -{ - abook_list *emails, *e; - char *tmp = db_email_get(item); - - emails = csv_to_abook_list(tmp); - free(tmp); - - for(e = emails; e; e = e->next) { - fprintf(file, "%s\t%s\t%s\n", e->data, db_name_get(item), - !db_fget(item, NOTES) ?" " :db_fget(item, NOTES) - ); - if(!opt_get_bool(BOOL_MUTT_RETURN_ALL_EMAILS)) - break; - } - abook_list_free(&emails); -} - static void mutt_query(char *str) { init_mutt_query(); if( str == NULL || !strcasecmp(str, "all") ) { - struct db_enumerator e = init_db_enumerator(ENUM_ALL); - printf("All items\n"); - db_enumerate_items(e) - muttq_print_item(stdout, e.item); + export_file("muttq", "-"); } else { int search_fields[] = {NAME, EMAIL, NICK, -1}; int i; @@ -482,7 +498,7 @@ mutt_query(char *str) } putchar('\n'); while(i >= 0) { - muttq_print_item(stdout, i); + e_write_item(stdout, i, selected_item_filter.func); i = find_item(str, i + 1, search_fields); } } @@ -708,6 +724,7 @@ init_add_email() check_abook_directory(); init_opts(); load_opts(rcfile); + init_standard_fields(); atexit(free_opts); /*