]> git.deb.at Git - pkg/abook.git/blobdiff - filter.c
* parse_date_string(): don't modify string argument in place, since most
[pkg/abook.git] / filter.c
index 0020fc201fd43158a7c3dd00d72ca5403d3c7fab..0bdc4b94bdf736fa3bb92608b9aa0f3dc4ebc102 100644 (file)
--- a/filter.c
+++ b/filter.c
@@ -27,7 +27,6 @@
 #include "xmalloc.h"
 #include <assert.h>
 
-extern int items;
 extern abook_field_list *fields_list;
 extern int fields_count;
 
@@ -62,6 +61,7 @@ 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);
 static int     wl_export_database(FILE *out, struct db_enumerator e);
+static int     bsdcal_export_database(FILE *out, struct db_enumerator e);
 
 /*
  * end of function declarations
@@ -92,6 +92,7 @@ struct abook_output_filter e_filters[] = {
        { "text", N_("plain text"), text_export_database },
        { "wl", N_("Wanderlust address book"), wl_export_database },
        { "spruce", N_("Spruce address book"), spruce_export_database },
+       { "bsdcal", N_("BSD calendar"), bsdcal_export_database },
        { "\0", NULL, NULL }
 };
 
@@ -194,7 +195,7 @@ import_database()
 {
        int filter;
        char *filename;
-       int tmp = items;
+       int tmp = db_n_items();
 
        import_screen();
 
@@ -215,7 +216,7 @@ import_database()
 
        if(i_read_file(filename, i_filters[filter].func ))
                statusline_msg(_("Error occured while opening the file"));
-       else if(tmp == items)
+       else if(tmp == db_n_items())
                statusline_msg(_("File does not seem to be a valid addressbook"));
 
        refresh_screen();
@@ -246,7 +247,7 @@ int
 import_file(char filtname[FILTNAME_LEN], char *filename)
 {
        int i;
-       int tmp = items;
+       int tmp = db_n_items();
        int ret = 0;
 
        for(i=0;; i++) {
@@ -271,7 +272,7 @@ import_file(char filtname[FILTNAME_LEN], char *filename)
        } else
                ret =  i_read_file(filename, i_filters[i].func);
 
-       if(tmp == items)
+       if(tmp == db_n_items())
                ret = 1;
 
        return ret;
@@ -833,37 +834,56 @@ ldif_export_database(FILE *out, struct db_enumerator e)
  * html export filter
  */
 
-static void            html_export_write_head(FILE *out, int extra_column);
+static void            html_export_write_head(FILE *out);
 static void            html_export_write_tail(FILE *out);
 
+extern struct index_elem *index_elements;
+
+static void
+html_print_emails(FILE *out, struct list_field *f)
+{
+       abook_list *l = csv_to_abook_list(f->data);
+
+       for(; l; l = l->next) {
+               fprintf(out, "<a href=\"mailto:%s\">%s</a>", l->data, l->data);
+               if(l->next)
+                       fprintf(out, ", ");
+       }
+
+       abook_list_free(&l);
+}
+
 static int
 html_export_database(FILE *out, struct db_enumerator e)
 {
-       char tmp[MAX_EMAILSTR_LEN];
-       int extra_column;
+       struct list_field f;
+       struct index_elem *cur;
 
-       if(items < 1)
+       if(list_is_empty())
                return 2;
 
-       extra_column = init_extra_field(STR_EXTRA_COLUMN);
-       html_export_write_head(out, extra_column);
+       init_index();
 
-       db_enumerate_items(e) {
-               get_first_email(tmp, e.item);
-               if (*tmp)
-                   fprintf(out, "<tr>\n<td>"
-                                   "<a href=\"mailto:%s\">%s</a>"
-                                   "</td>\n",
-                           tmp,
-                           db_name_get(e.item));
-               else
-                   fprintf(out, "<tr>\n<td>%s</td>\n", db_name_get(e.item));
+       html_export_write_head(out);
 
-               fprintf(out, "<td>%s</td>\n", db_email_get(e.item));
-               if(extra_column >= 0)
-                       fprintf(out, "<td>%s</td>\n",
-                               safe_str(db_fget_byid(e.item, extra_column)));
-               fprintf(out, "</tr>\n\n");
+       db_enumerate_items(e) {
+               fprintf(out, "<tr>");
+               for(cur = index_elements; cur; cur = cur->next) {
+                       if(cur->type != INDEX_FIELD)
+                               continue;
+
+                       get_list_field(e.item, cur, &f);
+
+                       if(f.type == FIELD_EMAILS) {
+                               fprintf(out, "<td>");
+                               html_print_emails(out, &f);
+                               fprintf(out, "</td>");
+                               continue;
+                       } else {
+                               fprintf(out, "<td>%s</td>", safe_str(f.data));
+                       }
+               }
+               fprintf(out, "</tr>\n");
        }
 
        html_export_write_tail(out);
@@ -872,9 +892,10 @@ html_export_database(FILE *out, struct db_enumerator e)
 }
 
 static void
-html_export_write_head(FILE *out, int extra_column)
+html_export_write_head(FILE *out)
 {
-       char *realname = get_real_name(), *extra_column_name = NULL;
+       char *realname = get_real_name(), *str;
+       struct index_elem *cur;
 
        fprintf(out, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
        fprintf(out, "<html>\n<head>\n <title>%s's addressbook</title>",
@@ -883,11 +904,13 @@ html_export_write_head(FILE *out, int extra_column)
        fprintf(out, "\n<h2>%s's addressbook</h2>\n", realname );
        fprintf(out, "<br><br>\n\n");
 
-       fprintf(out, "<table border=\"1\" align=\"center\">\n");
-       fprintf(out, "\n<tr><th>Name</th><th>E-mail address(es)</th>");
-       if(extra_column >= 0) {
-               get_field_keyname(extra_column, NULL, &extra_column_name);
-               fprintf(out, "<th>%s</th>", safe_str(extra_column_name));
+       fprintf(out, "<table border=\"1\" align=\"center\">\n<tr>");
+       for(cur = index_elements; cur; cur = cur->next) {
+               if(cur->type != INDEX_FIELD)
+                       continue;
+
+               get_field_info(cur->d.field.id, NULL, &str, NULL);
+               fprintf(out, "<th>%s</th>", str);
        }
        fprintf(out, "</tr>\n\n");
 
@@ -917,7 +940,7 @@ pine_fixbuf(char *buf)
 {
        int i,j;
 
-       for(i=0,j=0; j < (int)strlen(buf); i++, j++)
+       for(i = 0,j = 0; j < (int)strlen(buf); i++, j++)
                buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
 }
 
@@ -930,15 +953,15 @@ pine_convert_emails(char *s)
        if(s == NULL || *s != '(')
                return;
 
-       for(i=0; s[i]; i++ )
-               s[i] = s[i+1];
+       for(i = 0; s[i]; i++)
+               s[i] = s[i + 1];
 
        if( ( tmp = strchr(s,')')) )
-               *tmp=0;
+               *tmp = '\0';
 
        for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1)
                if(i > MAX_LIST_ITEMS - 1) {
-                       *tmp = 0;
+                       *tmp = '\0';
                        break;
                }
 
@@ -1036,14 +1059,18 @@ pine_parse_file(FILE *in)
 static int
 pine_export_database(FILE *out, struct db_enumerator e)
 {
+       char *emails;
+
        db_enumerate_items(e) {
-               fprintf(out, have_multiple_emails(e.item) ?
+               emails = db_email_get(e.item);
+               fprintf(out, strchr(emails, ',') /* multiple addresses? */ ?
                                "%s\t%s\t(%s)\t\t%s\n" : "%s\t%s\t%s\t\t%s\n",
                                safe_str(db_fget(e.item, NICK)),
                                safe_str(db_name_get(e.item)),
-                               safe_str(db_email_get(e.item)),
+                               emails,
                                safe_str(db_fget(e.item, NOTES))
                                );
+               free(emails);
        }
 
        return 0;
@@ -1500,11 +1527,11 @@ static int
 gcrd_export_database(FILE *out, struct db_enumerator e)
 {
        int j;
-       char *name;
+       char *name, *tmp;
        abook_list *emails, *em;
 
        db_enumerate_items(e) {
-               fprintf(out, "BEGIN:VCARD\nFN:%s\n",
+               fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n",
                                safe_str(db_name_get(e.item)));
 
                name = get_surname(db_name_get(e.item));
@@ -1512,7 +1539,7 @@ gcrd_export_database(FILE *out, struct db_enumerator e)
                        if((db_name_get(e.item))[j] == ' ')
                                break;
                }
-               fprintf(out, "N:%s;%.*s\n",
+               fprintf(out, "N:%s;%.*s\r\n",
                        safe_str(name),
                        j,
                        safe_str(db_name_get(e.item))
@@ -1521,7 +1548,7 @@ gcrd_export_database(FILE *out, struct db_enumerator e)
                free(name);
 
                if(db_fget(e.item, ADDRESS))
-                       fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\n",
+                       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)),
@@ -1531,35 +1558,37 @@ gcrd_export_database(FILE *out, struct db_enumerator e)
                                );
 
                if(db_fget(e.item, PHONE))
-                       fprintf(out, "TEL;HOME:%s\n",
+                       fprintf(out, "TEL;HOME:%s\r\n",
                                        db_fget(e.item, PHONE));
                if(db_fget(e.item, WORKPHONE))
-                       fprintf(out, "TEL;WORK:%s\n",
+                       fprintf(out, "TEL;WORK:%s\r\n",
                                        db_fget(e.item, WORKPHONE));
                if(db_fget(e.item, FAX))
-                       fprintf(out, "TEL;FAX:%s\n",
+                       fprintf(out, "TEL;FAX:%s\r\n",
                                        db_fget(e.item, FAX));
                if(db_fget(e.item, MOBILEPHONE))
-                       fprintf(out, "TEL;CELL:%s\n",
+                       fprintf(out, "TEL;CELL:%s\r\n",
                                        db_fget(e.item, MOBILEPHONE));
 
-               if(*db_email_get(e.item)) {
-                       emails = csv_to_abook_list(db_email_get(e.item));
+               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\n", em->data);
+                               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\n",
+                       fprintf(out, "NOTE:%s\r\n",
                                        db_fget(e.item, NOTES));
                if(db_fget(e.item, URL))
-                       fprintf(out, "URL:%s\n",
+                       fprintf(out, "URL:%s\r\n",
                                        db_fget(e.item, URL));
 
-               fprintf(out, "END:VCARD\n\n");
+               fprintf(out, "END:VCARD\r\n\r\n");
 
        }
 
@@ -1690,7 +1719,7 @@ text_export_database(FILE * out, struct db_enumerator e)
 {
        abook_list *emails, *em;
        int j;
-       char *realname = get_real_name(), *str = NULL;
+       char *realname = get_real_name(), *str = NULL, *tmp;
        char *style = opt_get_str(STR_ADDRESS_STYLE);
 
        fprintf(out,
@@ -1707,8 +1736,9 @@ text_export_database(FILE * out, struct db_enumerator e)
                        fprintf(out, "\n(%s)", db_fget(e.item, NICK));
                fprintf(out, "\n");
 
-               if(*db_email_get(e.item)) {
-                       emails = csv_to_abook_list(db_email_get(e.item));
+               tmp = db_email_get(e.item);
+               if(*tmp) {
+                       emails = csv_to_abook_list(tmp);
 
                        fprintf(out, "\n");
                        for(em = emails; em; em = em->next)
@@ -1716,6 +1746,7 @@ text_export_database(FILE * out, struct db_enumerator e)
 
                        abook_list_free(&emails);
                }
+               free(tmp);
                /* Print address */
                if(db_fget(e.item, ADDRESS)) {
                        if(!safe_strcmp(style, "us"))   /* US like */
@@ -1735,8 +1766,8 @@ text_export_database(FILE * out, struct db_enumerator e)
                        fprintf(out, "\n");
                        for(j = PHONE; j <= MOBILEPHONE; j++)
                                if(db_fget(e.item, j)) {
-                                       get_field_keyname(field_id(j),
-                                                       NULL, &str);
+                                       get_field_info(field_id(j),
+                                                       NULL, &str, NULL);
                                        fprintf(out, "%s: %s\n", str,
                                                db_fget(e.item, j));
                                }
@@ -1796,8 +1827,8 @@ spruce_export_database (FILE *out, struct db_enumerator e)
        fprintf(out, "# This is a generated file made by abook for the Spruce e-mail client.\n\n");
 
        db_enumerate_items(e) {
-               if(strcmp(safe_str(db_email_get(e.item)), "")) {
-                       get_first_email(email, e.item);
+               get_first_email(email, e.item);
+               if(strcmp(email, "")) {
                        fprintf(out, "# Address %d\nName: %s\nEmail: %s\nMemo: %s\n\n",
                                        e.item,
                                        db_name_get(e.item),
@@ -1823,19 +1854,19 @@ spruce_export_database (FILE *out, struct db_enumerator e)
 static int
 wl_export_database(FILE *out, struct db_enumerator e)
 {
-       abook_list *emails;
+       char email[MAX_EMAIL_LEN];
 
        fprintf(out, "# Wanderlust address book written by %s\n\n", PACKAGE);
        db_enumerate_items(e) {
-               if((emails = csv_to_abook_list(db_email_get(e.item))) != NULL) {
+               get_first_email(email, e.item);
+               if(*email) {
                        fprintf(out,
                                "%s\t\"%s\"\t\"%s\"\n",
-                               emails->data,
+                               email,
                                safe_str(db_fget(e.item, NICK)),
                                safe_str(db_name_get(e.item))
                        );
                }
-               abook_list_free(&emails);
        }
 
        fprintf (out, "\n# End of address book file.\n");
@@ -1847,3 +1878,34 @@ wl_export_database(FILE *out, struct db_enumerator e)
  * end of wanderlust addressbook export filter
  */
 
+/*
+ * BSD calendar export filter
+ */
+
+static int
+bsdcal_export_database(FILE *out, struct db_enumerator e)
+{
+       db_enumerate_items(e) {
+               int year, month = 0, day = 0;
+               char *anniversary = db_fget(e.item, ANNIVERSARY);
+
+               if(anniversary) {
+                       if(!parse_date_string(anniversary, &day, &month, &year))
+                               continue;
+
+                       fprintf(out,
+                               _("%02d/%02d\tAnniversary of %s\n"),
+                               month,
+                               day,
+                               safe_str(db_name_get(e.item))
+                       );
+               }
+       }
+
+       return 0;
+}
+
+/*
+ * end of BSD calendar export filter
+ */
+