X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=filter.c;h=9a18975faff485c6bdf25fe9cb67a7da746839a1;hb=5d50b3ba7f2e35013e2236219b11fcf75a058770;hp=d699a5c6774abf6150f0f47c8a70d3d2040ddbae;hpb=265e118d7c916fd33d4bfbd874bcf69f7bf8ff59;p=pkg%2Fabook.git diff --git a/filter.c b/filter.c index d699a5c..9a18975 100644 --- a/filter.c +++ b/filter.c @@ -381,7 +381,7 @@ fexport(char filtname[FILTNAME_LEN], FILE *handle, int enum_mode) return (e_filters[i].func) (handle, e); } - + int export_file(char filtname[FILTNAME_LEN], char *filename) @@ -488,9 +488,9 @@ ldif_read_line(FILE *in) buf = line; continue; } - + if(*line != ' ') { - fseek(in, pos, SEEK_SET); + fseek(in, pos, SEEK_SET); /* fixme ! */ free(line); break; } @@ -509,7 +509,7 @@ ldif_read_line(FILE *in) free(buf); return NULL; } - + return buf; } @@ -520,10 +520,10 @@ ldif_add_item(ldif_item ldif_item) int i; memset(abook_item, 0, sizeof(abook_item)); - + if( !ldif_item[LDIF_ITEM_FIELDS -1] ) goto bail_out; - + for(i=0; i < LDIF_ITEM_FIELDS; i++) { if(ldif_conv_table[i] >= 0 && ldif_item[i] && *ldif_item[i] ) @@ -578,7 +578,7 @@ ldif_parse_file(FILE *handle) my_free(line); continue; /* just skip the errors */ } - + ldif_fix_string(value); ldif_convert(item, type, value); @@ -629,7 +629,7 @@ mutt_read_line(FILE *in, char **alias, char **rest) free(line); return 1; } - + ptr += 5; while( ISSPACE(*ptr) ) @@ -657,14 +657,38 @@ mutt_read_line(FILE *in, char **alias, char **rest) return 0; } +static void +mutt_fix_quoting(char *p) +{ + char *escape = 0; + + for(; *p; p++) { + switch(*p) { + case '\"': + if(escape) + *escape = ' '; + break; + case '\\': + escape = p; + break; + default: + escape = 0; + } + } +} + static void mutt_parse_email(list_item item) { char *line = item[NAME]; - char *start = line, *tmp; + char *tmp; char *name, *email; +#if 0 + char *start = line; int i = 0; +#endif + mutt_fix_quoting(line); tmp = strconcat("From: ", line, NULL); getname(tmp, &name, &email); free(tmp); @@ -677,7 +701,11 @@ mutt_parse_email(list_item item) item[EMAIL] = email; else return; - + + /* + * this is completely broken + */ +#if 0 while( (start = strchr(start, ',')) && i++ < MAX_EMAILS - 1) { tmp = strconcat("From: ", ++start, NULL); getname(tmp, &name, &email); @@ -693,6 +721,7 @@ mutt_parse_email(list_item item) } } } +#endif } static int @@ -702,7 +731,7 @@ mutt_parse_file(FILE *in) for(;;) { memset(item, 0, sizeof(item)); - + if( !mutt_read_line(in, &item[NICK], &item[NAME]) ) mutt_parse_email(item); @@ -856,6 +885,8 @@ html_export_write_tail(FILE *out) * pine addressbook import filter */ +#define PINE_BUF_SIZE 2048 + static void pine_fixbuf(char *buf) { @@ -879,7 +910,7 @@ pine_convert_emails(char *s) if( ( tmp = strchr(s,')')) ) *tmp=0; - + for(i=1; ( tmp = strchr(s, ',') ) != NULL ; i++, s=tmp+1 ) if( i > MAX_EMAILS - 1 ) { *tmp = 0; @@ -894,7 +925,7 @@ pine_parse_buf(char *buf) list_item item; char *start = buf; char *end; - char tmp[400]; + char tmp[PINE_BUF_SIZE]; int i, len, last; int pine_conv_table[]= {NICK, NAME, EMAIL, -1, NOTES}; @@ -903,23 +934,24 @@ pine_parse_buf(char *buf) for(i=0, last=0; !last ; i++) { if( ! (end = strchr(start, '\t')) ) last=1; - + len = last ? strlen(start) : (int) (end-start); - len = min(len, 400-1); - + len = min(len, PINE_BUF_SIZE - 1); + if(i < (int)(sizeof(pine_conv_table) / sizeof(*pine_conv_table)) && pine_conv_table[i] >= 0) { strncpy(tmp, start, len); tmp[len] = 0; - item[pine_conv_table[i]] = strdup(tmp); + if(*tmp) + item[pine_conv_table[i]] = strdup(tmp); } start = end + 1; } - + pine_convert_emails(item[EMAIL]); add_item2database(item); } - + #define LINESIZE 1024 @@ -932,7 +964,7 @@ pine_parse_file(FILE *in) int i; fgets(line, LINESIZE, in); - + while(!feof(in)) { for(i = 2;;i++) { buf = (char *) realloc(buf, i*LINESIZE); @@ -945,7 +977,7 @@ pine_parse_file(FILE *in) else while( *ptr == ' ') ptr++; - + strcat(buf, ptr); } if( *buf == '#' ) { @@ -1037,10 +1069,10 @@ csv_remove_quotes(char *s) { char *copy, *trimmed; int len; - + copy = trimmed = strdup(s); strtrim(trimmed); - + len = strlen(trimmed); if(trimmed[len - 1] == '\"' && *trimmed == '\"') { if(len < 3) { @@ -1165,59 +1197,74 @@ csv_parse_file(FILE *in) */ /* - * csv addressbook export filter + * csv addressbook export filters */ +#define CSV_LAST (-1) +#define CSV_UNDEFINED (-2) +#define CSV_SPECIAL(X) (-3 - (X)) +#define CSV_IS_SPECIAL(X) ((X) <= -3) + static int -csv_export_database(FILE *out, struct db_enumerator e) +csv_export_common(FILE *out, struct db_enumerator e, + int fields[], void (*special_func)(FILE *, int, int)) { - int j; - int csv_export_fields[] = { - NAME, - EMAIL, - PHONE, - NOTES, - NICK, - -1 - }; + int i; db_enumerate_items(e) { - for(j = 0; csv_export_fields[j] >= 0; j++) { - fprintf(out,( - strchr(safe_str(database[e.item][csv_export_fields[j]]), ',') || - strchr(safe_str(database[e.item][csv_export_fields[j]]), '\"') - ) ? + for(i = 0; fields[i] != CSV_LAST; i++) { + if(fields[i] == CSV_UNDEFINED) + fprintf(out, "\"\""); + else if(CSV_IS_SPECIAL(fields[i])) { + if(special_func) + (*special_func)(out, e.item, fields[i]); + } else + /*fprintf(out,( + strchr(safe_str(database[e.item][fields[i]]), ',') || + strchr(safe_str(database[e.item][fields[i]]), '\"')) ? "\"%s\"" : "%s", - safe_str(database[e.item][csv_export_fields[j]]) - ); - if(csv_export_fields[j+1] >= 0) + safe_str(database[e.item][fields[i]]) + );*/ + fprintf(out, "\"%s\"", + safe_str(database[e.item][fields[i]])); + + if(fields[i + 1] != CSV_LAST) fputc(',', out); } fputc('\n', out); } - - return 0; } -/* - * end of csv export filter - */ +static int +csv_export_database(FILE *out, struct db_enumerator e) +{ + int csv_export_fields[] = { + NAME, + EMAIL, + PHONE, + NOTES, + NICK, + CSV_LAST + }; + csv_export_common(out, e, csv_export_fields, NULL); + + return 0; +} /* - * Palm csv addressbook export filter + * palm csv */ -/* A few contants, not the best way to init them but better dan - * some number that will break things later on... */ -#define PALM_CSV_UNDEFINED (LAST_FIELD+1) -#define PALM_CSV_END (LAST_FIELD+2) -#define PALM_CSV_CAT (LAST_FIELD+3) +#define PALM_CSV_NAME CSV_SPECIAL(0) +#define PALM_CSV_END CSV_SPECIAL(1) +#define PALM_CSV_CAT CSV_SPECIAL(2) static void -palm_split_and_write_name(FILE *out, char *name) { +palm_split_and_write_name(FILE *out, char *name) +{ char *p; assert(name); @@ -1234,14 +1281,31 @@ palm_split_and_write_name(FILE *out, char *name) { } } +static void +palm_csv_handle_specials(FILE *out, int item, int field) +{ + switch(field) { + case PALM_CSV_NAME: + palm_split_and_write_name(out, database[item][NAME]); + break; + case PALM_CSV_CAT: + fprintf(out, "\"abook\""); + break; + case PALM_CSV_END: + fprintf(out, "\"0\""); + break; + default: + assert(0); + } +} + static int palm_export_database(FILE *out, struct db_enumerator e) { - int j; int palm_export_fields[] = { - NAME, /* LASTNAME, FIRSTNAME */ - PALM_CSV_UNDEFINED, /* TITLE, */ - PALM_CSV_UNDEFINED, /* COMPAGNY, */ + PALM_CSV_NAME, /* LASTNAME, FIRSTNAME */ + CSV_UNDEFINED, /* TITLE */ + CSV_UNDEFINED, /* COMPANY */ WORKPHONE, /* WORK PHONE */ PHONE, /* HOME PHONE */ FAX, /* FAX */ @@ -1254,54 +1318,23 @@ palm_export_database(FILE *out, struct db_enumerator e) COUNTRY, /* COUNTRY */ NICK, /* DEFINED 1 */ URL, /* DEFINED 2 */ - PALM_CSV_UNDEFINED, /* DEFINED 3 */ - PALM_CSV_UNDEFINED, /* DEFINED 4 */ + CSV_UNDEFINED, /* DEFINED 3 */ + CSV_UNDEFINED, /* DEFINED 4 */ NOTES, /* NOTE */ PALM_CSV_END, /* "0" */ PALM_CSV_CAT, /* CATEGORY */ - -1 + CSV_LAST }; - db_enumerate_items(e) { - for(j = 0; palm_export_fields[j] >= 0; j++) { - - switch( palm_export_fields[j] ) { - - case PALM_CSV_UNDEFINED: - fprintf(out, "\"\""); - break; - case PALM_CSV_END: - fprintf(out, "\"0\""); - break; - case PALM_CSV_CAT: - fprintf(out, "\"abook\""); - break; - case NAME: - palm_split_and_write_name(out, - safe_str(database[e.item] - [palm_export_fields[j]])) ; - break; - - default: - fprintf(out, "\"%s\"" , - safe_str(database[e.item] - [palm_export_fields[j]])); - } - - if(palm_export_fields[j+1] >= 0) - fputc(',', out); - } - fputc('\n', out); - } + csv_export_common(out, e, palm_export_fields, palm_csv_handle_specials); return 0; } /* - * end of palm csv export filter + * end of csv export filters */ - /* * GnomeCard (VCard) addressbook export filter */ @@ -1509,7 +1542,7 @@ text_export_database(FILE * out, struct db_enumerator e) fprintf(out, "-----------------------------------------\n\n"); fprintf(out, "%s", database[e.item][NAME]); - if (database[e.item][NICK]) + if (database[e.item][NICK] && *database[e.item][NICK]) fprintf(out, "\n(%s)", database[e.item][NICK]); fprintf(out, "\n");