static int palm_export_database(FILE *out, struct db_enumerator e);
static int vcard_export_database(FILE *out, struct db_enumerator e);
static int mutt_alias_export(FILE *out, struct db_enumerator e);
+static int mutt_query_export_database(FILE *out, struct db_enumerator e);
static int elm_alias_export(FILE *out, struct db_enumerator e);
static int text_export_database(FILE *out, struct db_enumerator e);
static int spruce_export_database(FILE *out, struct db_enumerator e);
{ "ldif", N_("ldif / Netscape addressbook (.4ld)"), ldif_export_database },
{ "vcard", N_("vCard 2 file"), vcard_export_database },
{ "mutt", N_("mutt alias"), mutt_alias_export },
+ { "muttq", N_("mutt query format (internal use)"), mutt_query_export_database },
{ "html", N_("html document"), html_export_database },
{ "pine", N_("pine addressbook"), pine_export_database },
{ "csv", N_("comma separated values"), csv_export_database },
{ "\0", NULL, NULL }
};
+struct abook_output_item_filter u_filters[] = {
+ { "muttq", N_("mutt alias"), muttq_print_item },
+ { "\0", NULL }
+};
+
/*
* common functions
*/
gettext(e_filters[i].desc));
putchar('\n');
+
+ puts(_("output (with query):"));
+ for(i=0; *u_filters[i].filtname ; i++)
+ printf("\t%s\t%s\n", u_filters[i].filtname,
+ gettext(u_filters[i].desc));
+
+ putchar('\n');
}
static int
return 0;
}
+struct abook_output_item_filter select_output_item_filter(char filtname[FILTNAME_LEN]) {
+ int i;
+ for(i=0;; i++) {
+ if(!strncasecmp(u_filters[i].filtname, filtname, FILTNAME_LEN))
+ break;
+ if(!*u_filters[i].filtname) {
+ i = -1;
+ break;
+ }
+ }
+ return u_filters[i];
+}
+
+void
+e_write_item(FILE *out, int item, void (*func) (FILE *in, int item))
+{
+ (*func) (out, item);
+}
+
static int
e_write_file(char *filename, int (*func) (FILE *in, struct db_enumerator e),
int mode)
return 0;
}
+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 int
+mutt_query_export_database(FILE *out, struct db_enumerator e)
+{
+ fprintf(out, "All items\n");
+ db_enumerate_items(e)
+ muttq_print_item(out, e.item);
+ return 0;
+}
+
/*
* end of mutt alias export filter
*/
return 0;
}
+// see enum field_types @database.h
+static char *conv_table[] = {
+ "name",
+ "email",
+ "address",
+ "address2",
+ "city",
+ "state",
+ "zip",
+ "country",
+ "phone",
+ "workphone",
+ "fax",
+ "mobile",
+ "nick",
+ "url",
+ "notes",
+ "anniversary",
+ 0 /* ITEM_FIELDS */
+};
+
+static int
+find_field_enum(char *s) {
+ int i = 0;
+ while (conv_table[i]) {
+ if(!safe_strcmp(conv_table[i], s))
+ return i;
+ i++;
+ }
+ // failed
+ return -1;
+}
+
+/* Convert a string with named placeholders to
+ a *printf() compatible string.
+ Stores the abook field values into ft. */
+void
+parse_custom_format(char *s, char *fmt_string, enum field_types *ft)
+{
+ if(! fmt_string || ! ft) {
+ fprintf(stderr, _("parse_custom_format: fmt_string or ft not allocated\n"));
+ exit(EXIT_FAILURE);
+ }
+
+ char *p, *start, *field_name = NULL;
+ p = start = s;
+
+ while(*p) {
+ if(*p == '{') {
+ start = ++p;
+ p = strchr(start, '}');
+ if(! *p) {
+ fprintf(stderr, _("parse_custom_format: invalid format\n"));
+ exit(EXIT_FAILURE);
+ }
+ strcat(fmt_string, "%s");
+ field_name = strndup(start, (size_t)(p-start));
+ *ft = find_field_enum(field_name);
+ if(*ft == -1) {
+ fprintf(stderr, _("parse_custom_format: invalid placeholder: {%s}\n"), field_name);
+ exit(EXIT_FAILURE);
+ }
+
+ ft++;
+ p++;
+ start = p;
+ } else {
+ p = strchr(start, '{');
+ if(p && *p) {
+ strncat(fmt_string, start, (size_t)(p-start));
+ start = p;
+ }
+ else {
+ strncat( fmt_string,
+ start,
+ FORMAT_STRING_LEN - strlen(fmt_string) - 1 );
+ break;
+ }
+ }
+ }
+ *ft = 66;
+}
+
/*
* end of BSD calendar export filter
*/