X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=filter.c;h=ff3e511872f0e2bd3619680fa67c70de7699eff4;hb=9ccd2453b5a55c7bccae5de1e1022947c7ff889a;hp=1fb95ed4d649c5003e1ccb2825f778165e8da1a5;hpb=0968f14408d8b41570bea076d44d5edbbc3477ed;p=pkg%2Fabook.git diff --git a/filter.c b/filter.c index 1fb95ed..ff3e511 100644 --- a/filter.c +++ b/filter.c @@ -29,6 +29,10 @@ #include "xmalloc.h" #include +#ifdef HAVE_VFORMAT +#include "vcard.h" +#endif + extern abook_field_list *fields_list; extern int fields_count; @@ -66,6 +70,15 @@ static int text_export_database(FILE *out, struct db_enumerator e); static int spruce_export_database(FILE *out, struct db_enumerator e); static int wl_export_database(FILE *out, struct db_enumerator e); static int bsdcal_export_database(FILE *out, struct db_enumerator e); +static int custom_export_database(FILE *out, struct db_enumerator e); + +/* + * export filter item prototypes + */ + +void vcard_export_item(FILE *out, int item); +void muttq_print_item(FILE *file, int item); +void custom_print_item(FILE *out, int item); /* * end of function declarations @@ -99,11 +112,14 @@ 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[] = { + { "vcard", N_("vCard 2 file"), vcard_export_item }, { "muttq", N_("mutt alias"), muttq_print_item }, + { "custom", N_("Custom format"), custom_print_item }, { "\0", NULL } }; @@ -116,21 +132,21 @@ print_filters() { int i; - puts(_("input:")); + puts(_("input formats:")); for(i=0; *i_filters[i].filtname ; i++) printf("\t%s\t%s\n", i_filters[i].filtname, gettext(i_filters[i].desc)); putchar('\n'); - puts(_("output:")); + puts(_("output formats:")); for(i=0; *e_filters[i].filtname ; i++) printf("\t%s\t%s\n", e_filters[i].filtname, gettext(e_filters[i].desc)); putchar('\n'); - puts(_("output (with query):")); + puts(_("query-compatible output formats:")); for(i=0; *u_filters[i].filtname ; i++) printf("\t%s\t%s\n", u_filters[i].filtname, gettext(u_filters[i].desc)); @@ -281,6 +297,18 @@ import_file(char filtname[FILTNAME_LEN], char *filename) if(i < 0) return -1; +#ifdef HAVE_VFORMAT + // this is a special case for + // libvformat whose API expects a filename + if(!strcmp(filtname, "vcard")) { + if(!strcmp(filename, "-")) + ret = vcard_parse_file_libvformat("/dev/stdin"); + else + ret = vcard_parse_file_libvformat(filename); + } + else +#endif + if(!strcmp(filename, "-")) { struct stat s; if((fstat(fileno(stdin), &s)) == -1 || S_ISDIR(s.st_mode)) @@ -603,8 +631,8 @@ ldif_convert(ldif_item item, char *type, char *value) } for(i=0; i < LDIF_ITEM_FIELDS; i++) { - if(!safe_strcmp(ldif_field_names[i], type) && *value) { - if(i == LDIF_ITEM_FIELDS - 1) /* this is a dirty hack */ + if(!strcasecmp(ldif_field_names[i], type) && *value) { + if(i == LDIF_ITEM_FIELDS - 1) /* this is a dirty hack */ if(safe_strcmp("person", value)) break; @@ -612,6 +640,7 @@ ldif_convert(ldif_item item, char *type, char *value) free(item_fget(item, i)); item_fput(item, i, xstrdup(value)); + break; } } } @@ -1849,74 +1878,77 @@ palm_export_database(FILE *out, struct db_enumerator e) static int vcard_export_database(FILE *out, struct db_enumerator e) +{ + db_enumerate_items(e) + vcard_export_item(out, e.item); + return 0; +} + +void +vcard_export_item(FILE *out, int item) { int j; char *name, *tmp; abook_list *emails, *em; + fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n", + safe_str(db_name_get(item))); - db_enumerate_items(e) { - fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n", - safe_str(db_name_get(e.item))); - - name = get_surname(db_name_get(e.item)); - for( j = strlen(db_name_get(e.item)) - 1; j >= 0; j-- ) { - if((db_name_get(e.item))[j] == ' ') - break; - } - fprintf(out, "N:%s;%.*s\r\n", - safe_str(name), - j, - safe_str(db_name_get(e.item)) - ); - - free(name); - - if(db_fget(e.item, ADDRESS)) - fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\r\n", - safe_str(db_fget(e.item, ADDRESS)), - safe_str(db_fget(e.item, ADDRESS2)), - safe_str(db_fget(e.item, CITY)), - safe_str(db_fget(e.item, STATE)), - safe_str(db_fget(e.item, ZIP)), - safe_str(db_fget(e.item, COUNTRY)) - ); - - if(db_fget(e.item, PHONE)) - fprintf(out, "TEL;HOME:%s\r\n", - db_fget(e.item, PHONE)); - if(db_fget(e.item, WORKPHONE)) - fprintf(out, "TEL;WORK:%s\r\n", - db_fget(e.item, WORKPHONE)); - if(db_fget(e.item, FAX)) - fprintf(out, "TEL;FAX:%s\r\n", - db_fget(e.item, FAX)); - if(db_fget(e.item, MOBILEPHONE)) - fprintf(out, "TEL;CELL:%s\r\n", - db_fget(e.item, MOBILEPHONE)); - - tmp = db_email_get(e.item); - if(*tmp) { - emails = csv_to_abook_list(tmp); - - for(em = emails; em; em = em->next) - fprintf(out, "EMAIL;INTERNET:%s\r\n", em->data); - - abook_list_free(&emails); - } - free(tmp); - - if(db_fget(e.item, NOTES)) - fprintf(out, "NOTE:%s\r\n", - db_fget(e.item, NOTES)); - if(db_fget(e.item, URL)) - fprintf(out, "URL:%s\r\n", - db_fget(e.item, URL)); + name = get_surname(db_name_get(item)); + for( j = strlen(db_name_get(item)) - 1; j >= 0; j-- ) { + if((db_name_get(item))[j] == ' ') + break; + } + fprintf(out, "N:%s;%.*s\r\n", + safe_str(name), + j, + safe_str(db_name_get(item)) + ); + + free(name); + + if(db_fget(item, ADDRESS)) + fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\r\n", + safe_str(db_fget(item, ADDRESS)), + safe_str(db_fget(item, ADDRESS2)), + safe_str(db_fget(item, CITY)), + safe_str(db_fget(item, STATE)), + safe_str(db_fget(item, ZIP)), + safe_str(db_fget(item, COUNTRY)) + ); + + if(db_fget(item, PHONE)) + fprintf(out, "TEL;HOME:%s\r\n", + db_fget(item, PHONE)); + if(db_fget(item, WORKPHONE)) + fprintf(out, "TEL;WORK:%s\r\n", + db_fget(item, WORKPHONE)); + if(db_fget(item, FAX)) + fprintf(out, "TEL;FAX:%s\r\n", + db_fget(item, FAX)); + if(db_fget(item, MOBILEPHONE)) + fprintf(out, "TEL;CELL:%s\r\n", + db_fget(item, MOBILEPHONE)); + + tmp = db_email_get(item); + if(*tmp) { + emails = csv_to_abook_list(tmp); + + for(em = emails; em; em = em->next) + fprintf(out, "EMAIL;INTERNET:%s\r\n", em->data); + + abook_list_free(&emails); + } + free(tmp); - fprintf(out, "END:VCARD\r\n\r\n"); + if(db_fget(item, NOTES)) + fprintf(out, "NOTE:%s\r\n", + db_fget(item, NOTES)); + if(db_fget(item, URL)) + fprintf(out, "URL:%s\r\n", + db_fget(item, URL)); - } + fprintf(out, "END:VCARD\r\n\r\n"); - return 0; } /* @@ -2415,6 +2447,93 @@ parse_custom_format(char *s, char *fmt_string, enum field_types *ft) *ft = 66; } +static int +custom_export_item(FILE *out, int item, char *s, enum field_types *ft); + + +// used to store the format string from --outformatstr when "custom" format is used +// default value overriden in export_file() +extern char *parsed_custom_format; +extern enum field_types *custom_format_fields; + +/* wrapper for custom_export_item: + 1) avoid messing with extern pointer + 2) adds \n + 3) follow the prototype needed for an abook_output_item_filter entry */ +void +custom_print_item(FILE *out, int item) +{ + + if(custom_export_item(out, item, parsed_custom_format, custom_format_fields) == 0) + fprintf(out, "\n"); +} + +static int +custom_export_item(FILE *out, int item, char *fmt, enum field_types *ft) +{ + char *p, *q = 0; + + // if the first character is '!': + // we first check that all fields exist before continuing + if(*fmt == '!') { + enum field_types *ftp = ft; + while(*ft != 66) { + if(! db_fget(item, *ft) ) + return 1; + ft++; + } + ft = ftp; + fmt++; + } + + while (*fmt) { + if(!strncmp(fmt, "%s", 2)) { + fprintf(out, "%s", safe_str(db_fget(item, *ft))); + ft++; + fmt+=2; + } else if (*ft == 66) { + fprintf(out, "%s", fmt); + return 0; + } else { + p = strchr(fmt, '%'); + if(*p) { + q = strndup(fmt, (size_t)(p-fmt)); + fprintf(out, "%s", q); + free(q); + fmt = p; + } + else { + fprintf(out, "%s", fmt); + return 0; + } + } + } + + return 0; +} + +// used to store the format string from --outformatstr when "custom" format is used +// default value overriden from abook.c +extern char custom_format[FORMAT_STRING_LEN]; + +static int +custom_export_database(FILE *out, struct db_enumerator e) +{ + char *format_string = + (char *)malloc(FORMAT_STRING_LEN * sizeof(char*)); + + enum field_types *ft = + (enum field_types *)malloc(FORMAT_STRING_MAX_FIELDS * sizeof(enum field_types *)); + + parse_custom_format(custom_format, format_string, ft); + + db_enumerate_items(e) { + if(custom_export_item(out, e.item, format_string, ft) == 0) + fprintf(out, "\n"); + } + return 0; +} + /* * end of BSD calendar export filter */