5 * by JH <jheinonen@users.sourceforge.net>
7 * Copyright (C) Jaakko Heinonen
16 #include <sys/types.h>
17 #include "abook_curses.h"
29 extern list_item *database;
30 extern struct abook_field abook_fields[];
33 * function declarations
37 * import filter prototypes
40 static int ldif_parse_file(FILE *handle);
41 static int mutt_parse_file(FILE *in);
42 static int pine_parse_file(FILE *in);
43 static int csv_parse_file(FILE *in);
44 static int allcsv_parse_file(FILE *in);
45 static int palmcsv_parse_file(FILE *in);
48 * export filter prototypes
51 static int ldif_export_database(FILE *out, struct db_enumerator e);
52 static int html_export_database(FILE *out, struct db_enumerator e);
53 static int pine_export_database(FILE *out, struct db_enumerator e);
54 static int csv_export_database(FILE *out, struct db_enumerator e);
55 static int allcsv_export_database(FILE *out, struct db_enumerator e);
56 static int palm_export_database(FILE *out, struct db_enumerator e);
57 static int gcrd_export_database(FILE *out, struct db_enumerator e);
58 static int mutt_alias_export(FILE *out, struct db_enumerator e);
59 static int elm_alias_export(FILE *out, struct db_enumerator e);
60 static int text_export_database(FILE *out, struct db_enumerator e);
61 static int spruce_export_database(FILE *out, struct db_enumerator e);
64 * end of function declarations
67 struct abook_input_filter i_filters[] = {
68 { "abook", "abook native format", parse_database },
69 { "ldif", "ldif / Netscape addressbook", ldif_parse_file },
70 { "mutt", "mutt alias", mutt_parse_file },
71 { "pine", "pine addressbook", pine_parse_file },
72 { "csv", "comma separated values", csv_parse_file },
73 { "allcsv", "comma separated all values", allcsv_parse_file },
74 { "palmcsv", "Palm comma separated values", palmcsv_parse_file },
78 struct abook_output_filter e_filters[] = {
79 { "abook", "abook native format", write_database },
80 { "ldif", "ldif / Netscape addressbook (.4ld)", ldif_export_database },
81 { "mutt", "mutt alias", mutt_alias_export },
82 { "html", "html document", html_export_database },
83 { "pine", "pine addressbook", pine_export_database },
84 { "gcrd", "GnomeCard (VCard) addressbook", gcrd_export_database },
85 { "csv", "comma separated values", csv_export_database },
86 { "allcsv", "comma separated all values", allcsv_export_database },
87 { "palmcsv", "Palm comma separated values", palm_export_database},
88 { "elm", "elm alias", elm_alias_export },
89 { "text", "plain text", text_export_database },
90 { "spruce", "Spruce address book", spruce_export_database },
104 for(i=0; *i_filters[i].filtname ; i++)
105 printf("\t%s\t%s\n", i_filters[i].filtname,
111 for(i=0; *e_filters[i].filtname ; i++)
112 printf("\t%s\t%s\n", e_filters[i].filtname,
119 number_of_output_filters()
123 for(i=0; *e_filters[i].filtname ; i++)
130 number_of_input_filters()
134 for(i=0; *i_filters[i].filtname ; i++)
143 char *username = getenv("USER");
144 struct passwd *pwent;
148 pwent = getpwnam(username);
150 if((tmp = xstrdup(pwent->pw_gecos)) == NULL)
151 return xstrdup(username);
153 rtn = sscanf(pwent->pw_gecos, "%[^,]", tmp);
154 if (rtn == EOF || rtn == 0) {
156 return xstrdup(username);
165 static int i_read_file(char *filename, int (*func) (FILE *in));
174 refresh_statusline();
175 headerline("import database");
177 mvaddstr(3, 1, "please select a filter");
180 for(i=0; *i_filters[i].filtname ; i++)
181 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
182 i_filters[i].filtname,
185 mvprintw(6 + i, 6, "x -\tcancel");
197 filter = getch() - 'a';
198 if(filter == 'x' - 'a' ||
199 filter >= number_of_input_filters() || filter < 0) {
204 mvaddstr(5+filter, 2, "->");
206 filename = ask_filename("Filename: ");
212 if(i_read_file(filename, i_filters[filter].func ))
213 statusline_msg("Error occured while opening the file");
214 else if(tmp == items)
215 statusline_msg("Hmm.., file seems not to be a valid file");
226 i_read_file(char *filename, int (*func) (FILE *in))
231 if( (in = abook_fopen( filename, "r" )) == NULL )
242 import_file(char filtname[FILTNAME_LEN], char *filename)
249 if(! strncasecmp(i_filters[i].filtname, filtname,
252 if(! *i_filters[i].filtname) {
261 if(!strcmp(filename, "-")) {
263 if((fstat(fileno(stdin), &s)) == -1 || S_ISDIR(s.st_mode))
266 ret = (*i_filters[i].func) (stdin);
268 ret = i_read_file(filename, i_filters[i].func);
280 static int e_write_file(char *filename,
281 int (*func) (FILE *in, struct db_enumerator e), int mode);
291 refresh_statusline();
292 headerline("export database");
294 mvaddstr(3, 1, "please select a filter");
297 for(i = 0; *e_filters[i].filtname ; i++)
298 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
299 e_filters[i].filtname,
302 mvprintw(6 + i, 6, "x -\tcancel");
309 int enum_mode = ENUM_ALL;
314 filter = getch() - 'a';
315 if(filter == 'x' - 'a' ||
316 filter >= number_of_output_filters() || filter < 0) {
321 mvaddstr(5+filter, 2, "->");
323 if(selected_items()) {
324 statusline_addstr("Export All/Selected/Cancel (A/s/c)");
325 switch( tolower(getch()) ) {
327 enum_mode = ENUM_SELECTED;
336 filename = ask_filename("Filename: ");
342 if( e_write_file(filename, e_filters[filter].func, enum_mode))
343 statusline_msg("Error occured while exporting");
352 e_write_file(char *filename, int (*func) (FILE *in, struct db_enumerator e),
357 struct db_enumerator enumerator = init_db_enumerator(mode);
359 if((out = fopen(filename, "a")) == NULL)
365 ret = (*func) (out, enumerator);
373 fexport(char filtname[FILTNAME_LEN], FILE *handle, int enum_mode)
376 struct db_enumerator e = init_db_enumerator(enum_mode);
379 if(!strncasecmp(e_filters[i].filtname, filtname,
382 if(!*e_filters[i].filtname) {
388 return (e_filters[i].func) (handle, e);
394 export_file(char filtname[FILTNAME_LEN], char *filename)
396 const int mode = ENUM_ALL;
399 struct db_enumerator e = init_db_enumerator(mode);
402 if(!strncasecmp(e_filters[i].filtname, filtname,
405 if(!*e_filters[i].filtname) {
414 if(!strcmp(filename, "-"))
415 ret = (e_filters[i].func) (stdout, e);
417 ret = e_write_file(filename, e_filters[i].func, mode);
423 * end of common functions
432 static void ldif_fix_string(char *str);
434 #define LDIF_ITEM_FIELDS 16
436 typedef char *ldif_item[LDIF_ITEM_FIELDS];
438 static ldif_item ldif_field_names = {
450 "facsimiletelephonenumber",
454 "objectclass", /* this must be the last entry */
457 static int ldif_conv_table[LDIF_ITEM_FIELDS] = {
460 ADDRESS, /* "streetaddress" */
461 ADDRESS2, /* "streetaddress2" */
462 CITY, /* "locality" */
464 ZIP, /* "postalcode" */
465 COUNTRY, /* "countryname" */
466 PHONE, /* "homephone" */
467 NOTES, /* "description" */
469 FAX, /* "facsimiletelephonenumber" */
470 MOBILEPHONE, /* "cellphone" */
471 WORKPHONE, /* "xmozillaanyphone" */
472 NICK, /* "xmozillanickname" */
473 -1, /* "objectclass" */ /* this must be the last entry */
478 ldif_read_line(FILE *in)
491 if(feof(in) || !line)
500 fseek(in, pos, SEEK_SET); /* fixme ! */
510 buf = strconcat(buf, ptr, NULL);
515 if(buf && *buf == '#' ) {
524 ldif_add_item(ldif_item li)
526 list_item abook_item;
529 memset(abook_item, 0, sizeof(abook_item));
531 if(!li[LDIF_ITEM_FIELDS -1])
535 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
536 if(ldif_conv_table[i] >= 0 && li[i] && *li[i])
537 abook_item[ldif_conv_table[i]] = xstrdup(li[i]);
540 add_item2database(abook_item);
543 for(i=0; i < LDIF_ITEM_FIELDS; i++)
549 ldif_convert(ldif_item item, char *type, char *value)
553 if(!strcmp(type, "dn")) {
558 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
559 if(!safe_strcmp(ldif_field_names[i], type) && *value) {
560 if(i == LDIF_ITEM_FIELDS - 1) /* this is a dirty hack */
561 if(safe_strcmp("person", value))
565 item[i] = xstrdup(value);
571 ldif_parse_file(FILE *handle)
578 memset(item, 0, sizeof(item));
581 if( !(line = ldif_read_line(handle)) )
584 if(-1 == (str_parse_line(line, &type, &value, &vlen))) {
586 continue; /* just skip the errors */
589 ldif_fix_string(value);
591 ldif_convert(item, type, value);
594 } while ( !feof(handle) );
596 ldif_convert(item, "dn", "");
602 ldif_fix_string(char *str)
606 for(i = 0, j = 0; j < (int)strlen(str); i++, j++)
607 str[i] = ( str[j] == (char)0xc3 ?
608 (char) str[++j] + (char) 0x40 :
619 * mutt alias import filter
625 mutt_read_line(FILE *in, char **alias, char **rest)
627 char *line, *ptr, *tmp;
630 if( !(line = ptr = getaline(in)) )
631 return 1; /* error / EOF */
633 while( ISSPACE(*ptr) )
636 if(strncmp("alias", ptr, 5)) {
643 while( ISSPACE(*ptr) )
648 while( ! ISSPACE(*ptr) )
651 alias_len = (size_t)(ptr - tmp);
653 *alias = xmalloc_inc(alias_len, 1);
655 strncpy(*alias, tmp, alias_len);
656 *(*alias + alias_len) = 0;
661 *rest = xstrdup(ptr);
668 mutt_fix_quoting(char *p)
688 mutt_parse_email(list_item item)
690 char *line = item[NAME];
698 mutt_fix_quoting(line);
699 tmp = strconcat("From: ", line, NULL);
700 getname(tmp, &name, &email);
713 * this is completely broken
716 while( (start = strchr(start, ',')) && i++ < MAX_EMAILS - 1) {
717 tmp = strconcat("From: ", ++start, NULL);
718 getname(tmp, &name, &email);
723 tmp = strconcat(item[EMAIL], ",", email, NULL);
735 mutt_parse_file(FILE *in)
740 memset(item, 0, sizeof(item));
742 if(!mutt_read_line(in, &item[NICK],
744 mutt_parse_email(item);
747 free_list_item(item);
751 add_item2database(item);
758 * end of mutt alias import filter
767 ldif_fput_type_and_value(FILE *out,char *type, char *value )
771 tmp = ldif_type_and_value(type, value, strlen(value));
779 ldif_export_database(FILE *out, struct db_enumerator e)
781 char email[MAX_EMAILSTR_LEN];
783 fprintf(out, "version: 1\n");
785 db_enumerate_items(e) {
788 get_first_email(email, e.item);
790 tmp = mkstr("cn=%s,mail=%s", database[e.item][NAME], email);
791 ldif_fput_type_and_value(out, "dn", tmp);
794 for(j = 0; j < LDIF_ITEM_FIELDS; j++) {
795 if(ldif_conv_table[j] >= 0) {
796 if(ldif_conv_table[j] == EMAIL)
797 ldif_fput_type_and_value(out,
798 ldif_field_names[j], email);
799 else if(database[e.item][ldif_conv_table[j]])
800 ldif_fput_type_and_value(out,
802 database[e.item][ldif_conv_table[j]]);
806 fprintf(out, "objectclass: top\n"
807 "objectclass: person\n\n");
814 * end of ldif export filter
821 static void html_export_write_head(FILE *out, int extra_column);
822 static void html_export_write_tail(FILE *out);
824 extern int extra_column;
827 html_export_database(FILE *out, struct db_enumerator e)
829 char tmp[MAX_EMAILSTR_LEN];
834 extra_column = (extra_column > 2 && extra_column < ITEM_FIELDS) ?
835 extra_column : PHONE;
837 html_export_write_head(out, extra_column);
839 db_enumerate_items(e) {
840 get_first_email(tmp, e.item);
842 fprintf(out, "<tr>\n<td><a href=\"mailto:%s\">%s</a>\n",
844 database[e.item][NAME] );
846 fprintf(out, "<tr>\n<td>%s\n",
847 database[e.item][NAME] );
849 fprintf(out, "<td>%s\n<td>%s\n",
850 database[e.item][EMAIL],
851 safe_str(database[e.item][extra_column]) );
852 fprintf(out, "</tr>\n\n");
855 html_export_write_tail(out);
862 html_export_write_head(FILE *out, int extra_column)
864 char *realname = get_real_name();
866 fprintf(out, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
867 fprintf(out, "<html>\n<head>\n <title>%s's addressbook</title>", realname );
868 fprintf(out, "\n</head>\n<body>\n");
869 fprintf(out, "\n<h2>%s's addressbook</h2>\n", realname );
870 fprintf(out, "<br><br>\n\n");
872 fprintf(out, "<table border=\"1\" align=\"center\">\n");
873 fprintf(out, "\n<tr><th>Name<th>E-mail address(es)<th>%s</tr>\n\n",
874 abook_fields[extra_column].name);
880 html_export_write_tail(FILE *out)
882 fprintf(out, "\n</table>\n");
883 fprintf(out, "\n</body>\n</html>\n");
887 * end of html export filter
892 * pine addressbook import filter
895 #define PINE_BUF_SIZE 2048
898 pine_fixbuf(char *buf)
902 for(i=0,j=0; j < (int)strlen(buf); i++, j++)
903 buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
907 pine_convert_emails(char *s)
912 if(s == NULL || *s != '(')
918 if( ( tmp = strchr(s,')')) )
921 for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1)
922 if(i > MAX_EMAILS - 1) {
930 pine_parse_buf(char *buf)
935 char tmp[PINE_BUF_SIZE];
937 int pine_conv_table[]= {NICK, NAME, EMAIL, -1, NOTES};
939 memset(&item, 0, sizeof(item));
941 for(i=0, last=0; !last ; i++) {
942 if( !(end = strchr(start, '\t')) )
945 len = last ? strlen(start) : (int) (end-start);
946 len = min(len, PINE_BUF_SIZE - 1);
948 if(i < (int)(sizeof(pine_conv_table) / sizeof(*pine_conv_table))
949 && pine_conv_table[i] >= 0) {
950 strncpy(tmp, start, len);
953 item[pine_conv_table[i]] = xstrdup(tmp);
958 pine_convert_emails(item[EMAIL]);
959 add_item2database(item);
963 #define LINESIZE 1024
966 pine_parse_file(FILE *in)
973 fgets(line, LINESIZE, in);
977 buf = xrealloc(buf, i*LINESIZE);
980 fgets(line, LINESIZE, in);
982 if(*ptr != ' ' || feof(in))
1005 * end of pine addressbook import filter
1010 * pine addressbook export filter
1012 * filter doesn't wrap the lines as it should but Pine seems to handle
1013 * created files without problems - JH
1017 pine_export_database(FILE *out, struct db_enumerator e)
1019 db_enumerate_items(e) {
1020 fprintf(out, have_multiple_emails(e.item) ?
1021 "%s\t%s\t(%s)\t\t%s\n" : "%s\t%s\t%s\t\t%s\n",
1022 safe_str(database[e.item][NICK]),
1023 safe_str(database[e.item][NAME]),
1024 safe_str(database[e.item][EMAIL]),
1025 safe_str(database[e.item][NOTES])
1033 * end of pine addressbook export filter
1042 * these files should be parsed according to a certain
1043 * lay out, or the default if layout is not given, at
1044 * the moment only default is done...
1047 #define CSV_COMMENT_CHAR '#'
1048 #define CSV_DUPLICATE_SEPARATOR " "
1049 #define CSV_TABLE_SIZE(t) (sizeof (t) / sizeof *(t))
1051 static int csv_conv_table[] = {
1059 static int allcsv_conv_table[] = {
1082 static int palmcsv_conv_table[] = {
1083 NAME, /* Last name */
1084 NAME, /* First name */
1105 csv_convert_emails(char *s)
1113 for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1)
1114 if(i > MAX_EMAILS - 1) {
1122 csv_remove_quotes(char *s)
1124 char *copy, *trimmed;
1127 copy = trimmed = xstrdup(s);
1130 len = strlen(trimmed);
1131 if(trimmed[len - 1] == '\"' && *trimmed == '\"') {
1136 trimmed[len - 1] = 0;
1138 trimmed = xstrdup(trimmed);
1148 csv_field_to_item(int *table_base, size_t table_size, int field)
1150 if(field < table_size)
1151 return table_base[field];
1157 csv_store_item(list_item item, int i, char *s)
1159 char *newstr = NULL;
1164 if( !(newstr = csv_remove_quotes(s)) )
1168 if (item[i] != NULL) {
1169 char *oldstr = item[i];
1171 item[i] = strconcat(newstr, CSV_DUPLICATE_SEPARATOR,
1184 csv_is_valid_quote_end(char *p)
1192 else if(!ISSPACE(*p))
1200 csv_is_valid_quote_start(char *p)
1205 else if(!ISSPACE(*p))
1213 csv_parse_line(char *line, int *table_base, size_t table_size)
1217 bool in_quote = FALSE;
1220 memset(item, 0, sizeof(item));
1222 for(p = start = line, field = 0; *p; p++) {
1224 if(csv_is_valid_quote_end(p))
1227 if ( (((p - start) / sizeof (char)) < 2 ) &&
1228 csv_is_valid_quote_start(p) )
1232 if(*p == ',' && !in_quote) {
1234 csv_field_to_item(table_base, table_size, field);
1235 csv_store_item(item,
1236 csv_field_to_item(table_base,
1246 csv_store_item(item, csv_field_to_item(table_base, table_size, field),
1249 csv_convert_emails(item[EMAIL]);
1250 add_item2database(item);
1254 csv_parse_file_common(FILE *in, int *conv_table, size_t table_size)
1259 line = getaline(in);
1261 if(line && *line && *line != CSV_COMMENT_CHAR)
1262 csv_parse_line(line, conv_table, table_size);
1271 csv_parse_file(FILE *in)
1273 return csv_parse_file_common(in, csv_conv_table,
1274 CSV_TABLE_SIZE(csv_conv_table));
1278 allcsv_parse_file(FILE *in)
1280 return csv_parse_file_common(in, allcsv_conv_table,
1281 CSV_TABLE_SIZE(allcsv_conv_table));
1285 palmcsv_parse_file(FILE *in)
1287 return csv_parse_file_common(in, palmcsv_conv_table,
1288 CSV_TABLE_SIZE(palmcsv_conv_table));
1292 * end of csv import filter
1296 * csv addressbook export filters
1299 #define CSV_LAST (-1)
1300 #define CSV_UNDEFINED (-2)
1301 #define CSV_SPECIAL(X) (-3 - (X))
1302 #define CSV_IS_SPECIAL(X) ((X) <= -3)
1305 csv_export_common(FILE *out, struct db_enumerator e,
1306 int fields[], void (*special_func)(FILE *, int, int))
1310 db_enumerate_items(e) {
1311 for(i = 0; fields[i] != CSV_LAST; i++) {
1312 if(fields[i] == CSV_UNDEFINED)
1313 fprintf(out, "\"\"");
1314 else if(CSV_IS_SPECIAL(fields[i])) {
1316 (*special_func)(out, e.item, fields[i]);
1319 strchr(safe_str(database[e.item][fields[i]]), ',') ||
1320 strchr(safe_str(database[e.item][fields[i]]), '\"')) ?
1322 safe_str(database[e.item][fields[i]])
1324 fprintf(out, "\"%s\"",
1325 safe_str(database[e.item][fields[i]]));
1327 if(fields[i + 1] != CSV_LAST)
1337 csv_export_database(FILE *out, struct db_enumerator e)
1339 int csv_export_fields[] = {
1348 csv_export_common(out, e, csv_export_fields, NULL);
1354 allcsv_export_database(FILE *out, struct db_enumerator e)
1357 * TODO: Should get these atomatically from abook_fileds
1360 int allcsv_export_fields[] = {
1385 fprintf(out, "\"NAME\",");
1386 fprintf(out, "\"EMAIL\",");
1387 fprintf(out, "\"ADDRESS\",");
1388 fprintf(out, "\"ADDRESS2\",");
1389 fprintf(out, "\"CITY\",");
1390 fprintf(out, "\"STATE\",");
1391 fprintf(out, "\"ZIP\",");
1392 fprintf(out, "\"COUNTRY\",");
1393 fprintf(out, "\"PHONE\",");
1394 fprintf(out, "\"WORKPHONE\",");
1395 fprintf(out, "\"FAX\",");
1396 fprintf(out, "\"MOBILEPHONE\",");
1397 fprintf(out, "\"NICK\",");
1398 fprintf(out, "\"URL\",");
1399 fprintf(out, "\"NOTES\",");
1400 fprintf(out, "\"CUSTOM1\",");
1401 fprintf(out, "\"CUSTOM2\",");
1402 fprintf(out, "\"CUSTOM3\",");
1403 fprintf(out, "\"CUSTOM4\",");
1404 fprintf(out, "\"CUSTOM5\"\n");
1406 csv_export_common(out, e, allcsv_export_fields, NULL);
1415 #define PALM_CSV_NAME CSV_SPECIAL(0)
1416 #define PALM_CSV_END CSV_SPECIAL(1)
1417 #define PALM_CSV_CAT CSV_SPECIAL(2)
1420 palm_split_and_write_name(FILE *out, char *name)
1426 if ( (p = strchr(name, ' ')) ) {
1430 fprintf(out, "\"%s\",\"" , p + 1);
1431 fwrite((void *)name, p - name, sizeof(char), out);
1434 fprintf(out, "\"%s\"", safe_str(name));
1439 palm_csv_handle_specials(FILE *out, int item, int field)
1443 palm_split_and_write_name(out, database[item][NAME]);
1446 fprintf(out, "\"abook\"");
1449 fprintf(out, "\"0\"");
1457 palm_export_database(FILE *out, struct db_enumerator e)
1459 int palm_export_fields[] = {
1460 PALM_CSV_NAME, /* LASTNAME, FIRSTNAME */
1461 CSV_UNDEFINED, /* TITLE */
1462 CSV_UNDEFINED, /* COMPANY */
1463 WORKPHONE, /* WORK PHONE */
1464 PHONE, /* HOME PHONE */
1466 MOBILEPHONE, /* OTHER */
1468 ADDRESS, /* ADDRESS */
1472 COUNTRY, /* COUNTRY */
1473 NICK, /* DEFINED 1 */
1474 URL, /* DEFINED 2 */
1475 CSV_UNDEFINED, /* DEFINED 3 */
1476 CSV_UNDEFINED, /* DEFINED 4 */
1478 PALM_CSV_END, /* "0" */
1479 PALM_CSV_CAT, /* CATEGORY */
1483 csv_export_common(out, e, palm_export_fields, palm_csv_handle_specials);
1489 * end of csv export filters
1493 * GnomeCard (VCard) addressbook export filter
1497 gcrd_export_database(FILE *out, struct db_enumerator e)
1499 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
1503 db_enumerate_items(e) {
1504 fprintf(out, "BEGIN:VCARD\nFN:%s\n",
1505 safe_str(database[e.item][NAME]));
1507 name = get_surname(database[e.item][NAME]);
1508 for( j = strlen(database[e.item][NAME]) - 1; j >= 0; j-- ) {
1509 if(database[e.item][NAME][j] == ' ')
1512 fprintf(out, "N:%s;%.*s\n",
1515 safe_str(database[e.item][NAME])
1520 if ( database[e.item][ADDRESS] )
1521 fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\n",
1522 safe_str(database[e.item][ADDRESS]),
1523 safe_str(database[e.item][ADDRESS2]),
1524 safe_str(database[e.item][CITY]),
1525 safe_str(database[e.item][STATE]),
1526 safe_str(database[e.item][ZIP]),
1527 safe_str(database[e.item][COUNTRY])
1530 if (database[e.item][PHONE])
1531 fprintf(out, "TEL;HOME:%s\n", database[e.item][PHONE]);
1532 if (database[e.item][WORKPHONE])
1533 fprintf(out, "TEL;WORK:%s\n", database[e.item][WORKPHONE]);
1534 if (database[e.item][FAX])
1535 fprintf(out, "TEL;FAX:%s\n", database[e.item][FAX]);
1536 if (database[e.item][MOBILEPHONE])
1537 fprintf(out, "TEL;CELL:%s\n", database[e.item][MOBILEPHONE]);
1539 if ( database[e.item][EMAIL] ) {
1540 split_emailstr(e.item, emails);
1541 for(j=0; j < MAX_EMAILS ; j++) {
1543 fprintf(out, "EMAIL;INTERNET:%s\n",
1548 if ( database[e.item][NOTES] )
1549 fprintf(out, "NOTE:%s\n", database[e.item][NOTES]);
1550 if (database[e.item][URL])
1551 fprintf(out, "URL:%s\n", database[e.item][URL]);
1553 fprintf(out, "END:VCARD\n\n");
1561 * end of GnomeCard export filter
1566 * mutt alias export filter
1570 mutt_alias_genalias(int i)
1574 if(database[i][NICK])
1575 return xstrdup(database[i][NICK]);
1577 tmp = xstrdup(database[i][NAME]);
1579 if( ( pos = strchr(tmp, ' ') ) )
1588 mutt_alias_export(FILE *out, struct db_enumerator e)
1590 char email[MAX_EMAIL_LEN];
1593 db_enumerate_items(e) {
1594 alias = mutt_alias_genalias(e.item);
1596 get_first_email(email, e.item);
1597 fprintf(out, *email ? "alias %s %s <%s>\n": "alias %s %s%s\n",
1599 database[e.item][NAME],
1608 * end of mutt alias export filter
1613 * printable export filter
1618 text_write_address_us(FILE *out, int i) {
1619 fprintf(out, "\n%s", database[i][ADDRESS]);
1621 if (database[i][ADDRESS2])
1622 fprintf(out, "\n%s", database[i][ADDRESS2]);
1624 if (database[i][CITY])
1625 fprintf(out, "\n%s", database[i][CITY]);
1627 if (database[i][STATE] || database[i][ZIP]) {
1630 if(database[i][STATE]) {
1631 fprintf(out, "%s", database[i][STATE]);
1632 if(database[i][ZIP])
1636 if(database[i][ZIP])
1637 fprintf(out, "%s", database[i][ZIP]);
1640 if (database[i][COUNTRY])
1641 fprintf(out, "\n%s", database[i][COUNTRY]);
1646 text_write_address_uk(FILE *out, int i) {
1649 for (j = ADDRESS; j <= COUNTRY; j++)
1651 fprintf(out, "\n%s", database[i][j]);
1655 text_write_address_eu(FILE *out, int i) {
1656 fprintf(out, "\n%s", database[i][ADDRESS]);
1658 if (database[i][ADDRESS2])
1659 fprintf(out, "\n%s", database[i][ADDRESS2]);
1661 if (database[i][ZIP] || database[i][CITY]) {
1664 if(database[i][ZIP]) {
1665 fprintf(out, "%s", database[i][ZIP]);
1666 if(database[i][CITY])
1670 if(database[i][CITY])
1671 fprintf(out, "%s", database[i][CITY]);
1674 if (database[i][STATE])
1675 fprintf(out, "\n%s", database[i][STATE]);
1677 if (database[i][COUNTRY])
1678 fprintf(out, "\n%s", database[i][COUNTRY]);
1682 text_export_database(FILE * out, struct db_enumerator e)
1684 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
1686 char *realname = get_real_name();
1687 char *style = opt_get_str(STR_ADDRESS_STYLE);
1690 "-----------------------------------------\n%s's address book\n"
1691 "-----------------------------------------\n\n\n",
1695 db_enumerate_items(e) {
1697 "-----------------------------------------\n\n");
1698 fprintf(out, "%s", database[e.item][NAME]);
1699 if (database[e.item][NICK] && *database[e.item][NICK])
1700 fprintf(out, "\n(%s)", database[e.item][NICK]);
1703 if (*database[e.item][EMAIL]) {
1705 split_emailstr(e.item, emails);
1706 for (j = 0; j < MAX_EMAILS; j++)
1708 fprintf(out, "%s\n", emails[j]);
1711 if (database[e.item][ADDRESS]) {
1712 if (!safe_strcmp(style, "us")) /* US like */
1713 text_write_address_us(out, e.item);
1714 else if (!safe_strcmp(style, "uk")) /* UK like */
1715 text_write_address_uk(out, e.item);
1717 text_write_address_eu(out, e.item);
1722 if ((database[e.item][PHONE]) ||
1723 (database[e.item][WORKPHONE]) ||
1724 (database[e.item][FAX]) ||
1725 (database[e.item][MOBILEPHONE])) {
1727 for (j = PHONE; j <= MOBILEPHONE; j++)
1728 if (database[e.item][j])
1729 fprintf(out, "%s: %s\n",
1730 abook_fields[j].name,
1731 database[e.item][j]);
1734 if (database[e.item][URL])
1735 fprintf(out, "\n%s\n", database[e.item][URL]);
1736 if (database[e.item][NOTES])
1737 fprintf(out, "\n%s\n", database[e.item][NOTES]);
1742 fprintf(out, "-----------------------------------------\n");
1748 * end of printable export filter
1752 * elm alias export filter
1756 elm_alias_export(FILE *out, struct db_enumerator e)
1758 char email[MAX_EMAIL_LEN];
1761 db_enumerate_items(e) {
1762 alias = mutt_alias_genalias(e.item);
1763 get_first_email(email, e.item);
1764 fprintf(out, "%s = %s = %s\n",
1766 database[e.item][NAME],
1775 * end of elm alias export filter
1780 * Spruce export filter
1784 spruce_export_database (FILE *out, struct db_enumerator e)
1786 char email[MAX_EMAIL_LEN];
1788 fprintf (out, "# This is a generated file made by abook for the Spruce e-mail client.\n\n");
1790 db_enumerate_items(e) {
1791 if(strcmp (safe_str(database[e.item][EMAIL]), "")) {
1792 get_first_email(email, e.item);
1793 fprintf(out, "# Address %d\nName: %s\nEmail: %s\nMemo: %s\n\n",
1795 database[e.item][NAME],
1797 safe_str(database[e.item][NOTES])
1802 fprintf (out, "# End of address book file.\n");
1808 * end of Spruce export filter