5 * by JH <jheinonen@bigfoot.com>
7 * Copyright (C) Jaakko Heinonen
15 #include <sys/types.h>
16 #include "abook_curses.h"
27 extern list_item *database;
28 extern struct abook_field abook_fields[];
31 * function declarations
35 * import filter prototypes
38 static int ldif_parse_file(FILE *handle);
39 static int mutt_parse_file(FILE *in);
40 static int pine_parse_file(FILE *in);
41 static int csv_parse_file(FILE *in);
44 * export filter prototypes
47 static int ldif_export_database(FILE *out, struct db_enumerator e);
48 static int html_export_database(FILE *out, struct db_enumerator e);
49 static int pine_export_database(FILE *out, struct db_enumerator e);
50 static int csv_export_database(FILE *out, struct db_enumerator e);
51 static int gcrd_export_database(FILE *out, struct db_enumerator e);
52 static int mutt_alias_export(FILE *out, struct db_enumerator e);
53 static int elm_alias_export(FILE *out, struct db_enumerator e);
54 static int text_export_database(FILE *out, struct db_enumerator e);
55 static int spruce_export_database(FILE *out, struct db_enumerator e);
58 * end of function declarations
61 struct abook_input_filter i_filters[] = {
62 { "abook", "abook native format", parse_database },
63 { "ldif", "ldif / Netscape addressbook", ldif_parse_file },
64 { "mutt", "mutt alias (beta)", mutt_parse_file },
65 { "pine", "pine addressbook", pine_parse_file },
66 { "csv", "comma separated values", csv_parse_file },
70 struct abook_output_filter e_filters[] = {
71 { "abook", "abook native format", write_database },
72 { "ldif", "ldif / Netscape addressbook (.4ld)", ldif_export_database },
73 { "mutt", "mutt alias", mutt_alias_export },
74 { "html", "html document", html_export_database },
75 { "pine", "pine addressbook", pine_export_database },
76 { "gcrd", "GnomeCard (VCard) addressbook", gcrd_export_database },
77 { "csv", "comma separated values", csv_export_database },
78 { "elm", "elm alias", elm_alias_export },
79 { "text", "plain text", text_export_database },
80 { "spruce", "Spruce address book", spruce_export_database },
94 for(i=0; *i_filters[i].filtname ; i++)
95 printf("\t%s\t%s\n", i_filters[i].filtname,
101 for(i=0; *e_filters[i].filtname ; i++)
102 printf("\t%s\t%s\n", e_filters[i].filtname,
109 number_of_output_filters()
113 for(i=0; *e_filters[i].filtname ; i++)
120 number_of_input_filters()
124 for(i=0; *i_filters[i].filtname ; i++)
133 char *username = getenv("USER");
134 struct passwd *pwent;
138 pwent = getpwnam(username);
140 if( (tmp = (char *)malloc(strlen(pwent->pw_gecos) +1)) == NULL)
141 return strdup(username);
143 rtn = sscanf(pwent->pw_gecos, "%[^,]", tmp);
144 if (rtn == EOF || rtn == 0) {
146 return strdup(username);
155 static int i_read_file(char *filename, int (*func) (FILE *in));
164 refresh_statusline();
165 headerline("import database");
167 mvaddstr(3, 1, "please select a filter");
170 for(i=0; *i_filters[i].filtname ; i++)
171 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
172 i_filters[i].filtname,
175 mvprintw(6 + i, 6, "x -\tcancel");
187 filter = getch() - 'a';
188 if(filter == 'x' - 'a' ||
189 filter >= number_of_input_filters() || filter < 0) {
194 mvaddstr(5+filter, 2, "->");
196 filename = ask_filename("Filename: ", 1);
202 if( i_read_file(filename, i_filters[filter].func ) )
203 statusline_msg("Error occured while opening the file");
206 statusline_msg("Hmm.., file seems not to be a valid file");
217 i_read_file(char *filename, int (*func) (FILE *in))
222 if( ( in = fopen( filename, "r" ) ) == NULL )
233 import(char filtname[FILTNAME_LEN], char *filename)
240 if( ! strncmp(i_filters[i].filtname, filtname, FILTNAME_LEN) )
242 if( ! *i_filters[i].filtname ) {
251 if( !strcmp(filename, "-") )
252 ret = (*i_filters[i].func) (stdin);
254 ret = i_read_file(filename, i_filters[i].func);
266 static int e_write_file(char *filename,
267 int (*func) (FILE *in, struct db_enumerator e), int mode);
277 refresh_statusline();
278 headerline("export database");
280 mvaddstr(3, 1, "please select a filter");
283 for(i=0; *e_filters[i].filtname ; i++)
284 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
285 e_filters[i].filtname,
288 mvprintw(6 + i, 6, "x -\tcancel");
295 int enum_mode = ENUM_ALL;
300 filter = getch() - 'a';
301 if(filter == 'x' - 'a' ||
302 filter >= number_of_output_filters(e_filters) || filter < 0) {
307 mvaddstr(5+filter, 2, "->");
309 if( selected_items() ) {
310 statusline_addstr("Export All/Selected/Cancel (A/s/c)");
311 switch( tolower(getch()) ) {
313 enum_mode = ENUM_SELECTED;
322 filename = ask_filename("Filename: ", 0);
328 if( e_write_file(filename, e_filters[filter].func, enum_mode ) )
329 statusline_msg("Error occured while exporting");
338 e_write_file(char *filename, int (*func) (FILE *in, struct db_enumerator e),
343 struct db_enumerator enumerator = init_db_enumerator(mode);
345 if( (out = fopen(filename, "a")) == NULL )
351 ret = (*func) (out, enumerator);
359 fexport(char filtname[FILTNAME_LEN], FILE *handle, int enum_mode)
362 struct db_enumerator e = init_db_enumerator(enum_mode);
365 if( ! strncmp(e_filters[i].filtname, filtname, FILTNAME_LEN) )
367 if( ! *e_filters[i].filtname ) {
373 return (e_filters[i].func) (handle, e);
379 export(char filtname[FILTNAME_LEN], char *filename)
381 const int mode = ENUM_ALL;
384 struct db_enumerator e = init_db_enumerator(mode);
387 if( ! strncmp(e_filters[i].filtname, filtname, FILTNAME_LEN) )
389 if( ! *e_filters[i].filtname ) {
398 if( !strcmp(filename, "-") )
399 ret = (e_filters[i].func) (stdout, e);
401 ret = e_write_file(filename, e_filters[i].func, mode);
407 * end of common functions
416 static void ldif_fix_string(char *str);
419 # define LINESIZE 1024
422 #define LDIF_ITEM_FIELDS 15
424 typedef char* ldif_item[LDIF_ITEM_FIELDS];
426 static ldif_item ldif_field_names = {
437 "facsimiletelephonenumber",
441 "objectclass", /* this must be the last entry */
444 static int ldif_conv_table[LDIF_ITEM_FIELDS] = {
447 ADDRESS, /* "streetaddress" */
448 CITY, /* "locality" */
450 ZIP, /* "postalcode" */
451 COUNTRY, /* "countryname" */
452 PHONE, /* "homephone" */
453 NOTES, /* "description" */
455 FAX, /* "facsimiletelephonenumber" */
456 MOBILEPHONE, /* "cellphone" */
457 WORKPHONE, /* "xmozillaanyphone" */
458 NICK, /* "xmozillanickname" */
459 -1, /* "objectclass" */ /* this must be the last entry */
464 ldif_read_line(FILE *in)
474 fgets(line, LINESIZE, in);
485 fseek(in, pos, SEEK_SET);
494 buf = strconcat(buf, ptr, NULL);
505 for(i=0,j=0; j < strlen(buf); i++, j++)
506 buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
513 ldif_add_item(ldif_item ldif_item)
515 list_item abook_item;
518 memset(abook_item, 0, sizeof(abook_item));
520 if( !ldif_item[LDIF_ITEM_FIELDS -1] )
524 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
525 if(ldif_conv_table[i] >= 0 && ldif_item[i] && *ldif_item[i] )
526 abook_item[ldif_conv_table[i]] = strdup(ldif_item[i]);
529 add_item2database(abook_item);
532 for(i=0; i < LDIF_ITEM_FIELDS; i++)
533 my_free(ldif_item[i]);
538 ldif_convert(ldif_item item, char *type, char *value)
542 if( !strcmp(type, "dn") ) {
547 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
548 if( !safe_strcmp(ldif_field_names[i], type) && *value ) {
549 if( i == LDIF_ITEM_FIELDS -1) /* this is a dirty hack */
550 if( safe_strcmp("person", value))
554 item[i] = strdup(value);
560 ldif_parse_file(FILE *handle)
567 memset(item, 0, sizeof(item));
570 if( ! (line = ldif_read_line(handle)) )
573 if( -1 == ( str_parse_line(line, &type, &value, &vlen)) ) {
575 continue; /* just skip the errors */
578 ldif_fix_string(value);
580 ldif_convert(item, type, value);
583 } while ( !feof(handle) );
585 ldif_convert(item, "dn", "");
591 ldif_fix_string(char *str)
595 for( i = 0, j = 0; j < strlen(str); i++, j++)
596 str[i] = ( str[j] == (char)0xc3 ?
597 (char) str[++j] + (char) 0x40 :
608 * mutt alias import filter
618 remove_newlines(char *buf)
622 for(i=0,j=0; j < strlen(buf); i++, j++)
623 buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
627 mutt_read_line(FILE *in, char **alias, char **rest)
630 char *ptr=(char *)&line;
633 fgets(line, LINESIZE, in);
634 remove_newlines(line);
636 while( ISSPACE(*ptr) )
639 if( strncmp("alias", ptr, 5) ) {
645 while( ISSPACE(*ptr) )
650 while( ! ISSPACE(*ptr) )
653 if( (*alias = (char *)malloc(ptr-tmp+1)) == NULL)
656 strncpy(*alias, tmp, ptr-tmp);
657 *(*alias+(ptr-tmp)) = 0;
659 while( ISSPACE(*ptr) )
668 mutt_parse_email(char *mutt_item[3])
673 if( (tmp = strchr(mutt_item[MUTT_NAME], '<')) )
678 mutt_item[MUTT_EMAIL] = strdup(tmp+1);
680 if( (tmp = strchr(mutt_item[MUTT_EMAIL], '>')) )
683 tmp = mutt_item[MUTT_NAME];
685 for(i=strlen(tmp)-1; i>0; i--)
691 mutt_item[MUTT_NAME] = strdup(tmp);
697 mutt_add_mutt_item(char *mutt_item[3])
699 list_item abook_item;
701 memset(abook_item, 0, sizeof(abook_item));
703 abook_item[NAME] = safe_strdup(mutt_item[MUTT_NAME]);
704 abook_item[EMAIL] = safe_strdup(mutt_item[MUTT_EMAIL]);
705 abook_item[NICK] = safe_strdup(mutt_item[MUTT_ALIAS]);
707 add_item2database(abook_item);
711 mutt_parse_file(FILE *in)
717 memset(mutt_item, 0, sizeof(mutt_item) );
719 if( mutt_read_line(in, &mutt_item[MUTT_ALIAS],
720 &mutt_item[MUTT_NAME]) )
723 mutt_parse_email(mutt_item);
726 free(mutt_item[MUTT_ALIAS]);
727 free(mutt_item[MUTT_NAME]);
728 free(mutt_item[MUTT_EMAIL]);
732 mutt_add_mutt_item(mutt_item);
734 free(mutt_item[MUTT_ALIAS]);
735 free(mutt_item[MUTT_NAME]);
736 free(mutt_item[MUTT_EMAIL]);
744 * end of mutt alias import filter
753 ldif_fput_type_and_value(FILE *out,char *type, char *value )
757 tmp = ldif_type_and_value(type, value, strlen(value));
765 ldif_export_database(FILE *out, struct db_enumerator e)
767 char email[MAX_EMAILSTR_LEN];
769 fprintf(out, "version: 1\n");
771 db_enumerate_items(e) {
774 get_first_email(email, e.item);
776 tmp = mkstr("cn=%s,mail=%s", database[e.item][NAME], email);
777 ldif_fput_type_and_value(out, "dn", tmp);
780 for(j=0; j < LDIF_ITEM_FIELDS; j++) {
781 if(ldif_conv_table[j] >= 0) {
782 if(ldif_conv_table[j] == EMAIL)
783 ldif_fput_type_and_value(out,
784 ldif_field_names[j], email);
785 else if(database[e.item][ldif_conv_table[j]])
786 ldif_fput_type_and_value(out,
788 database[e.item][ldif_conv_table[j]]);
792 fprintf(out, "objectclass: top\n"
793 "objectclass: person\n\n");
800 * end of ldif export filter
807 static void html_export_write_head(FILE *out, int extra_column);
808 static void html_export_write_tail(FILE *out);
811 html_export_database(FILE *out, struct db_enumerator e)
813 char tmp[MAX_EMAILSTR_LEN];
814 int extra_column = options_get_int("extra_column");
819 extra_column = (extra_column > 2 && extra_column < ITEM_FIELDS) ?
820 extra_column : PHONE;
822 html_export_write_head(out, extra_column);
824 db_enumerate_items(e) {
825 get_first_email(tmp, e.item);
827 fprintf(out, "<tr>\n<td><a href=\"mailto:%s\">%s</a>\n",
829 database[e.item][NAME] );
831 fprintf(out, "<tr>\n<td>%s>\n",
832 database[e.item][NAME] );
834 fprintf(out, "<td>%s\n<td>%s\n",
835 database[e.item][EMAIL],
836 safe_str(database[e.item][extra_column]) );
837 fprintf(out, "</tr>\n\n");
840 html_export_write_tail(out);
847 html_export_write_head(FILE *out, int extra_column)
849 char *realname = get_real_name();
851 fprintf(out, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n");
852 fprintf(out, "<html>\n<head>\n <title>%s's addressbook</title>",
854 fprintf(out, "\n</head>\n<body>\n");
855 fprintf(out, "\n<h2>%s's addressbook</h2>\n", realname );
856 fprintf(out, "<br><br>\n\n");
858 fprintf(out, "<center><table border>\n");
859 fprintf(out, "\n<tr><th>Name<th>E-mail address(es)<th>%s</tr>\n\n",
860 abook_fields[extra_column].name);
866 html_export_write_tail(FILE *out)
868 fprintf(out, "\n</table></center>\n");
869 fprintf(out, "\n</body>\n</html>\n");
873 * end of html export filter
878 * pine addressbook import filter
882 pine_fixbuf(char *buf)
886 for(i=0,j=0; j < strlen(buf); i++, j++)
887 buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
891 pine_convert_emails(char *s)
896 if( s == NULL || *s != '(' )
902 if( ( tmp = strchr(s,')')) )
905 for(i=1; ( tmp = strchr(s, ',') ) != NULL ; i++, s=tmp+1 )
906 if( i > MAX_EMAILS - 1 ) {
914 pine_parse_buf(char *buf)
921 int pine_conv_table[]= {NICK, NAME, EMAIL, -1, NOTES};
923 memset(&item, 0, sizeof(item) );
925 for(i=0, last=0; !last ; i++) {
926 if( ! (end = strchr(start, '\t')) )
929 len = last ? strlen(start) : (int) (end-start);
930 len = min(len, 400-1);
932 if(i < sizeof(pine_conv_table) / sizeof(*pine_conv_table)
933 && pine_conv_table[i] >= 0) {
934 strncpy(tmp, start, len);
936 item[pine_conv_table[i]] = strdup(tmp);
941 pine_convert_emails(item[EMAIL]);
942 add_item2database(item);
946 #define LINESIZE 1024
949 pine_parse_file(FILE *in)
956 fgets(line, LINESIZE, in);
960 buf = (char *) realloc(buf, i*LINESIZE);
963 fgets(line, LINESIZE, in);
965 if(*ptr != ' ' || feof(in) )
968 while( *ptr == ' ') ptr++;
987 * end of pine addressbook import filter
992 * pine addressbook export filter
994 * filter doesn't wrap the lines as it should but Pine seems to handle
995 * created files without problems - JH
999 pine_export_database(FILE *out, struct db_enumerator e)
1001 db_enumerate_items(e) {
1002 fprintf(out, have_multiple_emails(e.item) ?
1003 "%s\t%s\t(%s)\t\t%s\n" : "%s\t%s\t%s\t\t%s\n",
1004 safe_str(database[e.item][NICK]),
1005 safe_str(database[e.item][NAME]),
1006 safe_str(database[e.item][EMAIL]),
1007 safe_str(database[e.item][NOTES])
1015 * end of pine addressbook export filter
1024 * these files should be parsed according to a certain
1025 * lay out, or the default if layout is not given, at
1026 * the moment only default is done...
1029 #define CSV_COMMENT_CHAR '#'
1031 static int csv_conv_table[] = {
1040 csv_convert_emails(char *s)
1048 for(i=1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1 )
1049 if( i > MAX_EMAILS - 1 ) {
1057 csv_remove_quotes(char *s)
1059 char *copy, *trimmed;
1062 copy = trimmed = strdup(s);
1065 len = strlen(trimmed);
1066 if(trimmed[len - 1] == '\"' && *trimmed == '\"') {
1071 trimmed[len - 1] = 0;
1073 trimmed = strdup(trimmed);
1083 csv_store_field(list_item item, char *s, int field)
1085 char *newstr = NULL;
1090 if( !(newstr = csv_remove_quotes(s)) )
1093 if(field < (sizeof(csv_conv_table) / sizeof(*csv_conv_table))
1094 && csv_conv_table[field] >= 0) {
1095 item[csv_conv_table[field]] = newstr;
1100 csv_is_valid_quote_end(char *p)
1108 else if(!ISSPACE(*p))
1116 csv_is_valid_quote_start(char *p)
1121 else if(!ISSPACE(*p))
1129 csv_parse_line(char *line)
1133 int in_quote = FALSE;
1136 memset(item, 0, sizeof(item));
1138 for(p = start = line, field = 0; *p; p++) {
1140 if ( (((p - start) / sizeof (char)) < 2 ) &&
1141 csv_is_valid_quote_start(p) )
1144 if(csv_is_valid_quote_end(p))
1148 if( *p == ',' && !in_quote) {
1150 csv_store_field(item, start, field);
1158 csv_store_field(item, start, field);
1160 csv_convert_emails(item[EMAIL]);
1161 add_item2database(item);
1166 csv_parse_file(FILE *in)
1171 line = getaline(in);
1173 if(line && *line && *line != CSV_COMMENT_CHAR)
1174 csv_parse_line(line);
1183 * end of csv import filter
1187 * csv addressbook export filter
1191 csv_export_database(FILE *out, struct db_enumerator e)
1194 int csv_export_fields[] = {
1203 db_enumerate_items(e) {
1204 for(j = 0; csv_export_fields[j] >= 0; j++) {
1206 strchr(safe_str(database[e.item][csv_export_fields[j]]), ',') ||
1207 strchr(safe_str(database[e.item][csv_export_fields[j]]), '\"')
1210 safe_str(database[e.item][csv_export_fields[j]])
1212 if(csv_export_fields[j+1] >= 0)
1224 * end of csv export filter
1229 * GnomeCard (VCard) addressbook export filter
1233 gcrd_export_database(FILE *out, struct db_enumerator e)
1235 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
1239 db_enumerate_items(e) {
1240 fprintf(out, "BEGIN:VCARD\nFN:%s\n",
1241 safe_str(database[e.item][NAME]));
1243 name = get_surname(database[e.item][NAME]);
1244 for( j = strlen(database[e.item][NAME]) - 1; j >= 0; j-- ) {
1245 if(database[e.item][NAME][j] == ' ')
1248 fprintf(out, "N:%s;%.*s\n",
1251 safe_str(database[e.item][NAME])
1256 if ( database[e.item][ADDRESS] )
1257 fprintf(out, "ADR:;;%s;%s;%s;%s;%s\n",
1258 safe_str(database[e.item][ADDRESS]),
1259 safe_str(database[e.item][CITY]),
1260 safe_str(database[e.item][STATE]),
1261 safe_str(database[e.item][ZIP]),
1262 safe_str(database[e.item][COUNTRY])
1265 if (database[e.item][PHONE])
1266 fprintf(out, "TEL;HOME:%s\n", database[e.item][PHONE]);
1267 if (database[e.item][WORKPHONE])
1268 fprintf(out, "TEL;WORK:%s\n", database[e.item][WORKPHONE]);
1269 if (database[e.item][FAX])
1270 fprintf(out, "TEL;FAX:%s\n", database[e.item][FAX]);
1271 if (database[e.item][MOBILEPHONE])
1272 fprintf(out, "TEL;CELL:%s\n", database[e.item][MOBILEPHONE]);
1274 if ( database[e.item][EMAIL] ) {
1275 split_emailstr(e.item, emails);
1276 for(j=0; j < MAX_EMAILS ; j++) {
1278 fprintf(out, "EMAIL;INTERNET:%s\n",
1283 if ( database[e.item][NOTES] )
1284 fprintf(out, "NOTE:%s\n", database[e.item][NOTES]);
1285 if (database[e.item][URL])
1286 fprintf(out, "URL:%s\n", database[e.item][URL]);
1288 fprintf(out, "END:VCARD\n\n");
1296 * end of GnomeCard export filter
1301 * mutt alias export filter
1305 mutt_alias_genalias(int i)
1309 if(database[i][NICK])
1310 return strdup(database[i][NICK]);
1312 tmp = strdup(database[i][NAME]);
1314 if( ( pos = strchr(tmp, ' ') ) )
1323 mutt_alias_export(FILE *out, struct db_enumerator e)
1325 char email[MAX_EMAIL_LEN];
1328 db_enumerate_items(e) {
1329 alias = mutt_alias_genalias(e.item);
1331 get_first_email(email, e.item);
1332 fprintf(out, *email ? "alias %s %s <%s>\n": "alias %s %s%s\n",
1334 database[e.item][NAME],
1343 * end of mutt alias export filter
1348 * printable export filter
1353 text_write_address_us(FILE *out, int i) {
1354 fprintf(out, "\n%s", database[i][ADDRESS]);
1356 if (database[i][CITY])
1357 fprintf(out, "\n%s", database[i][CITY]);
1359 if (database[i][STATE] || database[i][ZIP]) {
1362 if(database[i][STATE]) {
1363 fprintf(out, "%s", database[i][STATE]);
1364 if(database[i][ZIP])
1368 if(database[i][ZIP])
1369 fprintf(out, "%s", database[i][ZIP]);
1372 if (database[i][COUNTRY])
1373 fprintf(out, "\n%s", database[i][COUNTRY]);
1378 text_write_address_uk(FILE *out, int i) {
1381 for (j = ADDRESS; j <= COUNTRY; j++)
1383 fprintf(out, "\n%s", database[i][j]);
1387 text_write_address_eu(FILE *out, int i) {
1388 fprintf(out, "\n%s", database[i][ADDRESS]);
1390 if (database[i][ZIP] || database[i][CITY]) {
1393 if(database[i][ZIP]) {
1394 fprintf(out, "%s", database[i][ZIP]);
1395 if(database[i][CITY])
1399 if(database[i][CITY])
1400 fprintf(out, "%s", database[i][CITY]);
1403 if (database[i][STATE])
1404 fprintf(out, "\n%s", database[i][STATE]);
1406 if (database[i][COUNTRY])
1407 fprintf(out, "\n%s", database[i][COUNTRY]);
1411 text_export_database(FILE * out, struct db_enumerator e)
1413 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
1415 char *realname = get_real_name();
1416 char *style = options_get_str("address_style");
1419 "-----------------------------------------\n%s's address book\n"
1420 "-----------------------------------------\n\n\n",
1424 db_enumerate_items(e) {
1426 "-----------------------------------------\n\n");
1427 fprintf(out, "%s", database[e.item][NAME]);
1428 if (database[e.item][NICK])
1429 fprintf(out, "\n(%s)", database[e.item][NICK]);
1432 if (*database[e.item][EMAIL]) {
1434 split_emailstr(e.item, emails);
1435 for (j = 0; j < MAX_EMAILS; j++)
1437 fprintf(out, "%s\n", emails[j]);
1440 if (database[e.item][ADDRESS]) {
1441 if (!safe_strcmp(style, "us")) /* US like */
1442 text_write_address_us(out, e.item);
1443 else if (!safe_strcmp(style, "uk")) /* UK like */
1444 text_write_address_uk(out, e.item);
1446 text_write_address_eu(out, e.item);
1451 if ((database[e.item][PHONE]) ||
1452 (database[e.item][WORKPHONE]) ||
1453 (database[e.item][FAX]) ||
1454 (database[e.item][MOBILEPHONE])) {
1456 for (j = PHONE; j <= MOBILEPHONE; j++)
1457 if (database[e.item][j])
1458 fprintf(out, "%s: %s\n",
1459 abook_fields[j].name,
1460 database[e.item][j]);
1463 if (database[e.item][URL])
1464 fprintf(out, "\n%s\n", database[e.item][URL]);
1465 if (database[e.item][NOTES])
1466 fprintf(out, "\n%s\n", database[e.item][NOTES]);
1471 fprintf(out, "-----------------------------------------\n");
1477 * end of printable export filter
1481 * elm alias export filter
1485 elm_alias_export(FILE *out, struct db_enumerator e)
1487 char email[MAX_EMAIL_LEN];
1490 db_enumerate_items(e) {
1491 alias = mutt_alias_genalias(e.item);
1492 get_first_email(email, e.item);
1493 fprintf(out, "%s = %s = %s\n",
1495 database[e.item][NAME],
1504 * end of elm alias export filter
1509 * Spruce export filter
1513 spruce_export_database (FILE *out, struct db_enumerator e)
1515 char email[MAX_EMAIL_LEN];
1517 fprintf (out, "# This is a generated file made by abook for the Spruce e-mail client.\n\n");
1519 db_enumerate_items(e) {
1520 if(strcmp (safe_str(database[e.item][EMAIL]), "")) {
1521 get_first_email(email, e.item);
1522 fprintf(out, "# Address %d\nName: %s\nEmail: %s\nMemo: %s\n\n",
1524 database[e.item][NAME],
1526 safe_str(database[e.item][NOTES])
1531 fprintf (out, "# End of address book file.\n");
1537 * end of Spruce export filter