X-Git-Url: https://git.deb.at/w?p=pkg%2Fabook.git;a=blobdiff_plain;f=abook.c;h=7410f6b50747f53b074f819c3be3a87168192764;hp=daffe43adab1bd0245e63d4684b469d4f1fe2bc5;hb=69a912c0db0ac135fff332db4f0b05ad9ed2eec6;hpb=e34f84be19f4ff5c2ea7299ef9cfae0d450a6c24 diff --git a/abook.c b/abook.c index daffe43..7410f6b 100644 --- a/abook.c +++ b/abook.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -32,6 +33,7 @@ #include "options.h" #include "getname.h" #include "getopt.h" +#include "views.h" #include "xmalloc.h" static void init_abook(); @@ -48,9 +50,16 @@ 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; + static int datafile_writeable() { @@ -125,16 +134,19 @@ init_abook() printf(_("Press enter to continue...\n")); fgetc(stdin); } + init_default_views(); signal(SIGTERM, quit_abook_sig); + init_index(); + if(init_ui()) exit(EXIT_FAILURE); umask(DEFAULT_UMASK); if(!datafile_writeable()) { - char *s = mkstr(_("File %s is not writeable"), datafile); + char *s = strdup_printf(_("File %s is not writeable"), datafile); refresh_screen(); statusline_msg(s); free(s); @@ -181,14 +193,18 @@ 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); xmalloc_set_error_handler(xmalloc_error_handler); + prepare_database_internals(); + parse_command_line(argc, argv); init_abook(); @@ -293,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; @@ -303,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 @@ -317,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 }, @@ -358,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); + custom_format[FORMAT_STRING_LEN - 1] = 0; break; case OPT_INFILE: set_convert_var(infile); @@ -374,7 +407,24 @@ parse_command_line(int argc, char **argv) } } - if (optind < argc) { + // 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); + } + parsed_custom_format = (char *)malloc(FORMAT_STRING_LEN); + 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]); exit(EXIT_FAILURE); @@ -419,6 +469,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")); } @@ -426,7 +478,6 @@ show_usage() * end of CLI */ -extern list_item *database; static void quit_mutt_query(int status) @@ -437,34 +488,13 @@ quit_mutt_query(int status) exit(status); } -static void -muttq_print_item(FILE *file, int item) -{ - char emails[MAX_EMAILS][MAX_EMAIL_LEN]; - int i; - - split_emailstr(item, emails); - - for(i = 0; i < (opt_get_bool(BOOL_MUTT_RETURN_ALL_EMAILS) ? - MAX_EMAILS : 1) ; i++) - if( *emails[i] ) - fprintf(file, "%s\t%s\t%s\n", emails[i], - database[item][NAME], - database[item][NOTES] == NULL ? " " : - database[item][NOTES] - ); -} - 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; @@ -472,9 +502,14 @@ 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) { - muttq_print_item(stdout, i); + e_write_item(stdout, i, selected_item_filter.func); i = find_item(str, i + 1, search_fields); } } @@ -502,12 +537,12 @@ make_mailstr(int item) { char email[MAX_EMAIL_LEN]; char *ret; - char *name = mkstr("\"%s\"", database[item][NAME]); + char *name = strdup_printf("\"%s\"", db_name_get(item)); get_first_email(email, item); - ret = *database[item][EMAIL] ? - mkstr("%s <%s>", name, email) : + ret = *email ? + strdup_printf("%s <%s>", name, email) : xstrdup(name); free(name); @@ -576,10 +611,10 @@ launch_wwwbrowser(int item) if( !is_valid_item(item) ) return; - if( database[item][URL] ) - cmd = mkstr("%s '%s'", + if(db_fget(item, URL)) + cmd = strdup_printf("%s '%s'", opt_get_str(STR_WWW_COMMAND), - safe_str(database[item][URL])); + safe_str(db_fget(item, URL))); else return; @@ -631,6 +666,7 @@ convert(char *srcformat, char *srcfile, char *dstformat, char *dstfile) set_filenames(); init_opts(); load_opts(rcfile); + init_standard_fields(); switch(import_file(srcformat, srcfile)) { case -1: @@ -668,7 +704,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() @@ -679,7 +715,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")); } @@ -699,6 +735,7 @@ init_add_email() check_abook_directory(); init_opts(); load_opts(rcfile); + init_standard_fields(); atexit(free_opts); /* @@ -736,24 +773,26 @@ add_email_add_item(int quiet, char *name, char *email) } do { - /* TODO gettext: handle translated keypresses? */ - printf(_("Add \"%s <%s>\" to %s? (y/n)\n"), + printf(_("Add \"%s <%s>\" to %s? (%c/%c)\n"), name, email, - datafile); - c = getc(in); - if(c == 'n' || c == 'N') { + datafile, + *S_("keybinding for yes|y"), + *S_("keybinding for no|n")); + c = tolower(getc(in)); + if(c == *S_("keybinding for no|n")) { fclose(in); return 0; } - } while(c != 'y' && c != 'Y'); + } while(c != *S_("keybinding for yes|y")); fclose(in); } - memset(item, 0, sizeof(item)); - item[NAME] = xstrdup(name); - item[EMAIL] = xstrdup(email); + item = item_create(); + item_fput(item, NAME, xstrdup(name)); + item_fput(item, EMAIL, xstrdup(email)); add_item2database(item); + item_free(&item); return 1; } @@ -775,6 +814,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);