Bug Summary

File:build/../filter.c
Location:line 2730, column 24
Description:Result of 'malloc' is converted to a pointer of type 'enum field_types', which is incompatible with sizeof operand type 'enum field_types *'

Annotated Source Code

1
2/*
3 * $Id$
4 *
5 * by JH <jheinonen@users.sourceforge.net>
6 *
7 * Copyright (C) Jaakko Heinonen
8 */
9
10#define _GNU_SOURCE
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <ctype.h>
16#include <pwd.h>
17#include <sys/stat.h>
18#include <sys/types.h>
19#include "abook_curses.h"
20#include "filter.h"
21#include "abook.h"
22#include "database.h"
23#include "edit.h"
24#include "gettext.h"
25#include "list.h"
26#include "misc.h"
27#include "options.h"
28#include "ui.h"
29#include "xmalloc.h"
30#include <assert.h>
31
32#ifdef HAVE_VFORMAT
33#include "vcard.h"
34#endif
35
36extern abook_field_list *fields_list;
37extern int fields_count;
38// see also enum field_types @database.h
39extern abook_field standard_fields[];
40
41/*
42 * function declarations
43 */
44
45/*
46 * import filter prototypes
47 */
48
49static int ldif_parse_file(FILE *handle);
50static int mutt_parse_file(FILE *in);
51static int pine_parse_file(FILE *in);
52static int csv_parse_file(FILE *in);
53static int allcsv_parse_file(FILE *in);
54static int palmcsv_parse_file(FILE *in);
55static int vcard_parse_file(FILE *in);
56
57/*
58 * export filter prototypes
59 */
60
61static int ldif_export_database(FILE *out, struct db_enumerator e);
62static int html_export_database(FILE *out, struct db_enumerator e);
63static int pine_export_database(FILE *out, struct db_enumerator e);
64static int csv_export_database(FILE *out, struct db_enumerator e);
65static int allcsv_export_database(FILE *out, struct db_enumerator e);
66static int palm_export_database(FILE *out, struct db_enumerator e);
67static int vcard_export_database(FILE *out, struct db_enumerator e);
68static int mutt_alias_export(FILE *out, struct db_enumerator e);
69static int mutt_query_export_database(FILE *out, struct db_enumerator e);
70static int elm_alias_export(FILE *out, struct db_enumerator e);
71static int text_export_database(FILE *out, struct db_enumerator e);
72static int spruce_export_database(FILE *out, struct db_enumerator e);
73static int wl_export_database(FILE *out, struct db_enumerator e);
74static int bsdcal_export_database(FILE *out, struct db_enumerator e);
75static int custom_export_database(FILE *out, struct db_enumerator e);
76
77/*
78 * export filter item prototypes
79 */
80
81void vcard_export_item(FILE *out, int item);
82void muttq_print_item(FILE *file, int item);
83void custom_print_item(FILE *out, int item);
84
85/*
86 * end of function declarations
87 */
88
89struct abook_input_filter i_filters[] = {
90 { "abook", N_("abook native format")"abook native format", parse_database },
91 { "ldif", N_("ldif / Netscape addressbook")"ldif / Netscape addressbook", ldif_parse_file },
92 { "mutt", N_("mutt alias")"mutt alias", mutt_parse_file },
93 { "pine", N_("pine addressbook")"pine addressbook", pine_parse_file },
94 { "csv", N_("comma separated values")"comma separated values", csv_parse_file },
95 { "allcsv", N_("comma separated values (all fields)")"comma separated values (all fields)", allcsv_parse_file },
96 { "palmcsv", N_("Palm comma separated values")"Palm comma separated values", palmcsv_parse_file },
97 { "vcard", N_("vCard file")"vCard file", vcard_parse_file },
98 { "\0", NULL((void*)0), NULL((void*)0) }
99};
100
101struct abook_output_filter e_filters[] = {
102 { "abook", N_("abook native format")"abook native format", write_database },
103 { "ldif", N_("ldif / Netscape addressbook (.4ld)")"ldif / Netscape addressbook (.4ld)", ldif_export_database },
104 { "vcard", N_("vCard 2 file")"vCard 2 file", vcard_export_database },
105 { "mutt", N_("mutt alias")"mutt alias", mutt_alias_export },
106 { "muttq", N_("mutt query format (internal use)")"mutt query format (internal use)", mutt_query_export_database },
107 { "html", N_("html document")"html document", html_export_database },
108 { "pine", N_("pine addressbook")"pine addressbook", pine_export_database },
109 { "csv", N_("comma separated values")"comma separated values", csv_export_database },
110 { "allcsv", N_("comma separated values (all fields)")"comma separated values (all fields)", allcsv_export_database },
111 { "palmcsv", N_("Palm comma separated values")"Palm comma separated values", palm_export_database},
112 { "elm", N_("elm alias")"elm alias", elm_alias_export },
113 { "text", N_("plain text")"plain text", text_export_database },
114 { "wl", N_("Wanderlust address book")"Wanderlust address book", wl_export_database },
115 { "spruce", N_("Spruce address book")"Spruce address book", spruce_export_database },
116 { "bsdcal", N_("BSD calendar")"BSD calendar", bsdcal_export_database },
117 { "custom", N_("Custom format")"Custom format", custom_export_database },
118 { "\0", NULL((void*)0), NULL((void*)0) }
119};
120
121struct abook_output_item_filter u_filters[] = {
122 { "vcard", N_("vCard 2 file")"vCard 2 file", vcard_export_item },
123 { "muttq", N_("mutt alias")"mutt alias", muttq_print_item },
124 { "custom", N_("Custom format")"Custom format", custom_print_item },
125 { "\0", NULL((void*)0) }
126};
127
128/*
129 * common functions
130 */
131
132void
133print_filters()
134{
135 int i;
136
137 puts(_("input formats:")((const char *) ("input formats:")));
138 for(i=0; *i_filters[i].filtname ; i++)
139 printf("\t%s\t%s\n", i_filters[i].filtname,
140 gettext(i_filters[i].desc)((const char *) (i_filters[i].desc)));
141
142 putchar('\n');
143
144 puts(_("output formats:")((const char *) ("output formats:")));
145 for(i=0; *e_filters[i].filtname ; i++)
146 printf("\t%s\t%s\n", e_filters[i].filtname,
147 gettext(e_filters[i].desc)((const char *) (e_filters[i].desc)));
148
149 putchar('\n');
150
151 puts(_("query-compatible output formats:")((const char *) ("query-compatible output formats:")));
152 for(i=0; *u_filters[i].filtname ; i++)
153 printf("\t%s\t%s\n", u_filters[i].filtname,
154 gettext(u_filters[i].desc)((const char *) (u_filters[i].desc)));
155
156 putchar('\n');
157}
158
159static int
160number_of_output_filters()
161{
162 int i;
163
164 for(i=0; *e_filters[i].filtname ; i++)
165 ;
166
167 return i;
168}
169
170static int
171number_of_input_filters()
172{
173 int i;
174
175 for(i=0; *i_filters[i].filtname ; i++)
176 ;
177
178 return i;
179}
180
181static char *
182get_real_name()
183{
184 char *username = getenv("USER");
185 struct passwd *pwent;
186 int rtn;
187 char *tmp;
188
189 pwent = getpwnam(username);
190
191 if((tmp = xstrdup(pwent->pw_gecos)) == NULL((void*)0))
192 return xstrdup(username);
193
194 rtn = sscanf(pwent->pw_gecos, "%[^,]", tmp);
195 if (rtn == EOF(-1) || rtn == 0) {
196 free(tmp);
197 return xstrdup(username);
198 } else
199 return tmp;
200}
201
202/*
203 * import
204 */
205
206static int i_read_file(char *filename, int (*func) (FILE *in));
207
208static void
209import_screen()
210{
211 int i;
212
213 clear()wclear(stdscr);
214
215 refresh_statusline();
216 headerline(_("import database")((const char *) ("import database")));
217
218 mvaddstr(3, 1, _("please select a filter"))(wmove(stdscr,3,1) == (-1) ? (-1) : waddnstr(stdscr,((const char
*) ("please select a filter")),-1))
;
219
220
221 for(i=0; *i_filters[i].filtname ; i++)
222 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
223 i_filters[i].filtname,
224 gettext(i_filters[i].desc)((const char *) (i_filters[i].desc)));
225
226 mvprintw(6 + i, 6, _("x -\tcancel")((const char *) ("x -\tcancel")));
227}
228
229int
230import_database()
231{
232 int filter;
233 char *filename;
234 int tmp = db_n_items();
235
236 import_screen();
237
238 filter = getch()wgetch(stdscr) - 'a';
239 if(filter == 'x' - 'a' ||
240 filter >= number_of_input_filters() || filter < 0) {
241 refresh_screen();
242 return 1;
243 }
244
245 mvaddstr(5+filter, 2, "->")(wmove(stdscr,5+filter,2) == (-1) ? (-1) : waddnstr(stdscr,"->"
,-1))
;
246
247 filename = ask_filename(_("Filename: ")((const char *) ("Filename: ")));
248 if(!filename) {
249 refresh_screen();
250 return 2;
251 }
252
253 if(i_read_file(filename, i_filters[filter].func ))
254 statusline_msg(_("Error occured while opening the file")((const char *) ("Error occured while opening the file")));
255 else if(tmp == db_n_items())
256 statusline_msg(_("File does not seem to be a valid addressbook")((const char *) ("File does not seem to be a valid addressbook"
))
);
257
258 refresh_screen();
259 free(filename);
260
261 return 0;
262}
263
264
265
266static int
267i_read_file(char *filename, int (*func) (FILE *in))
268{
269 FILE *in;
270 int ret = 0;
271
272 if( (in = abook_fopen( filename, "r" )) == NULL((void*)0) )
273 return 1;
274
275 ret = (*func) (in);
276
277 fclose(in);
278
279 return ret;
280}
281
282int
283import_file(char filtname[FILTNAME_LEN8], char *filename)
284{
285 int i;
286 int tmp = db_n_items();
287 int ret = 0;
288
289 for(i=0;; i++) {
290 if(! strncasecmp(i_filters[i].filtname, filtname,
291 FILTNAME_LEN8) )
292 break;
293 if(! *i_filters[i].filtname) {
294 i = -1;
295 break;
296 }
297 }
298
299 if(i < 0)
300 return -1;
301
302#ifdef HAVE_VFORMAT
303 // this is a special case for
304 // libvformat whose API expects a filename
305 if(!strcmp(filtname, "vcard")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(filtname) && __builtin_constant_p ("vcard") &&
(__s1_len = strlen (filtname), __s2_len = strlen ("vcard"), (
!((size_t)(const void *)((filtname) + 1) - (size_t)(const void
*)(filtname) == 1) || __s1_len >= 4) && (!((size_t
)(const void *)(("vcard") + 1) - (size_t)(const void *)("vcard"
) == 1) || __s2_len >= 4)) ? __builtin_strcmp (filtname, "vcard"
) : (__builtin_constant_p (filtname) && ((size_t)(const
void *)((filtname) + 1) - (size_t)(const void *)(filtname) ==
1) && (__s1_len = strlen (filtname), __s1_len < 4
) ? (__builtin_constant_p ("vcard") && ((size_t)(const
void *)(("vcard") + 1) - (size_t)(const void *)("vcard") == 1
) ? __builtin_strcmp (filtname, "vcard") : (__extension__ ({ const
unsigned char *__s2 = (const unsigned char *) (const char *)
("vcard"); int __result = (((const unsigned char *) (const char
*) (filtname))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (filtname))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (filtname))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (filtname))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("vcard") && ((size_t)(const void *)(("vcard") + 1) -
(size_t)(const void *)("vcard") == 1) && (__s2_len =
strlen ("vcard"), __s2_len < 4) ? (__builtin_constant_p (
filtname) && ((size_t)(const void *)((filtname) + 1) -
(size_t)(const void *)(filtname) == 1) ? __builtin_strcmp (filtname
, "vcard") : (- (__extension__ ({ const unsigned char *__s2 =
(const unsigned char *) (const char *) (filtname); int __result
= (((const unsigned char *) (const char *) ("vcard"))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("vcard"))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("vcard"))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) ("vcard"))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (filtname, "vcard"
)))); })
) {
306 if(!strcmp(filename, "-")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(filename) && __builtin_constant_p ("-") && (
__s1_len = strlen (filename), __s2_len = strlen ("-"), (!((size_t
)(const void *)((filename) + 1) - (size_t)(const void *)(filename
) == 1) || __s1_len >= 4) && (!((size_t)(const void
*)(("-") + 1) - (size_t)(const void *)("-") == 1) || __s2_len
>= 4)) ? __builtin_strcmp (filename, "-") : (__builtin_constant_p
(filename) && ((size_t)(const void *)((filename) + 1
) - (size_t)(const void *)(filename) == 1) && (__s1_len
= strlen (filename), __s1_len < 4) ? (__builtin_constant_p
("-") && ((size_t)(const void *)(("-") + 1) - (size_t
)(const void *)("-") == 1) ? __builtin_strcmp (filename, "-")
: (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("-"); int __result = (((const unsigned
char *) (const char *) (filename))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (filename))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (filename))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (filename))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p ("-") && ((size_t)(const
void *)(("-") + 1) - (size_t)(const void *)("-") == 1) &&
(__s2_len = strlen ("-"), __s2_len < 4) ? (__builtin_constant_p
(filename) && ((size_t)(const void *)((filename) + 1
) - (size_t)(const void *)(filename) == 1) ? __builtin_strcmp
(filename, "-") : (- (__extension__ ({ const unsigned char *
__s2 = (const unsigned char *) (const char *) (filename); int
__result = (((const unsigned char *) (const char *) ("-"))[0
] - __s2[0]); if (__s2_len > 0 && __result == 0) {
__result = (((const unsigned char *) (const char *) ("-"))[1
] - __s2[1]); if (__s2_len > 1 && __result == 0) {
__result = (((const unsigned char *) (const char *) ("-"))[2
] - __s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ("-"))[3] - __s2[
3]); } } __result; })))) : __builtin_strcmp (filename, "-")))
); })
)
307 ret = vcard_parse_file_libvformat("/dev/stdin");
308 else
309 ret = vcard_parse_file_libvformat(filename);
310 }
311 else
312#endif
313
314 if(!strcmp(filename, "-")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(filename) && __builtin_constant_p ("-") && (
__s1_len = strlen (filename), __s2_len = strlen ("-"), (!((size_t
)(const void *)((filename) + 1) - (size_t)(const void *)(filename
) == 1) || __s1_len >= 4) && (!((size_t)(const void
*)(("-") + 1) - (size_t)(const void *)("-") == 1) || __s2_len
>= 4)) ? __builtin_strcmp (filename, "-") : (__builtin_constant_p
(filename) && ((size_t)(const void *)((filename) + 1
) - (size_t)(const void *)(filename) == 1) && (__s1_len
= strlen (filename), __s1_len < 4) ? (__builtin_constant_p
("-") && ((size_t)(const void *)(("-") + 1) - (size_t
)(const void *)("-") == 1) ? __builtin_strcmp (filename, "-")
: (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("-"); int __result = (((const unsigned
char *) (const char *) (filename))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (filename))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (filename))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (filename))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p ("-") && ((size_t)(const
void *)(("-") + 1) - (size_t)(const void *)("-") == 1) &&
(__s2_len = strlen ("-"), __s2_len < 4) ? (__builtin_constant_p
(filename) && ((size_t)(const void *)((filename) + 1
) - (size_t)(const void *)(filename) == 1) ? __builtin_strcmp
(filename, "-") : (- (__extension__ ({ const unsigned char *
__s2 = (const unsigned char *) (const char *) (filename); int
__result = (((const unsigned char *) (const char *) ("-"))[0
] - __s2[0]); if (__s2_len > 0 && __result == 0) {
__result = (((const unsigned char *) (const char *) ("-"))[1
] - __s2[1]); if (__s2_len > 1 && __result == 0) {
__result = (((const unsigned char *) (const char *) ("-"))[2
] - __s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ("-"))[3] - __s2[
3]); } } __result; })))) : __builtin_strcmp (filename, "-")))
); })
) {
315 struct stat s;
316 if((fstat(fileno(stdinstdin), &s)) == -1 || S_ISDIR(s.st_mode)((((s.st_mode)) & 0170000) == (0040000)))
317 ret = 1;
318 else
319 ret = (*i_filters[i].func) (stdinstdin);
320 } else
321 ret = i_read_file(filename, i_filters[i].func);
322
323 if(tmp == db_n_items())
324 ret = 1;
325
326 return ret;
327}
328
329/*
330 * export
331 */
332
333static int e_write_file(char *filename,
334 int (*func) (FILE *in, struct db_enumerator e), int mode);
335
336static void
337export_screen()
338{
339 int i;
340
341 clear()wclear(stdscr);
342
343
344 refresh_statusline();
345 headerline(_("export database")((const char *) ("export database")));
346
347 mvaddstr(3, 1, _("please select a filter"))(wmove(stdscr,3,1) == (-1) ? (-1) : waddnstr(stdscr,((const char
*) ("please select a filter")),-1))
;
348
349
350 for(i = 0; *e_filters[i].filtname ; i++)
351 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
352 e_filters[i].filtname,
353 gettext(e_filters[i].desc)((const char *) (e_filters[i].desc)));
354
355 mvprintw(6 + i, 6, _("x -\tcancel")((const char *) ("x -\tcancel")));
356}
357
358int
359export_database()
360{
361 int filter;
362 int enum_mode = ENUM_ALL;
363 char *filename;
364
365 export_screen();
366
367 filter = getch()wgetch(stdscr) - 'a';
368 if(filter == 'x' - 'a' ||
369 filter >= number_of_output_filters() || filter < 0) {
370 refresh_screen();
371 return 1;
372 }
373
374 mvaddstr(5 + filter, 2, "->")(wmove(stdscr,5 + filter,2) == (-1) ? (-1) : waddnstr(stdscr,
"->",-1))
;
375
376 if(selected_items()) {
377 switch(statusline_askchoice(
378 _("Export <a>ll, export <s>elected, or <c>ancel?")((const char *) ("Export <a>ll, export <s>elected, or <c>ancel?"
))
,
379 S_("keybindings:all/selected/cancel|asc")sgettext ("keybindings:all/selected/cancel|asc"), 3)) {
380 case 1:
381 break;
382 case 2:
383 enum_mode = ENUM_SELECTED;
384 break;
385 case 0:
386 case 3:
387 refresh_screen();
388 return 1;
389 }
390 clear_statusline();
391 }
392
393 filename = ask_filename(_("Filename: ")((const char *) ("Filename: ")));
394 if(!filename) {
395 refresh_screen();
396 return 2;
397 }
398
399 if( e_write_file(filename, e_filters[filter].func, enum_mode))
400 statusline_msg(_("Error occured while exporting")((const char *) ("Error occured while exporting")));
401
402 refresh_screen();
403 free(filename);
404
405 return 0;
406}
407
408struct abook_output_item_filter select_output_item_filter(char filtname[FILTNAME_LEN8]) {
409 int i;
410 for(i=0;; i++) {
411 if(!strncasecmp(u_filters[i].filtname, filtname, FILTNAME_LEN8))
412 break;
413 if(!*u_filters[i].filtname) {
414 i = -1;
415 break;
416 }
417 }
418 return u_filters[i];
419}
420
421void
422e_write_item(FILE *out, int item, void (*func) (FILE *in, int item))
423{
424 (*func) (out, item);
425}
426
427static int
428e_write_file(char *filename, int (*func) (FILE *in, struct db_enumerator e),
429 int mode)
430{
431 FILE *out;
432 int ret = 0;
433 struct db_enumerator enumerator = init_db_enumerator(mode);
434
435 if((out = fopen(filename, "a")) == NULL((void*)0))
436 return 1;
437
438 if(ftell(out))
439 return 1;
440
441 ret = (*func) (out, enumerator);
442
443 fclose(out);
444
445 return ret;
446}
447
448int
449fexport(char filtname[FILTNAME_LEN8], FILE *handle, int enum_mode)
450{
451 int i;
452 struct db_enumerator e = init_db_enumerator(enum_mode);
453
454 for(i=0;; i++) {
455 if(!strncasecmp(e_filters[i].filtname, filtname,
456 FILTNAME_LEN8))
457 break;
458 if(!*e_filters[i].filtname) {
459 i = -1;
460 break;
461 }
462 }
463
464 return (e_filters[i].func) (handle, e);
465}
466
467
468
469int
470export_file(char filtname[FILTNAME_LEN8], char *filename)
471{
472 const int mode = ENUM_ALL;
473 int i;
474 int ret = 0;
475 struct db_enumerator e = init_db_enumerator(mode);
476
477 for(i=0;; i++) {
478 if(!strncasecmp(e_filters[i].filtname, filtname,
479 FILTNAME_LEN8))
480 break;
481 if(!*e_filters[i].filtname) {
482 i = -1;
483 break;
484 }
485 }
486
487 if(i < 0)
488 return -1;
489
490 if(!strcmp(filename, "-")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(filename) && __builtin_constant_p ("-") && (
__s1_len = strlen (filename), __s2_len = strlen ("-"), (!((size_t
)(const void *)((filename) + 1) - (size_t)(const void *)(filename
) == 1) || __s1_len >= 4) && (!((size_t)(const void
*)(("-") + 1) - (size_t)(const void *)("-") == 1) || __s2_len
>= 4)) ? __builtin_strcmp (filename, "-") : (__builtin_constant_p
(filename) && ((size_t)(const void *)((filename) + 1
) - (size_t)(const void *)(filename) == 1) && (__s1_len
= strlen (filename), __s1_len < 4) ? (__builtin_constant_p
("-") && ((size_t)(const void *)(("-") + 1) - (size_t
)(const void *)("-") == 1) ? __builtin_strcmp (filename, "-")
: (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("-"); int __result = (((const unsigned
char *) (const char *) (filename))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (filename))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (filename))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (filename))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p ("-") && ((size_t)(const
void *)(("-") + 1) - (size_t)(const void *)("-") == 1) &&
(__s2_len = strlen ("-"), __s2_len < 4) ? (__builtin_constant_p
(filename) && ((size_t)(const void *)((filename) + 1
) - (size_t)(const void *)(filename) == 1) ? __builtin_strcmp
(filename, "-") : (- (__extension__ ({ const unsigned char *
__s2 = (const unsigned char *) (const char *) (filename); int
__result = (((const unsigned char *) (const char *) ("-"))[0
] - __s2[0]); if (__s2_len > 0 && __result == 0) {
__result = (((const unsigned char *) (const char *) ("-"))[1
] - __s2[1]); if (__s2_len > 1 && __result == 0) {
__result = (((const unsigned char *) (const char *) ("-"))[2
] - __s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ("-"))[3] - __s2[
3]); } } __result; })))) : __builtin_strcmp (filename, "-")))
); })
)
491 ret = (e_filters[i].func) (stdoutstdout, e);
492 else
493 ret = e_write_file(filename, e_filters[i].func, mode);
494
495 return ret;
496}
497
498/*
499 * end of common functions
500 */
501
502/*
503 * ldif import
504 */
505
506#include "ldif.h"
507
508/* During LDIF import we need more fields than the
509 ITEM_FIELDS of a *list_item. Eg: "objectclass"
510 to test valid records, ...
511 Here we extends the existing field_types enum
512 to define new fields indexes usable during processing.
513 Newly created LDIF attr names could be associated to
514 them using ldif_conv_table[]. */
515typedef enum {
516 LDIF_OBJECTCLASS = ITEM_FIELDS + 1
517} ldif_field_types;
518
519#define LDIF_ITEM_FIELDSLDIF_OBJECTCLASS LDIF_OBJECTCLASS
520
521typedef char *ldif_item[LDIF_ITEM_FIELDSLDIF_OBJECTCLASS];
522
523/* LDIF field's names *must* respect the ordering
524 defined by the field_types enum from database.h
525 This is only used to define (for export only)
526 abook standard field to LDIF attr name mappings */
527static ldif_item ldif_field_names = {
528 "cn", // NAME
529 "mail", // EMAIL
530 "streetaddress", // ADDRESS
531 "streetaddress2", // ADDRESS2
532 "locality", // CITY
533 "st", // STATE
534 "postalcode", // ZIP
535 "countryname", // COUNTRY
536 "homephone", // PHONE
537 "telephonenumber", // WORKPHONE
538 "facsimiletelephonenumber", // FAX
539 "cellphone", // MOBILEPHONE
540 "xmozillanickname", // NICK
541 "homeurl", // URL
542 "description", // NOTES
543 "anniversary", // ANNIVERSARY
544 "ou", // GROUPS
545};
546
547/* Used to map LDIF attr names from input to
548 the abook restricted set of standard fields. */
549typedef struct {
550 char *key;
551 int index;
552} ldif_available_items;
553
554static ldif_available_items ldif_conv_table[] = {
555 /* initial field names respect the field_types enum
556 from database.h but this is only for readability.
557 This ldif_item struct allow use to define multiple
558 LDIF field names ("attribute names") for one abook field */
559
560 {"cn", NAME}, // 0
561 {"mail", EMAIL},
562 {"streetaddress", ADDRESS},
563 {"streetaddress2", ADDRESS2},
564 {"locality", CITY},
565 {"st", STATE},
566 {"postalcode", ZIP},
567 {"countryname", COUNTRY},
568 {"homephone", PHONE},
569 {"telephonenumber", WORKPHONE}, // workphone, according to Mozilla
570 {"facsimiletelephonenumber", FAX},
571 {"cellphone", MOBILEPHONE},
572 {"mozillanickname", NICK},
573 {"homeurl", URL},
574 {"description", NOTES},
575 {"anniversary", ANNIVERSARY},
576 {"ou", GROUPS}, // 16
577
578 // here comes a couple of aliases
579 {"mozillasecondemail", EMAIL},
580 {"homecity", CITY},
581 {"zip", ZIP},
582 {"tel", PHONE},
583 {"xmozillaanyphone", WORKPHONE}, // ever used ?
584 {"workphone", WORKPHONE},
585 {"fax", FAX},
586 {"telexnumber", FAX},
587 {"mobilephone", MOBILEPHONE},
588 {"mobile", MOBILEPHONE},
589 {"xmozillanickname", NICK},
590 {"labeledURI", URL},
591 {"notes", NOTES},
592 {"birthday", ANNIVERSARY},
593 {"category", GROUPS},
594
595 /* TODO:
596 "sn": append to lastname ?
597 "surname": append to lastname ?
598 "givenname": prepend to firstname ? */
599
600 /* here starts dummy fields:
601
602 As long as additional indexes are created
603 (using the above ldif_field_types),
604 any other LDIF attr name can be added and
605 used during ldif entry processing.
606 But obviously fields > ITEM_FIELDS (database.h) won't be
607 copied into the final *list_item. */
608
609 /* - to avoid mistake, don't use the special ITEM_FIELDS value.
610 - see also: http://mxr.mozilla.org/comm-central/source/mailnews/addrbook/src/nsAbLDIFService.cpp */
611
612 // used to check valid LDIF records:
613 {"objectclass", LDIF_OBJECTCLASS}
614};
615const int LDIF_IMPORTABLE_ITEM_FIELDS = (int)sizeof(ldif_conv_table)/sizeof(*ldif_conv_table);
616
617/*
618 Handles multi-line strings.
619 If a string starts with a space, it's the continuation
620 of the previous line. Thus we need to always read ahead.
621 But for this to work with stdin, we need to stores the next
622 line for later use in case it's not a continuation of the
623 first line.
624 */
625static char *
626ldif_read_line(FILE *in, char **next_line)
627{
628 char *buf = NULL((void*)0);
629 char *ptr, *tmp;
630 char *line;
631
632 // buf filled with the first line
633 if(!*next_line)
634 buf = getaline(in);
635 else {
636 buf = xstrdup(*next_line);
637 xfree(*next_line)do { free(*next_line); *next_line = ((void*)0); } while(0);
638 }
639
640 while(!feof(in)) {
641 // if no line already read-ahead.
642 line = getaline(in);
643 if(!line) break;
644
645 // this is not a continuation of what is already in buf
646 // store it for the next round
647 if(*line != ' ') {
648 *next_line = line;
649 break;
650 }
651
652 // starts with ' ': this is the continuation of buf
653 ptr = line;
654 while( *ptr == ' ')
655 ptr++;
656
657 tmp = buf;
658 buf = strconcat(buf, ptr, NULL((void*)0));
659 free(tmp);
660 free(line);
661 }
662
663 if(buf && *buf == '#' ) {
664 free(buf);
665 return NULL((void*)0);
666 }
667
668 return buf;
669}
670
671static void
672ldif_add_item(ldif_item li)
673{
674 list_item item;
675 int i;
676
677 /* if there's no value for "objectclass"
678 it's probably a buggy record */
679 if(!li[LDIF_OBJECTCLASS])
680 goto bail_out;
681
682 /* just copy from our extended ldif_item to a regular
683 list_item,
684 TODO: API could be changed so db_fput_byid() is usable */
685 item = item_create();
686 for(i=0; i < ITEM_FIELDS; i++) {
687 if(li[i] && *li[i])
688 item[i] = xstrdup(li[i]);
689 }
690
691 add_item2database(item);
692 item_free(&item);
693
694bail_out:
695 for(i=0; i < LDIF_ITEM_FIELDSLDIF_OBJECTCLASS; i++)
696 xfree(li[i])do { free(li[i]); li[i] = ((void*)0); } while(0);
697}
698
699static void
700ldif_convert(ldif_item item, char *type, char *value)
701{
702 /* this is the first (mandatory) attribute to expected
703 from a new valid LDIF record.
704 The previous record must be added to the database before
705 we can go further with the new one */
706 if(!strcmp(type, "dn")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(type) && __builtin_constant_p ("dn") && (__s1_len
= strlen (type), __s2_len = strlen ("dn"), (!((size_t)(const
void *)((type) + 1) - (size_t)(const void *)(type) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)(("dn") + 1) - (
size_t)(const void *)("dn") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(type, "dn") : (__builtin_constant_p (type) && ((size_t
)(const void *)((type) + 1) - (size_t)(const void *)(type) ==
1) && (__s1_len = strlen (type), __s1_len < 4) ? (
__builtin_constant_p ("dn") && ((size_t)(const void *
)(("dn") + 1) - (size_t)(const void *)("dn") == 1) ? __builtin_strcmp
(type, "dn") : (__extension__ ({ const unsigned char *__s2 =
(const unsigned char *) (const char *) ("dn"); int __result =
(((const unsigned char *) (const char *) (type))[0] - __s2[0
]); if (__s1_len > 0 && __result == 0) { __result =
(((const unsigned char *) (const char *) (type))[1] - __s2[1
]); if (__s1_len > 1 && __result == 0) { __result =
(((const unsigned char *) (const char *) (type))[2] - __s2[2
]); if (__s1_len > 2 && __result == 0) __result = (
((const unsigned char *) (const char *) (type))[3] - __s2[3])
; } } __result; }))) : (__builtin_constant_p ("dn") &&
((size_t)(const void *)(("dn") + 1) - (size_t)(const void *)
("dn") == 1) && (__s2_len = strlen ("dn"), __s2_len <
4) ? (__builtin_constant_p (type) && ((size_t)(const
void *)((type) + 1) - (size_t)(const void *)(type) == 1) ? __builtin_strcmp
(type, "dn") : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) (type); int __result
= (((const unsigned char *) (const char *) ("dn"))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("dn"))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("dn"))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) ("dn"))[3] - __s2[3
]); } } __result; })))) : __builtin_strcmp (type, "dn")))); }
)
) {
707 ldif_add_item(item);
708 return;
709 }
710
711 int i, index;
712
713 for( i=0; i < LDIF_IMPORTABLE_ITEM_FIELDS; i++ ) {
714
715 if( *value && // there's a value for the attr provided
716 ldif_conv_table[i].key && // there exists an ldif attr name...
717 !strcasecmp(ldif_conv_table[i].key, type)) { // ...matching that provided at input
718
719 assert((i >= 0) && (i < LDIF_ITEM_FIELDS))((void) (0));
720 // which abook field this attribute's name maps to ?
721 index = ldif_conv_table[i].index;
722 assert((index >= 0) && (index < LDIF_ITEM_FIELDS))((void) (0));
723
724 /* TODO: here must be handled multi-valued cases
725 (first or latest win, append or prepend values, ...)
726 Currently: emails are appended, for other fields the
727 first attribute found wins.
728 Eg: the value of "mobile" will be taken into
729 account if such a line comes before "cellphone". */
730
731 /* Remember: LDIF_ITEM_FIELDS > ITEM_FIELDS,
732 lower (common) indexes of *ldif_item map well to *list_item.
733 We can use item_fput()... */
734 if(index < ITEM_FIELDS) {
735 // multiple email support, but two only will stay
736 // in the final *list_item
737 if(index == EMAIL && item_fget(item, EMAIL)) {
738 item_fput(item,
739 EMAIL,
740 strconcat(item_fget(item, EMAIL), ",", value, 0));
741 }
742 else {
743 /* Don't override already initialized fields:
744 This is the rule of the "first win" */
745 if(! item_fget(item, index))
746 item_fput(item, index, xstrdup(value));
747 }
748 }
749
750 /* ... but if the ldif field's name index is higher
751 than what standards abook fields struct can hold,
752 these extra indexes must be managed manually.
753 This is the case of LDIF_OBJECTCLASS ("objectclass" attr) */
754 else {
755 item[index] = xstrdup(value);
756 }
757
758 // matching attr found and field filled:
759 // no further attr search is needed for `type`
760 break;
761 }
762 }
763}
764
765static int
766ldif_parse_file(FILE *handle)
767{
768 char *line = NULL((void*)0);
769 char *next_line = NULL((void*)0);
770 char *type, *value;
771 int vlen;
772
773 /* This is our extended fields holder to put the values from
774 successfully parsed LDIF attributes.
775 ldif_item item is temporary. When the end of an entry is reached,
776 values are copied into a regular *list_item struct, see ldif_add_item() */
777 ldif_item item;
778
779 memset(item, 0, sizeof(item));
780
781 do {
782 line = ldif_read_line(handle, &next_line);
783
784 // EOF or empty lines: continue;
785 if(!line || *line == '\0') continue;
786
787 if(-1 == (str_parse_line(line, &type, &value, &vlen))) {
788 xfree(line)do { free(line); line = ((void*)0); } while(0);
789 continue; /* just skip the errors */
790 }
791
792 ldif_convert(item, type, value);
793
794 xfree(line)do { free(line); line = ((void*)0); } while(0);
795 } while ( !feof(handle) );
796
797 // force registration (= ldif_add_item()) of the last LDIF entry
798 ldif_convert(item, "dn", "");
799
800 return 0;
801}
802
803/*
804 * end of ldif import
805 */
806
807/*
808 * mutt alias import filter
809 */
810
811#include "getname.h"
812
813static int
814mutt_read_line(FILE *in, char **groups, char **alias, char **rest)
815{
816 char *line, *ptr;
817 char *start, *end;
818 abook_list *glist = NULL((void*)0);
819
820 if( !(line = ptr = getaline(in)) )
821 return 1; /* error / EOF */
822
823 SKIPWS(ptr)while(*(ptr) && ((*__ctype_b_loc ())[(int) (((unsigned
char)*(ptr)))] & (unsigned short int) _ISspace)) ptr++
;
824
825 if(strncmp("alias", ptr, 5)(__extension__ (__builtin_constant_p (5) && ((__builtin_constant_p
("alias") && strlen ("alias") < ((size_t) (5))) ||
(__builtin_constant_p (ptr) && strlen (ptr) < ((size_t
) (5)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
("alias") && __builtin_constant_p (ptr) && (
__s1_len = strlen ("alias"), __s2_len = strlen (ptr), (!((size_t
)(const void *)(("alias") + 1) - (size_t)(const void *)("alias"
) == 1) || __s1_len >= 4) && (!((size_t)(const void
*)((ptr) + 1) - (size_t)(const void *)(ptr) == 1) || __s2_len
>= 4)) ? __builtin_strcmp ("alias", ptr) : (__builtin_constant_p
("alias") && ((size_t)(const void *)(("alias") + 1) -
(size_t)(const void *)("alias") == 1) && (__s1_len =
strlen ("alias"), __s1_len < 4) ? (__builtin_constant_p (
ptr) && ((size_t)(const void *)((ptr) + 1) - (size_t)
(const void *)(ptr) == 1) ? __builtin_strcmp ("alias", ptr) :
(__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (ptr); int __result = (((const unsigned
char *) (const char *) ("alias"))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("alias"))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("alias"))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) ("alias"))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p (ptr) && ((size_t)(const
void *)((ptr) + 1) - (size_t)(const void *)(ptr) == 1) &&
(__s2_len = strlen (ptr), __s2_len < 4) ? (__builtin_constant_p
("alias") && ((size_t)(const void *)(("alias") + 1) -
(size_t)(const void *)("alias") == 1) ? __builtin_strcmp ("alias"
, ptr) : (- (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) ("alias"); int __result = ((
(const unsigned char *) (const char *) (ptr))[0] - __s2[0]); if
(__s2_len > 0 && __result == 0) { __result = (((const
unsigned char *) (const char *) (ptr))[1] - __s2[1]); if (__s2_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (ptr))[2] - __s2[2]); if (__s2_len >
2 && __result == 0) __result = (((const unsigned char
*) (const char *) (ptr))[3] - __s2[3]); } } __result; })))) :
__builtin_strcmp ("alias", ptr)))); }) : strncmp ("alias", ptr
, 5)))
) {
826 free(line);
827 return 1;
828 }
829
830 ptr += 5;
831 SKIPWS(ptr)while(*(ptr) && ((*__ctype_b_loc ())[(int) (((unsigned
char)*(ptr)))] & (unsigned short int) _ISspace)) ptr++
;
832
833 /* If the group option is used, save the groups */
834 *groups = NULL((void*)0);
835 start = ptr;
836 int n_groups;
837 for(n_groups = 0; 0 == strncmp("-group", ptr, 6)(__extension__ (__builtin_constant_p (6) && ((__builtin_constant_p
("-group") && strlen ("-group") < ((size_t) (6)))
|| (__builtin_constant_p (ptr) && strlen (ptr) < (
(size_t) (6)))) ? __extension__ ({ size_t __s1_len, __s2_len;
(__builtin_constant_p ("-group") && __builtin_constant_p
(ptr) && (__s1_len = strlen ("-group"), __s2_len = strlen
(ptr), (!((size_t)(const void *)(("-group") + 1) - (size_t)(
const void *)("-group") == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((ptr) + 1) - (size_t)(const void *
)(ptr) == 1) || __s2_len >= 4)) ? __builtin_strcmp ("-group"
, ptr) : (__builtin_constant_p ("-group") && ((size_t
)(const void *)(("-group") + 1) - (size_t)(const void *)("-group"
) == 1) && (__s1_len = strlen ("-group"), __s1_len <
4) ? (__builtin_constant_p (ptr) && ((size_t)(const void
*)((ptr) + 1) - (size_t)(const void *)(ptr) == 1) ? __builtin_strcmp
("-group", ptr) : (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) (ptr); int __result
= (((const unsigned char *) (const char *) ("-group"))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("-group"))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("-group"))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) ("-group"))[3] - __s2
[3]); } } __result; }))) : (__builtin_constant_p (ptr) &&
((size_t)(const void *)((ptr) + 1) - (size_t)(const void *)(
ptr) == 1) && (__s2_len = strlen (ptr), __s2_len <
4) ? (__builtin_constant_p ("-group") && ((size_t)(const
void *)(("-group") + 1) - (size_t)(const void *)("-group") ==
1) ? __builtin_strcmp ("-group", ptr) : (- (__extension__ ({
const unsigned char *__s2 = (const unsigned char *) (const char
*) ("-group"); int __result = (((const unsigned char *) (const
char *) (ptr))[0] - __s2[0]); if (__s2_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (ptr))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (ptr))[2] - __s2[2]); if (__s2_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (ptr))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp
("-group", ptr)))); }) : strncmp ("-group", ptr, 6)))
; n_groups++) {
838 ptr += 6;
839 SKIPWS(ptr)while(*(ptr) && ((*__ctype_b_loc ())[(int) (((unsigned
char)*(ptr)))] & (unsigned short int) _ISspace)) ptr++
;
840 start = ptr;
841 SKIPNONWS(ptr)while(*(ptr) && ! ((*__ctype_b_loc ())[(int) (((unsigned
char)*(ptr)))] & (unsigned short int) _ISspace)) ptr++
;
842 end = ptr;
843 abook_list_append(&glist,xstrndup(start, end - start));
844 SKIPWS(ptr)while(*(ptr) && ((*__ctype_b_loc ())[(int) (((unsigned
char)*(ptr)))] & (unsigned short int) _ISspace)) ptr++
;
845 }
846
847 if(n_groups && groups)
848 *groups = abook_list_to_csv(glist);
849
850 abook_list_free(&glist);
851
852 /* alias */
853 start = ptr;
854 SKIPNONWS(ptr)while(*(ptr) && ! ((*__ctype_b_loc ())[(int) (((unsigned
char)*(ptr)))] & (unsigned short int) _ISspace)) ptr++
;
855 end = ptr;
856 SKIPWS(ptr)while(*(ptr) && ((*__ctype_b_loc ())[(int) (((unsigned
char)*(ptr)))] & (unsigned short int) _ISspace)) ptr++
;
857 if(alias)
858 *alias = xstrndup(start, end - start);
859
860 /* rest (email) */
861 *rest = xstrdup(ptr);
862
863 xfree(line)do { free(line); line = ((void*)0); } while(0);
864 return 0;
865}
866
867static void
868mutt_fix_quoting(char *p)
869{
870 char *escape = 0;
871
872 for(; *p; p++) {
873 switch(*p) {
874 case '\"':
875 if(escape)
876 *escape = ' ';
877 break;
878 case '\\':
879 escape = p;
880 break;
881 default:
882 escape = 0;
883 }
884 }
885}
886
887static void
888mutt_parse_email(list_item item)
889{
890 char *line = item_fget(item, NAME);
891 char *tmp;
892 char *name, *email;
893#if 0
894 char *start = line;
895 int i = 0;
896#endif
897
898 mutt_fix_quoting(line);
899 tmp = strconcat("From: ", line, NULL((void*)0));
900 getname(tmp, &name, &email);
901 free(tmp);
902
903 if(name)
904 item_fput(item, NAME, name);
905 else
906 return;
907
908 if(email)
909 item_fput(item, EMAIL, email);
910 else
911 return;
912
913 /*
914 * this is completely broken
915 */
916#if 0
917 while( (start = strchr(start, ',')(__extension__ (__builtin_constant_p (',') && !__builtin_constant_p
(start) && (',') == '\0' ? (char *) __rawmemchr (start
, ',') : __builtin_strchr (start, ',')))
) && i++ < MAX_EMAILS - 1) {
918 tmp = strconcat("From: ", ++start, NULL((void*)0));
919 getname(tmp, &name, &email);
920 free(tmp);
921 free(name);
922 if(email) {
923 if(*email) {
924 tmp = strconcat(item[EMAIL], ",", email, NULL((void*)0));
925 free(item[EMAIL]);
926 item[EMAIL] = tmp;
927 } else {
928 xfree(email)do { free(email); email = ((void*)0); } while(0);
929 }
930 }
931 }
932#endif
933}
934
935static int
936mutt_parse_file(FILE *in)
937{
938 list_item item = item_create();
939
940 for(;;) {
941 memset(item, 0, fields_count * sizeof(char *));
942
943 if(!mutt_read_line(in,
944 (field_id(GROUPS) != -1) ? &item[field_id(GROUPS)] : NULL((void*)0),
945 (field_id(NICK) != -1) ? &item[field_id(NICK)] : NULL((void*)0),
946 &item[field_id(NAME)]) )
947 mutt_parse_email(item);
948
949 if(feof(in)) {
950 item_empty(item);
951 break;
952 }
953
954 add_item2database(item);
955 }
956 item_free(&item);
957
958 return 0;
959}
960
961/*
962 * end of mutt alias import filter
963 */
964
965
966/*
967 * ldif export filter
968 */
969
970static void
971ldif_fput_type_and_value(FILE *out,char *type, char *value )
972{
973 char *tmp;
974
975 tmp = ldif_type_and_value(type, value, strlen(value));
976
977 fputs(tmp, out);
978
979 free(tmp);
980}
981
982static int
983ldif_export_database(FILE *out, struct db_enumerator e)
984{
985 char email[MAX_EMAILSTR_LEN(9 * (80 + 1) + 1)];
986 abook_list *emails, *em;
987
988 fprintf(out, "version: 1\n");
989
990 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
991 char *tmp;
992 int j;
993 get_first_email(email, e.item);
994
995 if(*email)
996 tmp = strdup_printf("cn=%s,mail=%s",db_name_get(e.item)real_db_field_get(e.item, NAME, 1),email);
997 /* TODO: this may not be enough for a trully "Distinguished" name
998 needed by LDAP. Appending a random uuid could do the trick */
999 else
1000 tmp = strdup_printf("cn=%s",db_name_get(e.item)real_db_field_get(e.item, NAME, 1));
1001
1002 ldif_fput_type_and_value(out, "dn", tmp);
1003 free(tmp);
1004
1005 for(j = 0; j < ITEM_FIELDS; j++) {
1006 if(j == EMAIL) {
1007 if(*email) {
1008 tmp = db_email_get(e.item);
1009 emails = csv_to_abook_list(tmp);
1010 free(tmp);
1011 for(em = emails; em; em = em->next)
1012 ldif_fput_type_and_value(out,
1013 ldif_field_names[EMAIL],
1014 em->data);
1015 }
1016 }
1017 else if(db_fget(e.item,j)real_db_field_get(e.item, j, 1)) {
1018 ldif_fput_type_and_value(out,
1019 ldif_field_names[j],
1020 db_fget(e.item, j)real_db_field_get(e.item, j, 1));
1021 }
1022 }
1023
1024 fprintf(out, "objectclass: top\n"
1025 "objectclass: person\n\n");
1026 }
1027
1028 return 0;
1029}
1030
1031/*
1032 * end of ldif export filter
1033 */
1034
1035/*
1036 * html export filter
1037 */
1038
1039static void html_export_write_head(FILE *out);
1040static void html_export_write_tail(FILE *out);
1041
1042extern struct index_elem *index_elements;
1043
1044static void
1045html_print_emails(FILE *out, struct list_field *f)
1046{
1047 abook_list *l = csv_to_abook_list(f->data);
1048
1049 for(; l; l = l->next) {
1050 fprintf(out, "<a href=\"mailto:%s\">%s</a>", l->data, l->data);
1051 if(l->next)
1052 fprintf(out, ", ");
1053 }
1054
1055 abook_list_free(&l);
1056}
1057
1058static int
1059html_export_database(FILE *out, struct db_enumerator e)
1060{
1061 struct list_field f;
1062 struct index_elem *cur;
1063
1064 if(list_is_empty())
1065 return 2;
1066
1067 init_index();
1068
1069 html_export_write_head(out);
1070
1071 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
1072 fprintf(out, " <tr>\n");
1073 for(cur = index_elements; cur; cur = cur->next) {
1074 if(cur->type != INDEX_FIELD2)
1075 continue;
1076
1077 get_list_field(e.item, cur, &f);
1078
1079 fprintf(out, " <td>");
1080
1081 if(f.type == FIELD_EMAILS) {
1082 html_print_emails(out, &f);
1083 } else {
1084 if (strcmp(safe_str(f.data), "")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(((f.data == ((void*)0)) ? "" : f.data)) && __builtin_constant_p
("") && (__s1_len = strlen (((f.data == ((void*)0)) ?
"" : f.data)), __s2_len = strlen (""), (!((size_t)(const void
*)((((f.data == ((void*)0)) ? "" : f.data)) + 1) - (size_t)(
const void *)(((f.data == ((void*)0)) ? "" : f.data)) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)(("") +
1) - (size_t)(const void *)("") == 1) || __s2_len >= 4)) ?
__builtin_strcmp (((f.data == ((void*)0)) ? "" : f.data), ""
) : (__builtin_constant_p (((f.data == ((void*)0)) ? "" : f.data
)) && ((size_t)(const void *)((((f.data == ((void*)0)
) ? "" : f.data)) + 1) - (size_t)(const void *)(((f.data == (
(void*)0)) ? "" : f.data)) == 1) && (__s1_len = strlen
(((f.data == ((void*)0)) ? "" : f.data)), __s1_len < 4) ?
(__builtin_constant_p ("") && ((size_t)(const void *
)(("") + 1) - (size_t)(const void *)("") == 1) ? __builtin_strcmp
(((f.data == ((void*)0)) ? "" : f.data), "") : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (""); int __result = (((const unsigned char *) (const
char *) (((f.data == ((void*)0)) ? "" : f.data)))[0] - __s2[
0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (((f.data == ((void
*)0)) ? "" : f.data)))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (((f.data == ((void*)0)) ? "" : f.data)))[2] - __s2[
2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (((f.data == ((void
*)0)) ? "" : f.data)))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("") && ((size_t)(const void *)(("") + 1) - (size_t)
(const void *)("") == 1) && (__s2_len = strlen (""), __s2_len
< 4) ? (__builtin_constant_p (((f.data == ((void*)0)) ? ""
: f.data)) && ((size_t)(const void *)((((f.data == (
(void*)0)) ? "" : f.data)) + 1) - (size_t)(const void *)(((f.
data == ((void*)0)) ? "" : f.data)) == 1) ? __builtin_strcmp (
((f.data == ((void*)0)) ? "" : f.data), "") : (- (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (((f.data == ((void*)0)) ? "" : f.data)); int __result
= (((const unsigned char *) (const char *) (""))[0] - __s2[0
]); if (__s2_len > 0 && __result == 0) { __result =
(((const unsigned char *) (const char *) (""))[1] - __s2[1])
; if (__s2_len > 1 && __result == 0) { __result = (
((const unsigned char *) (const char *) (""))[2] - __s2[2]); if
(__s2_len > 2 && __result == 0) __result = (((const
unsigned char *) (const char *) (""))[3] - __s2[3]); } } __result
; })))) : __builtin_strcmp (((f.data == ((void*)0)) ? "" : f.
data), "")))); })
== 0)
1085 fprintf(out, "&nbsp;");
1086 else
1087 fprintf(out, "%s", safe_str(f.data)((f.data == ((void*)0)) ? "" : f.data));
1088 }
1089 fprintf(out, "</td>\n");
1090 }
1091 fprintf(out, " </tr>\n");
1092 }
1093
1094 html_export_write_tail(out);
1095
1096 return 0;
1097}
1098
1099static void
1100html_export_write_head(FILE *out)
1101{
1102 char *realname = get_real_name(), *str;
1103 struct index_elem *cur;
1104
1105 fprintf(out, "<!DOCTYPE html>\n");
1106 fprintf(out, "<html>\n");
1107 fprintf(out, "<head>\n");
1108 fprintf(out, " <meta charset=\"utf-8\" />\n");
1109 fprintf(out, " <title>");
1110 fprintf(out, _("%s's addressbook")((const char *) ("%s's addressbook")), realname );
1111 fprintf(out, "</title>\n");
1112 fprintf(out, " <style type=\"text/css\">\n");
1113 fprintf(out, " table {border-collapse: collapse ; border: 1px solid #000;}\n");
1114 fprintf(out, " table th, table td {text-align: left; border: 1px solid #000; padding: 0.33em;}\n");
1115 fprintf(out, " table th {border-bottom: 3px double #000; background-color: #ccc;}\n");
1116 fprintf(out, " </style>\n");
1117 fprintf(out, "</head>\n");
1118 fprintf(out, "<body>\n");
1119 fprintf(out, "<h1>");
1120 fprintf(out, _("%s's addressbook")((const char *) ("%s's addressbook")), realname);
1121 fprintf(out, "</h1>\n");
1122
1123 fprintf(out, "<table>\n");
1124 fprintf(out, "<thead>\n");
1125 fprintf(out, " <tr>\n");
1126 for(cur = index_elements; cur; cur = cur->next) {
1127 if(cur->type != INDEX_FIELD2)
1128 continue;
1129
1130 get_field_info(cur->d.field.id, NULL((void*)0), &str, NULL((void*)0));
1131
1132 fprintf(out, " <th>");
1133
1134 if (strcmp(str, "")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(str) && __builtin_constant_p ("") && (__s1_len
= strlen (str), __s2_len = strlen (""), (!((size_t)(const void
*)((str) + 1) - (size_t)(const void *)(str) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)(("") + 1) - (size_t
)(const void *)("") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(str, "") : (__builtin_constant_p (str) && ((size_t)
(const void *)((str) + 1) - (size_t)(const void *)(str) == 1)
&& (__s1_len = strlen (str), __s1_len < 4) ? (__builtin_constant_p
("") && ((size_t)(const void *)(("") + 1) - (size_t)
(const void *)("") == 1) ? __builtin_strcmp (str, "") : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (""); int __result = (((const unsigned char *) (const
char *) (str))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (str))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (str))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (str))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("") && ((size_t)(const void *)(("") + 1) - (size_t)
(const void *)("") == 1) && (__s2_len = strlen (""), __s2_len
< 4) ? (__builtin_constant_p (str) && ((size_t)(const
void *)((str) + 1) - (size_t)(const void *)(str) == 1) ? __builtin_strcmp
(str, "") : (- (__extension__ ({ const unsigned char *__s2 =
(const unsigned char *) (const char *) (str); int __result =
(((const unsigned char *) (const char *) (""))[0] - __s2[0])
; if (__s2_len > 0 && __result == 0) { __result = (
((const unsigned char *) (const char *) (""))[1] - __s2[1]); if
(__s2_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) (""))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (""))[3] - __s2[3]); } } __result; })
))) : __builtin_strcmp (str, "")))); })
== 0)
1135 fprintf(out, "&nbsp;");
1136 else
1137 fprintf(out, "%s", str);
1138
1139 fprintf(out, "</th>\n");
1140 }
1141 fprintf(out, " </tr>\n");
1142 fprintf(out, "<thead>\n");
1143 fprintf(out, "<tbody>\n");
1144
1145 free(realname);
1146}
1147
1148static void
1149html_export_write_tail(FILE *out)
1150{
1151 fprintf(out, "</table>\n");
1152 fprintf(out, "</body>\n");
1153 fprintf(out, "</html>");
1154}
1155
1156/*
1157 * end of html export filter
1158 */
1159
1160
1161/*
1162 * pine addressbook import filter
1163 */
1164
1165#define PINE_BUF_SIZE2048 2048
1166
1167static void
1168pine_fixbuf(char *buf)
1169{
1170 int i,j;
1171
1172 for(i = 0,j = 0; j < (int)strlen(buf); i++, j++)
1173 buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
1174}
1175
1176static void
1177pine_convert_emails(char *s)
1178{
1179 int i;
1180 char *tmp;
1181
1182 if(s == NULL((void*)0) || *s != '(')
1183 return;
1184
1185 for(i = 0; s[i]; i++)
1186 s[i] = s[i + 1];
1187
1188 if( ( tmp = strchr(s,')')(__extension__ (__builtin_constant_p (')') && !__builtin_constant_p
(s) && (')') == '\0' ? (char *) __rawmemchr (s, ')')
: __builtin_strchr (s, ')')))
) )
1189 *tmp = '\0';
1190
1191 for(i = 1; ( tmp = strchr(s, ',')(__extension__ (__builtin_constant_p (',') && !__builtin_constant_p
(s) && (',') == '\0' ? (char *) __rawmemchr (s, ',')
: __builtin_strchr (s, ',')))
) != NULL((void*)0) ; i++, s = tmp + 1)
1192 if(i > MAX_LIST_ITEMS9 - 1) {
1193 *tmp = '\0';
1194 break;
1195 }
1196
1197}
1198
1199static void
1200pine_parse_buf(char *buf)
1201{
1202 list_item item;
1203 char *start = buf;
1204 char *end;
1205 char tmp[PINE_BUF_SIZE2048];
1206 int i, len, last;
1207 int pine_conv_table[]= {NICK, NAME, EMAIL, -1, NOTES};
1208
1209 item = item_create();
1210
1211 for(i=0, last=0; !last ; i++) {
1212 if( !(end = strchr(start, '\t')(__extension__ (__builtin_constant_p ('\t') && !__builtin_constant_p
(start) && ('\t') == '\0' ? (char *) __rawmemchr (start
, '\t') : __builtin_strchr (start, '\t')))
) )
1213 last=1;
1214
1215 len = last ? strlen(start) : (int) (end-start);
1216 len = min(len, PINE_BUF_SIZE - 1)(((len)<(2048 - 1)) ? (len):(2048 - 1));
1217
1218 if(i < (int)(sizeof(pine_conv_table) / sizeof(*pine_conv_table))
1219 && pine_conv_table[i] >= 0) {
1220 strncpy(tmp, start, len)__builtin_strncpy (tmp, start, len);
1221 tmp[len] = 0;
1222 if(*tmp)
1223 item_fput(item, pine_conv_table[i],
1224 xstrdup(tmp));
1225 }
1226 start = end + 1;
1227 }
1228
1229 pine_convert_emails(item_fget(item, EMAIL));
1230 add_item2database(item);
1231 item_free(&item);
1232}
1233
1234
1235#define LINESIZE1024 1024
1236
1237static int
1238pine_parse_file(FILE *in)
1239{
1240 char line[LINESIZE1024];
1241 char *buf = NULL((void*)0);
1242 char *ptr;
1243 int i;
1244
1245 fgets(line, LINESIZE1024, in);
1246
1247 while(!feof(in)) {
1248 for(i = 2;;i++) {
1249 buf = xrealloc_xmalloc_xrealloc(buf, i*LINESIZE1024);
1250 if(i == 2)
1251 strcpy(buf, line);
1252 fgets(line, LINESIZE1024, in);
1253 ptr=(char *)&line;
1254 if(*ptr != ' ' || feof(in))
1255 break;
1256 else
1257 while(*ptr == ' ')
1258 ptr++;
1259
1260 strcat(buf, ptr);
1261 }
1262 if(*buf == '#') {
1263 xfree(buf)do { free(buf); buf = ((void*)0); } while(0);
1264 continue;
1265 }
1266 pine_fixbuf(buf);
1267
1268 pine_parse_buf(buf);
1269
1270 xfree(buf)do { free(buf); buf = ((void*)0); } while(0);
1271 }
1272
1273 return 0;
1274}
1275
1276/*
1277 * end of pine addressbook import filter
1278 */
1279
1280
1281/*
1282 * pine addressbook export filter
1283 *
1284 * filter doesn't wrap the lines as it should but Pine seems to handle
1285 * created files without problems - JH
1286 */
1287
1288static int
1289pine_export_database(FILE *out, struct db_enumerator e)
1290{
1291 char *emails;
1292
1293 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
1294 emails = db_email_get(e.item);
1295 fprintf(out, strchr(emails, ',')(__extension__ (__builtin_constant_p (',') && !__builtin_constant_p
(emails) && (',') == '\0' ? (char *) __rawmemchr (emails
, ',') : __builtin_strchr (emails, ',')))
/* multiple addresses? */ ?
1296 "%s\t%s\t(%s)\t\t%s\n" : "%s\t%s\t%s\t\t%s\n",
1297 safe_str(db_fget(e.item, NICK))((real_db_field_get(e.item, NICK, 1) == ((void*)0)) ? "" : real_db_field_get
(e.item, NICK, 1))
,
1298 safe_str(db_name_get(e.item))((real_db_field_get(e.item, NAME, 1) == ((void*)0)) ? "" : real_db_field_get
(e.item, NAME, 1))
,
1299 emails,
1300 safe_str(db_fget(e.item, NOTES))((real_db_field_get(e.item, NOTES, 1) == ((void*)0)) ? "" : real_db_field_get
(e.item, NOTES, 1))
1301 );
1302 free(emails);
1303 }
1304
1305 return 0;
1306}
1307
1308/*
1309 * end of pine addressbook export filter
1310 */
1311
1312
1313/*
1314 * csv import filter
1315 */
1316
1317/* This is used by both allcsv_export_database() and csv_export_common()
1318 to distinguish between standard and defined fields.
1319 To avoid confusions this should stay > ITEM_FIELDS */
1320#define CUSTOM_FIELD_START_INDEX(ITEM_FIELDS + 10) (ITEM_FIELDS + 10)
1321
1322/* FIXME
1323 * these files should be parsed according to a certain
1324 * lay out, or the default if layout is not given, at
1325 * the moment only default is done...
1326 */
1327
1328#define CSV_COMMENT_CHAR'#' '#'
1329#define CSV_DUPLICATE_SEPARATOR" " " "
1330#define CSV_TABLE_SIZE(t)(sizeof (t) / sizeof *(t)) (sizeof (t) / sizeof *(t))
1331
1332static int csv_conv_table[] = {
1333 NAME,
1334 EMAIL,
1335 PHONE,
1336 NOTES,
1337 NICK
1338};
1339
1340static int allcsv_conv_table[] = {
1341 NAME,
1342 EMAIL,
1343 ADDRESS,
1344 ADDRESS2,
1345 CITY,
1346 STATE,
1347 ZIP,
1348 COUNTRY,
1349 PHONE,
1350 WORKPHONE,
1351 FAX,
1352 MOBILEPHONE,
1353 NICK,
1354 URL,
1355 NOTES,
1356 ANNIVERSARY
1357};
1358
1359static int palmcsv_conv_table[] = {
1360 NAME, /* Last name */
1361 NAME, /* First name */
1362 NOTES, /* Title */
1363 NICK, /* Company */
1364 WORKPHONE,
1365 PHONE,
1366 FAX,
1367 MOBILEPHONE,
1368 EMAIL,
1369 ADDRESS,
1370 CITY,
1371 STATE,
1372 ZIP,
1373 COUNTRY,
1374 ANNIVERSARY,
1375};
1376
1377static void
1378csv_convert_emails(char *s)
1379{
1380 int i;
1381 char *tmp;
1382
1383 if(s == NULL((void*)0))
1384 return;
1385
1386 for(i = 1; ( tmp = strchr(s, ',')(__extension__ (__builtin_constant_p (',') && !__builtin_constant_p
(s) && (',') == '\0' ? (char *) __rawmemchr (s, ',')
: __builtin_strchr (s, ',')))
) != NULL((void*)0) ; i++, s = tmp + 1)
1387 if(i > MAX_LIST_ITEMS9 - 1) {
1388 *tmp = 0;
1389 break;
1390 }
1391
1392}
1393
1394static char *
1395csv_remove_quotes(char *s)
1396{
1397 char *copy, *trimmed;
1398 int len;
1399
1400 copy = trimmed = xstrdup(s);
1401 strtrim(trimmed);
1402
1403 len = strlen(trimmed);
1404 if(trimmed[len - 1] == '\"' && *trimmed == '\"') {
1405 if(len < 3) {
1406 xfree(copy)do { free(copy); copy = ((void*)0); } while(0);
1407 return NULL((void*)0);
1408 }
1409 trimmed[len - 1] = 0;
1410 trimmed++;
1411 trimmed = xstrdup(trimmed);
1412 free(copy);
1413 return trimmed;
1414 }
1415
1416 xfree(copy)do { free(copy); copy = ((void*)0); } while(0);
1417 return xstrdup(s);
1418}
1419
1420static int
1421csv_field_to_item(int *table_base, size_t table_size, int field)
1422{
1423 if(field < table_size)
1424 return field_id(table_base[field]);
1425
1426 return -1;
1427}
1428
1429static void
1430csv_store_item(list_item item, int i, char *s)
1431{
1432 char *newstr = NULL((void*)0);
1433
1434 if(!s || !*s)
1435 return;
1436
1437 if( !(newstr = csv_remove_quotes(s)) )
1438 return;
1439
1440 if(i >= 0) {
1441 if (item[i] != NULL((void*)0)) {
1442 char *oldstr = item[i];
1443
1444 item[i] = strconcat(newstr, CSV_DUPLICATE_SEPARATOR" ",
1445 oldstr, NULL((void*)0));
1446 xfree(newstr)do { free(newstr); newstr = ((void*)0); } while(0);
1447 xfree(oldstr)do { free(oldstr); oldstr = ((void*)0); } while(0);
1448 } else {
1449 item[i] = newstr;
1450 }
1451 } else {
1452 xfree(newstr)do { free(newstr); newstr = ((void*)0); } while(0);
1453 }
1454}
1455
1456static int
1457csv_is_valid_quote_end(char *p)
1458{
1459 if(*p != '\"')
1460 return FALSE0;
1461
1462 for(p++; *p; p++) {
1463 if(*p == ',')
1464 return TRUE1;
1465 else if(!ISSPACE(*p)((*__ctype_b_loc ())[(int) (((unsigned char)*p))] & (unsigned
short int) _ISspace)
)
1466 return FALSE0;
1467 }
1468
1469 return TRUE1;
1470}
1471
1472static int
1473csv_is_valid_quote_start(char *p)
1474{
1475 for(; *p; p++) {
1476 if(*p == '\"')
1477 return TRUE1;
1478 else if(!ISSPACE(*p)((*__ctype_b_loc ())[(int) (((unsigned char)*p))] & (unsigned
short int) _ISspace)
)
1479 return FALSE0;
1480 }
1481
1482 return FALSE0;
1483}
1484
1485static void
1486csv_parse_line(char *line, int *table_base, size_t table_size)
1487{
1488 char *p, *start;
1489 int field;
1490 bool_Bool in_quote = FALSE0;
1491 list_item item;
1492
1493 item = item_create();
1494
1495 for(p = start = line, field = 0; *p; p++) {
1496 if(in_quote) {
1497 if(csv_is_valid_quote_end(p))
1498 in_quote = FALSE0;
1499 } else {
1500 if ( (((p - start) / sizeof (char)) < 2 ) &&
1501 csv_is_valid_quote_start(p) )
1502 in_quote = TRUE1;
1503 }
1504
1505 if(*p == ',' && !in_quote) {
1506 *p = 0;
1507 csv_store_item(item,
1508 csv_field_to_item(table_base,table_size,field),
1509 start);
1510 field++;
1511 start = p + 1;
1512 }
1513 }
1514 /*
1515 * store last field
1516 */
1517 csv_store_item(item, csv_field_to_item(table_base, table_size, field),
1518 start);
1519
1520 csv_convert_emails(item_fget(item, EMAIL));
1521 add_item2database(item);
1522 item_free(&item);
1523}
1524
1525static int
1526csv_parse_file_common(FILE *in, int *conv_table, size_t table_size)
1527{
1528 char *line = NULL((void*)0);
1529
1530 while(!feof(in)) {
1531 line = getaline(in);
1532
1533 if(line && *line && *line != CSV_COMMENT_CHAR'#')
1534 csv_parse_line(line, conv_table, table_size);
1535
1536 xfree(line)do { free(line); line = ((void*)0); } while(0);
1537 }
1538
1539 return 0;
1540}
1541
1542static int
1543csv_parse_file(FILE *in)
1544{
1545 return csv_parse_file_common(in, csv_conv_table,
1546 CSV_TABLE_SIZE(csv_conv_table)(sizeof (csv_conv_table) / sizeof *(csv_conv_table)));
1547}
1548
1549static int
1550allcsv_parse_file(FILE *in)
1551{
1552 return csv_parse_file_common(in, allcsv_conv_table,
1553 CSV_TABLE_SIZE(allcsv_conv_table)(sizeof (allcsv_conv_table) / sizeof *(allcsv_conv_table)));
1554}
1555
1556static int
1557palmcsv_parse_file(FILE *in)
1558{
1559 return csv_parse_file_common(in, palmcsv_conv_table,
1560 CSV_TABLE_SIZE(palmcsv_conv_table)(sizeof (palmcsv_conv_table) / sizeof *(palmcsv_conv_table)));
1561}
1562
1563/*
1564 * end of csv import filter
1565 */
1566
1567/*
1568 * vCard import filter
1569 */
1570
1571static char *vcard_fields[] = {
1572 "FN", /* FORMATTED NAME */
1573 "EMAIL", /* EMAIL */
1574 "ADR", /* ADDRESS */
1575 "ADR", /* ADDRESS2 */
1576 "ADR", /* CITY */
1577 "ADR", /* STATE */
1578 "ADR", /* ZIP */
1579 "ADR", /* COUNTRY */
1580 "TEL", /* PHONE */
1581 "TEL", /* WORKPHONE */
1582 "TEL", /* FAX */
1583 "TEL", /* MOBILEPHONE */
1584 "NICKNAME", /* NICK */
1585 "URL", /* URL */
1586 "NOTE", /* NOTES */
1587 "BDAY", /* ANNIVERSARY */
1588 "N", /* NAME: special case/mapping in vcard_parse_line() */
1589 NULL((void*)0) /* ITEM_FIELDS */
1590};
1591
1592enum {
1593 VCARD_KEY = 0,
1594 VCARD_KEY_ATTRIBUTE,
1595 VCARD_VALUE,
1596};
1597
1598static char *
1599vcard_get_line_element(char *line, int element)
1600{
1601 int i;
1602 char *line_copy = 0;
1603 char *result = 0;
1604 char *key = 0;
1605 char *key_attr = 0;
1606 char *value = 0;
1607
1608 line_copy = xstrdup(line);
1609
1610 /* change newline characters, if present, to end of string */
1611 for(i=0; line_copy[i]; i++) {
1612 if(line_copy[i] == '\r' || line_copy[i] == '\n') {
1613 line_copy[i] = '\0';
1614 break;
1615 }
1616 }
1617
1618 /* separate key from value */
1619 for(i=0; line_copy[i]; i++) {
1620 if(line_copy[i] == ':') {
1621 line_copy[i] = '\0';
1622 key = line_copy;
1623 value = &line_copy[i+1];
1624 break;
1625 }
1626 }
1627
1628 /* separate key from key attributes */
1629 /* works for vCard 2 as well (automagically) */
1630 if (key) {
1631 for(i=0; key[i]; i++) {
1632 if(key[i] == ';') {
1633 key[i] = '\0';
1634 key_attr = &key[i+1];
1635 break;
1636 }
1637 }
1638 }
1639
1640 switch(element) {
1641 case VCARD_KEY:
1642 if(key)
1643 result = xstrdup(key);
1644 break;
1645 case VCARD_KEY_ATTRIBUTE:
1646 if(key_attr)
1647 result = xstrdup(key_attr);
1648 break;
1649 case VCARD_VALUE:
1650 if(value)
1651 result = xstrdup(value);
1652 break;
1653 }
1654
1655 xfree(line_copy)do { free(line_copy); line_copy = ((void*)0); } while(0);
1656 return result;
1657}
1658
1659static void
1660vcard_parse_email(list_item item, char *line)
1661{
1662 char *email;
1663
1664 email = vcard_get_line_element(line, VCARD_VALUE);
1665
1666 if(item[1]) {
1667 item[1] = strconcat(item[1], ",", email, 0);
1668 xfree(email)do { free(email); email = ((void*)0); } while(0);
1669 }
1670 else {
1671 item[1] = email;
1672 }
1673}
1674
1675
1676/*
1677 * mappings between vCard ADR field and abook's ADDRESS
1678 * see rfc2426 section 3.2.1
1679 */
1680static void
1681vcard_parse_address(list_item item, char *line)
1682{
1683 char *value;
1684
1685 value = vcard_get_line_element(line, VCARD_VALUE);
1686 if(!value)
1687 return;
1688
1689 // vCard(post office box) - not used
1690 strsep(&value, ";")__extension__ ({ char __r0, __r1, __r2; (__builtin_constant_p
(";") && ((size_t)(const void *)((";") + 1) - (size_t
)(const void *)(";") == 1) && (__r0 = ((const char *)
(";"))[0], ((const char *) (";"))[0] != '\0') ? ((__r1 = ((const
char *) (";"))[1], ((const char *) (";"))[1] == '\0') ? __strsep_1c
(&value, __r0) : ((__r2 = ((const char *) (";"))[2], __r2
== '\0') ? __strsep_2c (&value, __r0, __r1) : (((const char
*) (";"))[3] == '\0' ? __strsep_3c (&value, __r0, __r1, __r2
) : __strsep_g (&value, ";")))) : __strsep_g (&value,
";")); })
;
1691 if(!value) return;
1692
1693 // vCard(the extended address)
1694 item_fput(item, ADDRESS2, xstrdup(strsep(&value, ";")__extension__ ({ char __r0, __r1, __r2; (__builtin_constant_p
(";") && ((size_t)(const void *)((";") + 1) - (size_t
)(const void *)(";") == 1) && (__r0 = ((const char *)
(";"))[0], ((const char *) (";"))[0] != '\0') ? ((__r1 = ((const
char *) (";"))[1], ((const char *) (";"))[1] == '\0') ? __strsep_1c
(&value, __r0) : ((__r2 = ((const char *) (";"))[2], __r2
== '\0') ? __strsep_2c (&value, __r0, __r1) : (((const char
*) (";"))[3] == '\0' ? __strsep_3c (&value, __r0, __r1, __r2
) : __strsep_g (&value, ";")))) : __strsep_g (&value,
";")); })
));
1695 if(!value) return;
1696
1697 // vCard(the street address)
1698 item_fput(item, ADDRESS, xstrdup(strsep(&value, ";")__extension__ ({ char __r0, __r1, __r2; (__builtin_constant_p
(";") && ((size_t)(const void *)((";") + 1) - (size_t
)(const void *)(";") == 1) && (__r0 = ((const char *)
(";"))[0], ((const char *) (";"))[0] != '\0') ? ((__r1 = ((const
char *) (";"))[1], ((const char *) (";"))[1] == '\0') ? __strsep_1c
(&value, __r0) : ((__r2 = ((const char *) (";"))[2], __r2
== '\0') ? __strsep_2c (&value, __r0, __r1) : (((const char
*) (";"))[3] == '\0' ? __strsep_3c (&value, __r0, __r1, __r2
) : __strsep_g (&value, ";")))) : __strsep_g (&value,
";")); })
));
1699 if(!value) return;
1700
1701 // vCard(the locality)
1702 item_fput(item, CITY, xstrdup(strsep(&value, ";")__extension__ ({ char __r0, __r1, __r2; (__builtin_constant_p
(";") && ((size_t)(const void *)((";") + 1) - (size_t
)(const void *)(";") == 1) && (__r0 = ((const char *)
(";"))[0], ((const char *) (";"))[0] != '\0') ? ((__r1 = ((const
char *) (";"))[1], ((const char *) (";"))[1] == '\0') ? __strsep_1c
(&value, __r0) : ((__r2 = ((const char *) (";"))[2], __r2
== '\0') ? __strsep_2c (&value, __r0, __r1) : (((const char
*) (";"))[3] == '\0' ? __strsep_3c (&value, __r0, __r1, __r2
) : __strsep_g (&value, ";")))) : __strsep_g (&value,
";")); })
));
1703 if(!value) return;
1704
1705 // vCard(the region)
1706 item_fput(item, STATE, xstrdup(strsep(&value, ";")__extension__ ({ char __r0, __r1, __r2; (__builtin_constant_p
(";") && ((size_t)(const void *)((";") + 1) - (size_t
)(const void *)(";") == 1) && (__r0 = ((const char *)
(";"))[0], ((const char *) (";"))[0] != '\0') ? ((__r1 = ((const
char *) (";"))[1], ((const char *) (";"))[1] == '\0') ? __strsep_1c
(&value, __r0) : ((__r2 = ((const char *) (";"))[2], __r2
== '\0') ? __strsep_2c (&value, __r0, __r1) : (((const char
*) (";"))[3] == '\0' ? __strsep_3c (&value, __r0, __r1, __r2
) : __strsep_g (&value, ";")))) : __strsep_g (&value,
";")); })
));
1707 if(!value) return;
1708
1709 // vCard(the postal code)
1710 item_fput(item, ZIP, xstrdup(strsep(&value, ";")__extension__ ({ char __r0, __r1, __r2; (__builtin_constant_p
(";") && ((size_t)(const void *)((";") + 1) - (size_t
)(const void *)(";") == 1) && (__r0 = ((const char *)
(";"))[0], ((const char *) (";"))[0] != '\0') ? ((__r1 = ((const
char *) (";"))[1], ((const char *) (";"))[1] == '\0') ? __strsep_1c
(&value, __r0) : ((__r2 = ((const char *) (";"))[2], __r2
== '\0') ? __strsep_2c (&value, __r0, __r1) : (((const char
*) (";"))[3] == '\0' ? __strsep_3c (&value, __r0, __r1, __r2
) : __strsep_g (&value, ";")))) : __strsep_g (&value,
";")); })
));
1711 if(!value) return;
1712
1713 // vCard(the country name)
1714 item_fput(item, COUNTRY, xstrdup(strsep(&value, ";")__extension__ ({ char __r0, __r1, __r2; (__builtin_constant_p
(";") && ((size_t)(const void *)((";") + 1) - (size_t
)(const void *)(";") == 1) && (__r0 = ((const char *)
(";"))[0], ((const char *) (";"))[0] != '\0') ? ((__r1 = ((const
char *) (";"))[1], ((const char *) (";"))[1] == '\0') ? __strsep_1c
(&value, __r0) : ((__r2 = ((const char *) (";"))[2], __r2
== '\0') ? __strsep_2c (&value, __r0, __r1) : (((const char
*) (";"))[3] == '\0' ? __strsep_3c (&value, __r0, __r1, __r2
) : __strsep_g (&value, ";")))) : __strsep_g (&value,
";")); })
));
1715
1716 // support of optional trailing ";" to the ADR field
1717 if(value && *value) xfree(value)do { free(value); value = ((void*)0); } while(0);
1718}
1719
1720static void
1721vcard_parse_name(list_item item, char *line)
1722{
1723 // store the "N" field into "NAME" *if* no "FN:"
1724 // value has already been stored here
1725 if(item[0]) return;
1726
1727 int i = -1;
1728 item[0] = vcard_get_line_element(line, VCARD_VALUE);
1729 // "N:" can be multivalued => replace ';' separators by ' '
1730 while(item[0][++i]) if(item[0][i] == ';') item[0][i] = ' ';
1731
1732 // http://www.daniweb.com/software-development/c/code/216919
1733 char *original = item[0], *p = original;
1734 int trimmed = 0;
1735 do {
1736 if (*original != ' ' || trimmed) {
1737 trimmed = 1; *p++ = *original;
1738 }
1739 } while(*original++);
1740}
1741
1742static void
1743vcard_parse_phone(list_item item, char *line)
1744{
1745 char *type = vcard_get_line_element(line, VCARD_KEY_ATTRIBUTE);
1746 char *value = vcard_get_line_element(line, VCARD_VALUE);
1747
1748 /* set the standard number */
1749 if (!type) item_fput(item, PHONE, value);
1750
1751 /*
1752 * see rfc2426 section 3.3.1
1753 * Note: we probably support both vCard 2 and 3
1754 */
1755 else {
1756 if (strcasestr(type, "home") != NULL((void*)0))
1757 item_fput(item, PHONE, xstrdup(value));
1758 else if (strcasestr(type, "work") != NULL((void*)0))
1759 item_fput(item, WORKPHONE, xstrdup(value));
1760 else if (strcasestr(type, "fax") != NULL((void*)0))
1761 item_fput(item, FAX, xstrdup(value));
1762 else if (strcasestr(type, "cell") != NULL((void*)0))
1763 item_fput(item, MOBILEPHONE, xstrdup(value));
1764
1765 xfree(type)do { free(type); type = ((void*)0); } while(0);
1766 xfree(value)do { free(value); value = ((void*)0); } while(0);
1767 }
1768}
1769
1770static void
1771vcard_parse_line(list_item item, char *line)
1772{
1773 int i;
1774 char *key;
1775
1776 for(i=0; vcard_fields[i]; i++) {
1777 key = vcard_fields[i];
1778
1779 if(0 == strncmp(key, line, strlen(key))(__extension__ (__builtin_constant_p (strlen(key)) &&
((__builtin_constant_p (key) && strlen (key) < ((
size_t) (strlen(key)))) || (__builtin_constant_p (line) &&
strlen (line) < ((size_t) (strlen(key))))) ? __extension__
({ size_t __s1_len, __s2_len; (__builtin_constant_p (key) &&
__builtin_constant_p (line) && (__s1_len = strlen (key
), __s2_len = strlen (line), (!((size_t)(const void *)((key) +
1) - (size_t)(const void *)(key) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((line) + 1) - (size_t)(const void *
)(line) == 1) || __s2_len >= 4)) ? __builtin_strcmp (key, line
) : (__builtin_constant_p (key) && ((size_t)(const void
*)((key) + 1) - (size_t)(const void *)(key) == 1) &&
(__s1_len = strlen (key), __s1_len < 4) ? (__builtin_constant_p
(line) && ((size_t)(const void *)((line) + 1) - (size_t
)(const void *)(line) == 1) ? __builtin_strcmp (key, line) : (
__extension__ ({ const unsigned char *__s2 = (const unsigned char
*) (const char *) (line); int __result = (((const unsigned char
*) (const char *) (key))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (key))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (key))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (key))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(line) && ((size_t)(const void *)((line) + 1) - (size_t
)(const void *)(line) == 1) && (__s2_len = strlen (line
), __s2_len < 4) ? (__builtin_constant_p (key) && (
(size_t)(const void *)((key) + 1) - (size_t)(const void *)(key
) == 1) ? __builtin_strcmp (key, line) : (- (__extension__ ({
const unsigned char *__s2 = (const unsigned char *) (const char
*) (key); int __result = (((const unsigned char *) (const char
*) (line))[0] - __s2[0]); if (__s2_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
line))[1] - __s2[1]); if (__s2_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
line))[2] - __s2[2]); if (__s2_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (line
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (key
, line)))); }) : strncmp (key, line, strlen(key))))
) {
1780 if(0 == strcmp(key, "EMAIL")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(key) && __builtin_constant_p ("EMAIL") && (
__s1_len = strlen (key), __s2_len = strlen ("EMAIL"), (!((size_t
)(const void *)((key) + 1) - (size_t)(const void *)(key) == 1
) || __s1_len >= 4) && (!((size_t)(const void *)((
"EMAIL") + 1) - (size_t)(const void *)("EMAIL") == 1) || __s2_len
>= 4)) ? __builtin_strcmp (key, "EMAIL") : (__builtin_constant_p
(key) && ((size_t)(const void *)((key) + 1) - (size_t
)(const void *)(key) == 1) && (__s1_len = strlen (key
), __s1_len < 4) ? (__builtin_constant_p ("EMAIL") &&
((size_t)(const void *)(("EMAIL") + 1) - (size_t)(const void
*)("EMAIL") == 1) ? __builtin_strcmp (key, "EMAIL") : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) ("EMAIL"); int __result = (((const unsigned char *) (
const char *) (key))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (key))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (key))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (key))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("EMAIL") && ((size_t)(const void *)(("EMAIL") + 1) -
(size_t)(const void *)("EMAIL") == 1) && (__s2_len =
strlen ("EMAIL"), __s2_len < 4) ? (__builtin_constant_p (
key) && ((size_t)(const void *)((key) + 1) - (size_t)
(const void *)(key) == 1) ? __builtin_strcmp (key, "EMAIL") :
(- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (key); int __result = (((const unsigned
char *) (const char *) ("EMAIL"))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("EMAIL"))[1] - __s2[1]); if (__s2_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("EMAIL"))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) ("EMAIL"))[3] - __s2[3]); } } __result
; })))) : __builtin_strcmp (key, "EMAIL")))); })
)
1781 vcard_parse_email(item, line);
1782 else if(i == 2)
1783 vcard_parse_address(item, line);
1784 else if(0 == strcmp(key, "TEL")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(key) && __builtin_constant_p ("TEL") && (__s1_len
= strlen (key), __s2_len = strlen ("TEL"), (!((size_t)(const
void *)((key) + 1) - (size_t)(const void *)(key) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)(("TEL") + 1) -
(size_t)(const void *)("TEL") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(key, "TEL") : (__builtin_constant_p (key) && ((size_t
)(const void *)((key) + 1) - (size_t)(const void *)(key) == 1
) && (__s1_len = strlen (key), __s1_len < 4) ? (__builtin_constant_p
("TEL") && ((size_t)(const void *)(("TEL") + 1) - (size_t
)(const void *)("TEL") == 1) ? __builtin_strcmp (key, "TEL") :
(__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("TEL"); int __result = (((const unsigned
char *) (const char *) (key))[0] - __s2[0]); if (__s1_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) (key))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (key))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (key))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("TEL") && ((size_t)(const void *)(("TEL") + 1) - (size_t
)(const void *)("TEL") == 1) && (__s2_len = strlen ("TEL"
), __s2_len < 4) ? (__builtin_constant_p (key) && (
(size_t)(const void *)((key) + 1) - (size_t)(const void *)(key
) == 1) ? __builtin_strcmp (key, "TEL") : (- (__extension__ (
{ const unsigned char *__s2 = (const unsigned char *) (const char
*) (key); int __result = (((const unsigned char *) (const char
*) ("TEL"))[0] - __s2[0]); if (__s2_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
"TEL"))[1] - __s2[1]); if (__s2_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
"TEL"))[2] - __s2[2]); if (__s2_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) ("TEL"
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (key
, "TEL")))); })
)
1785 vcard_parse_phone(item, line);
1786 else if(0 == strcmp(key, "N")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(key) && __builtin_constant_p ("N") && (__s1_len
= strlen (key), __s2_len = strlen ("N"), (!((size_t)(const void
*)((key) + 1) - (size_t)(const void *)(key) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)(("N") + 1) - (
size_t)(const void *)("N") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(key, "N") : (__builtin_constant_p (key) && ((size_t
)(const void *)((key) + 1) - (size_t)(const void *)(key) == 1
) && (__s1_len = strlen (key), __s1_len < 4) ? (__builtin_constant_p
("N") && ((size_t)(const void *)(("N") + 1) - (size_t
)(const void *)("N") == 1) ? __builtin_strcmp (key, "N") : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) ("N"); int __result = (((const unsigned char *) (const
char *) (key))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (key))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (key))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (key))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("N") && ((size_t)(const void *)(("N") + 1) - (size_t
)(const void *)("N") == 1) && (__s2_len = strlen ("N"
), __s2_len < 4) ? (__builtin_constant_p (key) && (
(size_t)(const void *)((key) + 1) - (size_t)(const void *)(key
) == 1) ? __builtin_strcmp (key, "N") : (- (__extension__ ({ const
unsigned char *__s2 = (const unsigned char *) (const char *)
(key); int __result = (((const unsigned char *) (const char *
) ("N"))[0] - __s2[0]); if (__s2_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
"N"))[1] - __s2[1]); if (__s2_len > 1 && __result ==
0) { __result = (((const unsigned char *) (const char *) ("N"
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) ("N"))[
3] - __s2[3]); } } __result; })))) : __builtin_strcmp (key, "N"
)))); })
)
1787 vcard_parse_name(item, line);
1788 else
1789 item[i] = vcard_get_line_element(line, VCARD_VALUE);
1790 return;
1791 }
1792 }
1793}
1794
1795static void
1796vcard_parse_item(FILE *in)
1797{
1798 char *line = NULL((void*)0);
1799 list_item item = item_create();
1800
1801 while(!feof(in)) {
1802 line = getaline(in);
1803
1804 if(line && !strncmp("END:VCARD", line, 9)(__extension__ (__builtin_constant_p (9) && ((__builtin_constant_p
("END:VCARD") && strlen ("END:VCARD") < ((size_t)
(9))) || (__builtin_constant_p (line) && strlen (line
) < ((size_t) (9)))) ? __extension__ ({ size_t __s1_len, __s2_len
; (__builtin_constant_p ("END:VCARD") && __builtin_constant_p
(line) && (__s1_len = strlen ("END:VCARD"), __s2_len
= strlen (line), (!((size_t)(const void *)(("END:VCARD") + 1
) - (size_t)(const void *)("END:VCARD") == 1) || __s1_len >=
4) && (!((size_t)(const void *)((line) + 1) - (size_t
)(const void *)(line) == 1) || __s2_len >= 4)) ? __builtin_strcmp
("END:VCARD", line) : (__builtin_constant_p ("END:VCARD") &&
((size_t)(const void *)(("END:VCARD") + 1) - (size_t)(const void
*)("END:VCARD") == 1) && (__s1_len = strlen ("END:VCARD"
), __s1_len < 4) ? (__builtin_constant_p (line) &&
((size_t)(const void *)((line) + 1) - (size_t)(const void *)
(line) == 1) ? __builtin_strcmp ("END:VCARD", line) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (line); int __result = (((const unsigned char *) (const
char *) ("END:VCARD"))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("END:VCARD"))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("END:VCARD"))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ("END:VCARD"))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(line) && ((size_t)(const void *)((line) + 1) - (size_t
)(const void *)(line) == 1) && (__s2_len = strlen (line
), __s2_len < 4) ? (__builtin_constant_p ("END:VCARD") &&
((size_t)(const void *)(("END:VCARD") + 1) - (size_t)(const void
*)("END:VCARD") == 1) ? __builtin_strcmp ("END:VCARD", line)
: (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("END:VCARD"); int __result = (((const
unsigned char *) (const char *) (line))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (line))[1] - __s2[1]); if (__s2_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) (line))[2] - __s2[2]); if (__s2_len > 2
&& __result == 0) __result = (((const unsigned char *
) (const char *) (line))[3] - __s2[3]); } } __result; })))) :
__builtin_strcmp ("END:VCARD", line)))); }) : strncmp ("END:VCARD"
, line, 9)))
) {
1805 xfree(line)do { free(line); line = ((void*)0); } while(0);
1806 break;
1807 }
1808 else if(line) {
1809 vcard_parse_line(item, line);
1810 xfree(line)do { free(line); line = ((void*)0); } while(0);
1811 }
1812 }
1813
1814 add_item2database(item);
1815 item_free(&item);
1816}
1817
1818static int
1819vcard_parse_file(FILE *in)
1820{
1821 char *line = NULL((void*)0);
1822
1823 while(!feof(in)) {
1824 line = getaline(in);
1825
1826 if(line && !strncmp("BEGIN:VCARD", line, 11)(__extension__ (__builtin_constant_p (11) && ((__builtin_constant_p
("BEGIN:VCARD") && strlen ("BEGIN:VCARD") < ((size_t
) (11))) || (__builtin_constant_p (line) && strlen (line
) < ((size_t) (11)))) ? __extension__ ({ size_t __s1_len, __s2_len
; (__builtin_constant_p ("BEGIN:VCARD") && __builtin_constant_p
(line) && (__s1_len = strlen ("BEGIN:VCARD"), __s2_len
= strlen (line), (!((size_t)(const void *)(("BEGIN:VCARD") +
1) - (size_t)(const void *)("BEGIN:VCARD") == 1) || __s1_len
>= 4) && (!((size_t)(const void *)((line) + 1) - (
size_t)(const void *)(line) == 1) || __s2_len >= 4)) ? __builtin_strcmp
("BEGIN:VCARD", line) : (__builtin_constant_p ("BEGIN:VCARD"
) && ((size_t)(const void *)(("BEGIN:VCARD") + 1) - (
size_t)(const void *)("BEGIN:VCARD") == 1) && (__s1_len
= strlen ("BEGIN:VCARD"), __s1_len < 4) ? (__builtin_constant_p
(line) && ((size_t)(const void *)((line) + 1) - (size_t
)(const void *)(line) == 1) ? __builtin_strcmp ("BEGIN:VCARD"
, line) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) (line); int __result = (((const
unsigned char *) (const char *) ("BEGIN:VCARD"))[0] - __s2[0
]); if (__s1_len > 0 && __result == 0) { __result =
(((const unsigned char *) (const char *) ("BEGIN:VCARD"))[1]
- __s2[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("BEGIN:VCARD"))[
2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ("BEGIN:VCARD"))[
3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (line
) && ((size_t)(const void *)((line) + 1) - (size_t)(const
void *)(line) == 1) && (__s2_len = strlen (line), __s2_len
< 4) ? (__builtin_constant_p ("BEGIN:VCARD") && (
(size_t)(const void *)(("BEGIN:VCARD") + 1) - (size_t)(const void
*)("BEGIN:VCARD") == 1) ? __builtin_strcmp ("BEGIN:VCARD", line
) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("BEGIN:VCARD"); int __result = (((const
unsigned char *) (const char *) (line))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (line))[1] - __s2[1]); if (__s2_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) (line))[2] - __s2[2]); if (__s2_len > 2
&& __result == 0) __result = (((const unsigned char *
) (const char *) (line))[3] - __s2[3]); } } __result; })))) :
__builtin_strcmp ("BEGIN:VCARD", line)))); }) : strncmp ("BEGIN:VCARD"
, line, 11)))
) {
1827 xfree(line)do { free(line); line = ((void*)0); } while(0);
1828 vcard_parse_item(in);
1829 }
1830 else if(line) {
1831 xfree(line)do { free(line); line = ((void*)0); } while(0);
1832 }
1833 }
1834
1835 return 0;
1836}
1837
1838/*
1839 * end of vCard import filter
1840 */
1841
1842/*
1843 * csv addressbook export filters
1844 */
1845
1846#define CSV_LAST(-1) (-1)
1847#define CSV_UNDEFINED(-2) (-2)
1848#define CSV_SPECIAL(X)(-3 - (X)) (-3 - (X))
1849#define CSV_IS_SPECIAL(X)((X) <= -3) ((X) <= -3)
1850
1851static int
1852csv_export_common(FILE *out, struct db_enumerator e,
1853 int fields[], void (*special_func)(FILE *, int, int))
1854{
1855 int i;
1856
1857 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
1858 for(i = 0; fields[i] != CSV_LAST(-1); i++) {
1859 if(fields[i] == CSV_UNDEFINED(-2))
1860 fprintf(out, "\"\"");
1861 else if(CSV_IS_SPECIAL(fields[i])((fields[i]) <= -3)) {
1862 if(special_func)
1863 (*special_func)(out, e.item, fields[i]);
1864 }
1865 else if(fields[i] >= CUSTOM_FIELD_START_INDEX(ITEM_FIELDS + 10)) {
1866 fprintf(out, "\"%s\"",
1867 safe_str(db_fget_byid(e.item, fields[i] - CUSTOM_FIELD_START_INDEX))((real_db_field_get(e.item, fields[i] - (ITEM_FIELDS + 10), 0
) == ((void*)0)) ? "" : real_db_field_get(e.item, fields[i] -
(ITEM_FIELDS + 10), 0))
);
1868 }
1869 else
1870 /*fprintf(out,(
1871 strchr(safe_str(database[e.item][field_idx(fields[i])]), ',') ||
1872 strchr(safe_str(database[e.item][field_idx(fields[i])]), '\"')) ?
1873 "\"%s\"" : "%s",
1874 safe_str(database[e.item][field_idx(fields[i])])
1875 );*/
1876 fprintf(out, "\"%s\"",
1877 safe_str(db_fget(e.item,fields[i]))((real_db_field_get(e.item, fields[i], 1) == ((void*)0)) ? ""
: real_db_field_get(e.item, fields[i], 1))
);
1878
1879 if(fields[i + 1] != CSV_LAST(-1))
1880 fputc(',', out);
1881 }
1882 fputc('\n', out);
1883 }
1884
1885 return 0;
1886}
1887
1888static int
1889csv_export_database(FILE *out, struct db_enumerator e)
1890{
1891 int csv_export_fields[] = {
1892 NAME,
1893 EMAIL,
1894 PHONE,
1895 NOTES,
1896 NICK,
1897 CSV_LAST(-1)
1898 };
1899
1900 csv_export_common(out, e, csv_export_fields, NULL((void*)0));
1901
1902 return 0;
1903}
1904
1905static int
1906allcsv_export_database(FILE *out, struct db_enumerator e)
1907{
1908 /*
1909 * TODO: Should get these atomatically from abook_fileds
1910 * - JH
1911 */
1912 int allcsv_export_fields[ITEM_FIELDS + 6] = { // only the 5 custom fields are allowed so far
1913 NAME,
1914 EMAIL,
1915 ADDRESS,
1916 ADDRESS2,
1917 CITY,
1918 STATE,
1919 ZIP,
1920 COUNTRY,
1921 PHONE,
1922 WORKPHONE,
1923 FAX,
1924 MOBILEPHONE, // spelt "mobile" in standard_fields
1925 NICK,
1926 URL,
1927 NOTES,
1928 ANNIVERSARY,
1929 GROUPS,
1930 CSV_LAST(-1)
1931 };
1932
1933 fprintf(out, "#");
1934 int i = 0;
1935 while(allcsv_export_fields[i+1] != CSV_LAST(-1)) {
1936 fprintf(out, "\"%s\",", standard_fields[i++].key);
1937 }
1938 fprintf(out, "\"%s\"", standard_fields[i].key);
1939
1940 /*
1941 Custom fields handling:
1942 This loop appends custom fields' id at the end of allcsv_export_fields and shift
1943 the CSV_LAST sentinel value each time one is found.
1944 CUSTOM_FIELD_START_INDEX is added to these index values so csv_export_common()
1945 can later recognize them and call db_fget_byid() instead of the traditional db_fget()
1946
1947 It only search for defined the [legacy?] "custom" fields.
1948 */
1949
1950 // pointer to the end of the field list
1951 int append_field = ITEM_FIELDS;
1952 // custom field's trailing number (between 1 and 5)
1953 int j;
1954 // full custom field name, eg "custom4"
1955 char custom_field_key[8];
1956 // index used by custom_field_key
1957 int field_no;
1958 // name of the defined field <field_no> as chosen by the user
1959 char *custom_field_name;
1960
1961 for (j = 1; j <= 5; j++) {
1962 snprintf(custom_field_key, 8, "custom%d", j++);
1963 if(find_declared_field(custom_field_key)real_find_field(custom_field_key, ((void*)0), ((void*)0))) {
1964 find_field_number(custom_field_key, &field_no)real_find_field(custom_field_key, ((void*)0), &field_no);
1965 get_field_info(field_no, NULL((void*)0), &custom_field_name, NULL((void*)0));
1966 // append the field to the list
1967 allcsv_export_fields[append_field] = field_no + CUSTOM_FIELD_START_INDEX(ITEM_FIELDS + 10);
1968 allcsv_export_fields[++append_field] = CSV_LAST(-1);
1969 // print column name
1970 fprintf(out, ",\"%s\"", custom_field_name);
1971 }
1972 }
1973 free(custom_field_name);
1974 fprintf(out, "\n");
1975
1976 csv_export_common(out, e, allcsv_export_fields, NULL((void*)0));
1977
1978 return 0;
1979}
1980
1981/*
1982 * palm csv
1983 */
1984
1985#define PALM_CSV_NAME(-3 - (0)) CSV_SPECIAL(0)(-3 - (0))
1986#define PALM_CSV_END(-3 - (1)) CSV_SPECIAL(1)(-3 - (1))
1987#define PALM_CSV_CAT(-3 - (2)) CSV_SPECIAL(2)(-3 - (2))
1988
1989static void
1990palm_split_and_write_name(FILE *out, char *name)
1991{
1992 char *p;
1993
1994 assert(name)((void) (0));
1995
1996 if ( (p = strchr(name, ' ')(__extension__ (__builtin_constant_p (' ') && !__builtin_constant_p
(name) && (' ') == '\0' ? (char *) __rawmemchr (name
, ' ') : __builtin_strchr (name, ' ')))
) ) {
1997 /*
1998 * last name first
1999 */
2000 fprintf(out, "\"%s\",\"" , p + 1);
2001 fwrite((void *)name, p - name, sizeof(char), out);
2002 fputc('\"', out);
2003 } else {
2004 fprintf(out, "\"%s\"", safe_str(name)((name == ((void*)0)) ? "" : name));
2005 }
2006}
2007
2008static void
2009palm_csv_handle_specials(FILE *out, int item, int field)
2010{
2011 switch(field) {
2012 case PALM_CSV_NAME(-3 - (0)):
2013 palm_split_and_write_name(out, db_name_get(item)real_db_field_get(item, NAME, 1));
2014 break;
2015 case PALM_CSV_CAT(-3 - (2)):
2016 fprintf(out, "\"abook\"");
2017 break;
2018 case PALM_CSV_END(-3 - (1)):
2019 fprintf(out, "\"0\"");
2020 break;
2021 default:
2022 assert(0)((void) (0));
2023 }
2024}
2025
2026static int
2027palm_export_database(FILE *out, struct db_enumerator e)
2028{
2029 int palm_export_fields[] = {
2030 PALM_CSV_NAME(-3 - (0)), /* LASTNAME, FIRSTNAME */
2031 CSV_UNDEFINED(-2), /* TITLE */
2032 CSV_UNDEFINED(-2), /* COMPANY */
2033 WORKPHONE, /* WORK PHONE */
2034 PHONE, /* HOME PHONE */
2035 FAX, /* FAX */
2036 MOBILEPHONE, /* OTHER */
2037 EMAIL, /* EMAIL */
2038 ADDRESS, /* ADDRESS */
2039 CITY, /* CITY */
2040 STATE, /* STATE */
2041 ZIP, /* ZIP */
2042 COUNTRY, /* COUNTRY */
2043 NICK, /* DEFINED 1 */
2044 URL, /* DEFINED 2 */
2045 CSV_UNDEFINED(-2), /* DEFINED 3 */
2046 CSV_UNDEFINED(-2), /* DEFINED 4 */
2047 NOTES, /* NOTE */
2048 PALM_CSV_END(-3 - (1)), /* "0" */
2049 PALM_CSV_CAT(-3 - (2)), /* CATEGORY */
2050 CSV_LAST(-1)
2051 };
2052
2053 csv_export_common(out, e, palm_export_fields, palm_csv_handle_specials);
2054
2055 return 0;
2056}
2057
2058/*
2059 * end of csv export filters
2060 */
2061
2062/*
2063 * vCard 2 addressbook export filter
2064 */
2065
2066static int
2067vcard_export_database(FILE *out, struct db_enumerator e)
2068{
2069 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e)))
2070 vcard_export_item(out, e.item);
2071 return 0;
2072}
2073
2074void
2075vcard_export_item(FILE *out, int item)
2076{
2077 int j, email_no;
2078 char *name, *tmp;
2079 abook_list *emails, *em;
2080 fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n",
2081 safe_str(db_name_get(item))((real_db_field_get(item, NAME, 1) == ((void*)0)) ? "" : real_db_field_get
(item, NAME, 1))
);
2082
2083 name = get_surname(db_name_get(item)real_db_field_get(item, NAME, 1));
2084 for( j = strlen(db_name_get(item)real_db_field_get(item, NAME, 1)) - 1; j >= 0; j-- ) {
2085 if((db_name_get(item)real_db_field_get(item, NAME, 1))[j] == ' ')
2086 break;
2087 }
2088 fprintf(out, "N:%s;%.*s\r\n",
2089 safe_str(name)((name == ((void*)0)) ? "" : name),
2090 j,
2091 safe_str(db_name_get(item))((real_db_field_get(item, NAME, 1) == ((void*)0)) ? "" : real_db_field_get
(item, NAME, 1))
2092 );
2093
2094 free(name);
2095
2096 if(db_fget(item, NICK)real_db_field_get(item, NICK, 1))
2097 fprintf(out, "NICKNAME:%s\r\n",
2098 safe_str(db_fget(item, NICK))((real_db_field_get(item, NICK, 1) == ((void*)0)) ? "" : real_db_field_get
(item, NICK, 1))
);
2099 if(db_fget(item, ANNIVERSARY)real_db_field_get(item, ANNIVERSARY, 1))
2100 fprintf(out, "BDAY:%s\r\n",
2101 safe_str(db_fget(item, ANNIVERSARY))((real_db_field_get(item, ANNIVERSARY, 1) == ((void*)0)) ? ""
: real_db_field_get(item, ANNIVERSARY, 1))
);
2102
2103 // see rfc6350 section 6.3.1
2104 if(db_fget(item, ADDRESS)real_db_field_get(item, ADDRESS, 1)) {
2105 fprintf(out, "ADR:;%s;%s;%s;%s;%s;%s\r\n",
2106 // pobox (unsupported)
2107 safe_str(db_fget(item, ADDRESS2))((real_db_field_get(item, ADDRESS2, 1) == ((void*)0)) ? "" : real_db_field_get
(item, ADDRESS2, 1))
, // ext (n°, ...)
2108 safe_str(db_fget(item, ADDRESS))((real_db_field_get(item, ADDRESS, 1) == ((void*)0)) ? "" : real_db_field_get
(item, ADDRESS, 1))
, // street
2109 safe_str(db_fget(item, CITY))((real_db_field_get(item, CITY, 1) == ((void*)0)) ? "" : real_db_field_get
(item, CITY, 1))
, // locality
2110 safe_str(db_fget(item, STATE))((real_db_field_get(item, STATE, 1) == ((void*)0)) ? "" : real_db_field_get
(item, STATE, 1))
, // region
2111 safe_str(db_fget(item, ZIP))((real_db_field_get(item, ZIP, 1) == ((void*)0)) ? "" : real_db_field_get
(item, ZIP, 1))
, // code (postal)
2112 safe_str(db_fget(item, COUNTRY))((real_db_field_get(item, COUNTRY, 1) == ((void*)0)) ? "" : real_db_field_get
(item, COUNTRY, 1))
// country
2113 );
2114 }
2115
2116 if(db_fget(item, PHONE)real_db_field_get(item, PHONE, 1))
2117 fprintf(out, "TEL;HOME:%s\r\n",
2118 db_fget(item, PHONE)real_db_field_get(item, PHONE, 1));
2119 if(db_fget(item, WORKPHONE)real_db_field_get(item, WORKPHONE, 1))
2120 fprintf(out, "TEL;WORK:%s\r\n",
2121 db_fget(item, WORKPHONE)real_db_field_get(item, WORKPHONE, 1));
2122 if(db_fget(item, FAX)real_db_field_get(item, FAX, 1))
2123 fprintf(out, "TEL;FAX:%s\r\n",
2124 db_fget(item, FAX)real_db_field_get(item, FAX, 1));
2125 if(db_fget(item, MOBILEPHONE)real_db_field_get(item, MOBILEPHONE, 1))
2126 fprintf(out, "TEL;CELL:%s\r\n",
2127 db_fget(item, MOBILEPHONE)real_db_field_get(item, MOBILEPHONE, 1));
2128
2129 tmp = db_email_get(item);
2130 if(*tmp) {
2131 emails = csv_to_abook_list(tmp);
2132 fprintf(out, "EMAIL;PREF;INTERNET:%s\r\n", emails->data);
2133 email_no = 1;
2134 for(em = emails->next; em; em = em->next, email_no++ )
2135 fprintf(out, "EMAIL;%d;INTERNET:%s\r\n", email_no, em->data);
2136
2137 abook_list_free(&emails);
2138 }
2139 free(tmp);
2140
2141 if(db_fget(item, NOTES)real_db_field_get(item, NOTES, 1))
2142 fprintf(out, "NOTE:%s\r\n",
2143 db_fget(item, NOTES)real_db_field_get(item, NOTES, 1));
2144 if(db_fget(item, URL)real_db_field_get(item, URL, 1))
2145 fprintf(out, "URL:%s\r\n",
2146 db_fget(item, URL)real_db_field_get(item, URL, 1));
2147
2148 fprintf(out, "END:VCARD\r\n\r\n");
2149
2150}
2151
2152/*
2153 * end of vCard export filter
2154 */
2155
2156
2157/*
2158 * mutt alias export filter
2159 */
2160
2161static char *
2162mutt_alias_genalias(int i)
2163{
2164 char *tmp, *pos;
2165
2166 if(db_fget(i, NICK)real_db_field_get(i, NICK, 1))
2167 return xstrdup(db_fget(i, NICK)real_db_field_get(i, NICK, 1));
2168
2169 tmp = xstrdup(db_name_get(i)real_db_field_get(i, NAME, 1));
2170
2171 if( ( pos = strchr(tmp, ' ')(__extension__ (__builtin_constant_p (' ') && !__builtin_constant_p
(tmp) && (' ') == '\0' ? (char *) __rawmemchr (tmp, ' '
) : __builtin_strchr (tmp, ' ')))
) )
2172 *pos = 0;
2173
2174 strlower(tmp);
2175
2176 return tmp;
2177}
2178
2179/*
2180 * This function is a variant of abook_list_to_csv
2181 * */
2182static char *
2183mutt_alias_gengroups(int i)
2184{
2185 char *groups, *res = NULL((void*)0);
2186 char groupstr[7] = "-group ";
2187 abook_list *list, *tmp;
2188
2189 groups = db_fget(i, GROUPS)real_db_field_get(i, GROUPS, 1);
2190
2191 if(!groups)
2192 return NULL((void*)0);
2193
2194 list = csv_to_abook_list(groups);
2195 for(tmp = list; tmp; tmp = tmp->next) {
2196 if(tmp == list) {
2197 res = xmalloc_xmalloc_xmalloc(strlen(groupstr)+strlen(tmp->data)+1);
2198 res = strcpy(res, groupstr);
2199 } else {
2200 res = xrealloc_xmalloc_xrealloc(res, strlen(res)+1+strlen(groupstr)+strlen(tmp->data)+1);
2201 strcat(res, " ");
2202 strcat(res, groupstr);
2203 }
2204 strcat(res, tmp->data);
2205 }
2206 abook_list_free(&list);
2207 xfree(groups)do { free(groups); groups = ((void*)0); } while(0);
2208
2209 return res;
2210}
2211
2212static int
2213mutt_alias_export(FILE *out, struct db_enumerator e)
2214{
2215 char email[MAX_EMAIL_LEN80];
2216 char *alias = NULL((void*)0);
2217 char *groups = NULL((void*)0);
2218 int email_addresses;
2219 char *ptr;
2220
2221 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
2222 alias = (field_id(NICK) != -1) ? mutt_alias_genalias(e.item) : NULL((void*)0);
2223 groups = (field_id(GROUPS) != -1) ? mutt_alias_gengroups(e.item) : NULL((void*)0);
2224 get_first_email(email, e.item);
2225
2226 /* do not output contacts without email address */
2227 /* cause this does not make sense in mutt aliases */
2228 if (*email) {
2229
2230 /* output first email address */
2231 fprintf(out,"alias ");
2232 if(groups)
2233 fprintf(out, "%s ", groups);
2234 if(alias)
2235 fprintf(out, "%s ", alias);
2236 fprintf(out, "%s <%s>\n",
2237 db_name_get(e.item)real_db_field_get(e.item, NAME, 1),
2238 email);
2239
2240 /* number of email addresses */
2241 email_addresses = 1;
2242 ptr = db_email_get(e.item);
2243 while (*ptr != '\0') {
2244 if (*ptr == ',') {
2245 email_addresses++;
2246 }
2247 ptr++;
2248 }
2249
2250 /* output other email addresses */
2251 while (email_addresses-- > 1) {
2252 roll_emails(e.item, ROTATE_RIGHT);
2253 get_first_email(email, e.item);
2254 fprintf(out,"alias ");
2255 if( groups )
2256 fprintf(out, "%s ", groups);
2257 if(alias)
2258 fprintf(out, "%s__%s ", alias, email);
2259 else
2260 fprintf(out, "%s__%s ", db_name_get(e.item)real_db_field_get(e.item, NAME, 1), email);
2261 fprintf(out, "%s <%s>\n",
2262 db_name_get(e.item)real_db_field_get(e.item, NAME, 1),
2263 email);
2264 }
2265 roll_emails(e.item, ROTATE_RIGHT);
2266 xfree(alias)do { free(alias); alias = ((void*)0); } while(0);
2267 xfree(groups)do { free(groups); groups = ((void*)0); } while(0);
2268 }
2269 }
2270
2271 return 0;
2272}
2273
2274void muttq_print_item(FILE *file, int item)
2275{
2276 abook_list *emails, *e;
2277 char *tmp = db_email_get(item);
2278
2279 emails = csv_to_abook_list(tmp);
2280 free(tmp);
2281
2282 for(e = emails; e; e = e->next) {
2283 fprintf(file, "%s\t%s\t%s\n", e->data, db_name_get(item)real_db_field_get(item, NAME, 1),
2284 !db_fget(item, NOTES)real_db_field_get(item, NOTES, 1) ?" " :db_fget(item, NOTES)real_db_field_get(item, NOTES, 1)
2285 );
2286 if(!opt_get_bool(BOOL_MUTT_RETURN_ALL_EMAILS))
2287 break;
2288 }
2289 abook_list_free(&emails);
2290}
2291
2292static int
2293mutt_query_export_database(FILE *out, struct db_enumerator e)
2294{
2295 fprintf(out, "All items\n");
2296 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e)))
2297 muttq_print_item(out, e.item);
2298 return 0;
2299}
2300
2301/*
2302 * end of mutt alias export filter
2303 */
2304
2305
2306/*
2307 * printable export filter
2308 */
2309
2310
2311static void
2312text_write_address_us(FILE *out, int i) {
2313 fprintf(out, "\n%s", db_fget(i, ADDRESS)real_db_field_get(i, ADDRESS, 1));
2314
2315 if(db_fget(i, ADDRESS2)real_db_field_get(i, ADDRESS2, 1))
2316 fprintf(out, "\n%s", db_fget(i, ADDRESS2)real_db_field_get(i, ADDRESS2, 1));
2317
2318 if(db_fget(i, CITY)real_db_field_get(i, CITY, 1))
2319 fprintf(out, "\n%s", db_fget(i, CITY)real_db_field_get(i, CITY, 1));
2320
2321 if(db_fget(i, STATE)real_db_field_get(i, STATE, 1) || db_fget(i, ZIP)real_db_field_get(i, ZIP, 1)) {
2322 fputc('\n', out);
2323
2324 if(db_fget(i, STATE)real_db_field_get(i, STATE, 1)) {
2325 fprintf(out, "%s", db_fget(i, STATE)real_db_field_get(i, STATE, 1));
2326 if(db_fget(i, ZIP)real_db_field_get(i, ZIP, 1))
2327 fputc(' ', out);
2328 }
2329
2330 if(db_fget(i, ZIP)real_db_field_get(i, ZIP, 1))
2331 fprintf(out, "%s", db_fget(i, ZIP)real_db_field_get(i, ZIP, 1));
2332 }
2333
2334 if(db_fget(i, COUNTRY)real_db_field_get(i, COUNTRY, 1))
2335 fprintf(out, "\n%s", db_fget(i, COUNTRY)real_db_field_get(i, COUNTRY, 1));
2336}
2337
2338
2339static void
2340text_write_address_uk(FILE *out, int i) {
2341 int j;
2342
2343 for(j = ADDRESS; j <= COUNTRY; j++)
2344 if(db_fget(i, j)real_db_field_get(i, j, 1))
2345 fprintf(out, "\n%s", db_fget(i, j)real_db_field_get(i, j, 1));
2346}
2347
2348static void
2349text_write_address_eu(FILE *out, int i) {
2350 fprintf(out, "\n%s", db_fget(i, ADDRESS)real_db_field_get(i, ADDRESS, 1));
2351
2352 if(db_fget(i, ADDRESS2)real_db_field_get(i, ADDRESS2, 1))
2353 fprintf(out, "\n%s", db_fget(i, ADDRESS2)real_db_field_get(i, ADDRESS2, 1));
2354
2355 if(db_fget(i, ZIP)real_db_field_get(i, ZIP, 1) || db_fget(i, CITY)real_db_field_get(i, CITY, 1)) {
2356 fputc('\n', out);
2357
2358 if(db_fget(i, ZIP)real_db_field_get(i, ZIP, 1)) {
2359 fprintf(out, "%s", db_fget(i, ZIP)real_db_field_get(i, ZIP, 1));
2360 if(db_fget(i, CITY)real_db_field_get(i, CITY, 1))
2361 fputc(' ', out);
2362 }
2363
2364 fprintf(out, "%s", safe_str(db_fget(i, CITY))((real_db_field_get(i, CITY, 1) == ((void*)0)) ? "" : real_db_field_get
(i, CITY, 1))
);
2365 }
2366
2367 if(db_fget(i, STATE)real_db_field_get(i, STATE, 1))
2368 fprintf(out, "\n%s", db_fget(i, STATE)real_db_field_get(i, STATE, 1));
2369
2370 if(db_fget(i, COUNTRY)real_db_field_get(i, COUNTRY, 1))
2371 fprintf(out, "\n%s", db_fget(i, COUNTRY)real_db_field_get(i, COUNTRY, 1));
2372}
2373
2374static int
2375text_export_database(FILE * out, struct db_enumerator e)
2376{
2377 abook_list *emails, *em;
2378 int j;
2379 char *realname = get_real_name(), *str = NULL((void*)0), *tmp;
2380 char *style = opt_get_str(STR_ADDRESS_STYLE);
2381
2382 fprintf(out,
2383 "-----------------------------------------\n%s's address book\n"
2384 "-----------------------------------------\n\n\n",
2385 realname);
2386 free(realname);
2387
2388 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
2389 fprintf(out,
2390 "-----------------------------------------\n\n");
2391 fprintf(out, "%s", db_name_get(e.item)real_db_field_get(e.item, NAME, 1));
2392 if(db_fget(e.item, NICK)real_db_field_get(e.item, NICK, 1) && *db_fget(e.item, NICK)real_db_field_get(e.item, NICK, 1))
2393 fprintf(out, "\n(%s)", db_fget(e.item, NICK)real_db_field_get(e.item, NICK, 1));
2394 fprintf(out, "\n");
2395
2396 tmp = db_email_get(e.item);
2397 if(*tmp) {
2398 emails = csv_to_abook_list(tmp);
2399
2400 fprintf(out, "\n");
2401 for(em = emails; em; em = em->next)
2402 fprintf(out, "%s\n", em->data);
2403
2404 abook_list_free(&emails);
2405 }
2406 free(tmp);
2407 /* Print address */
2408 if(db_fget(e.item, ADDRESS)real_db_field_get(e.item, ADDRESS, 1)) {
2409 if(!safe_strcmp(style, "us")) /* US like */
2410 text_write_address_us(out, e.item);
2411 else if(!safe_strcmp(style, "uk")) /* UK like */
2412 text_write_address_uk(out, e.item);
2413 else /* EU like */
2414 text_write_address_eu(out, e.item);
2415
2416 fprintf(out, "\n");
2417 }
2418
2419 if((db_fget(e.item, PHONE)real_db_field_get(e.item, PHONE, 1)) ||
2420 (db_fget(e.item, WORKPHONE)real_db_field_get(e.item, WORKPHONE, 1)) ||
2421 (db_fget(e.item, FAX)real_db_field_get(e.item, FAX, 1)) ||
2422 (db_fget(e.item, MOBILEPHONE)real_db_field_get(e.item, MOBILEPHONE, 1))) {
2423 fprintf(out, "\n");
2424 for(j = PHONE; j <= MOBILEPHONE; j++)
2425 if(db_fget(e.item, j)real_db_field_get(e.item, j, 1)) {
2426 get_field_info(field_id(j),
2427 NULL((void*)0), &str, NULL((void*)0));
2428 fprintf(out, "%s: %s\n", str,
2429 db_fget(e.item, j)real_db_field_get(e.item, j, 1));
2430 }
2431 }
2432
2433 if(db_fget(e.item, URL)real_db_field_get(e.item, URL, 1))
2434 fprintf(out, "\n%s\n", db_fget(e.item, URL)real_db_field_get(e.item, URL, 1));
2435 if(db_fget(e.item, NOTES)real_db_field_get(e.item, NOTES, 1))
2436 fprintf(out, "\n%s\n", db_fget(e.item, NOTES)real_db_field_get(e.item, NOTES, 1));
2437
2438 fprintf(out, "\n");
2439 }
2440
2441 fprintf(out, "-----------------------------------------\n");
2442
2443 return 0;
2444}
2445
2446/*
2447 * end of printable export filter
2448 */
2449
2450/*
2451 * elm alias export filter
2452 */
2453
2454static int
2455elm_alias_export(FILE *out, struct db_enumerator e)
2456{
2457 char email[MAX_EMAIL_LEN80];
2458 char *alias = NULL((void*)0);
2459
2460 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
2461 alias = mutt_alias_genalias(e.item);
2462 get_first_email(email, e.item);
2463 fprintf(out, "%s = %s = %s\n",alias,db_name_get(e.item)real_db_field_get(e.item, NAME, 1),email);
2464 xfree(alias)do { free(alias); alias = ((void*)0); } while(0);
2465 }
2466
2467 return 0;
2468}
2469
2470/*
2471 * end of elm alias export filter
2472 */
2473
2474
2475/*
2476 * Spruce export filter
2477 */
2478
2479static int
2480spruce_export_database (FILE *out, struct db_enumerator e)
2481{
2482 char email[MAX_EMAIL_LEN80];
2483
2484 fprintf(out, "# This is a generated file made by abook for the Spruce e-mail client.\n\n");
2485
2486 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
2487 get_first_email(email, e.item);
2488 if(strcmp(email, "")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(email) && __builtin_constant_p ("") && (__s1_len
= strlen (email), __s2_len = strlen (""), (!((size_t)(const void
*)((email) + 1) - (size_t)(const void *)(email) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)(("") + 1) - (size_t
)(const void *)("") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(email, "") : (__builtin_constant_p (email) && ((size_t
)(const void *)((email) + 1) - (size_t)(const void *)(email) ==
1) && (__s1_len = strlen (email), __s1_len < 4) ?
(__builtin_constant_p ("") && ((size_t)(const void *
)(("") + 1) - (size_t)(const void *)("") == 1) ? __builtin_strcmp
(email, "") : (__extension__ ({ const unsigned char *__s2 = (
const unsigned char *) (const char *) (""); int __result = ((
(const unsigned char *) (const char *) (email))[0] - __s2[0])
; if (__s1_len > 0 && __result == 0) { __result = (
((const unsigned char *) (const char *) (email))[1] - __s2[1]
); if (__s1_len > 1 && __result == 0) { __result =
(((const unsigned char *) (const char *) (email))[2] - __s2[
2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (email))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p ("") &&
((size_t)(const void *)(("") + 1) - (size_t)(const void *)(""
) == 1) && (__s2_len = strlen (""), __s2_len < 4) ?
(__builtin_constant_p (email) && ((size_t)(const void
*)((email) + 1) - (size_t)(const void *)(email) == 1) ? __builtin_strcmp
(email, "") : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) (email); int __result
= (((const unsigned char *) (const char *) (""))[0] - __s2[0
]); if (__s2_len > 0 && __result == 0) { __result =
(((const unsigned char *) (const char *) (""))[1] - __s2[1])
; if (__s2_len > 1 && __result == 0) { __result = (
((const unsigned char *) (const char *) (""))[2] - __s2[2]); if
(__s2_len > 2 && __result == 0) __result = (((const
unsigned char *) (const char *) (""))[3] - __s2[3]); } } __result
; })))) : __builtin_strcmp (email, "")))); })
) {
2489 fprintf(out, "# Address %d\nName: %s\nEmail: %s\nMemo: %s\n\n",
2490 e.item,
2491 db_name_get(e.item)real_db_field_get(e.item, NAME, 1),
2492 email,
2493 safe_str(db_fget(e.item, NOTES))((real_db_field_get(e.item, NOTES, 1) == ((void*)0)) ? "" : real_db_field_get
(e.item, NOTES, 1))
2494 );
2495 }
2496 }
2497
2498 fprintf (out, "# End of address book file.\n");
2499
2500 return 0;
2501}
2502
2503/*
2504 * end of Spruce export filter
2505 */
2506
2507/*
2508 * wanderlust addressbook export filter
2509 */
2510
2511static int
2512wl_export_database(FILE *out, struct db_enumerator e)
2513{
2514 char email[MAX_EMAIL_LEN80];
2515
2516 fprintf(out, "# Wanderlust address book written by %s\n\n", PACKAGE"abook");
2517 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
2518 get_first_email(email, e.item);
2519 if(*email) {
2520 fprintf(out,
2521 "%s\t\"%s\"\t\"%s\"\n",
2522 email,
2523 safe_str(db_fget(e.item, NICK))((real_db_field_get(e.item, NICK, 1) == ((void*)0)) ? "" : real_db_field_get
(e.item, NICK, 1))
,
2524 safe_str(db_name_get(e.item))((real_db_field_get(e.item, NAME, 1) == ((void*)0)) ? "" : real_db_field_get
(e.item, NAME, 1))
2525 );
2526 }
2527 }
2528
2529 fprintf (out, "\n# End of address book file.\n");
2530
2531 return 0;
2532}
2533
2534/*
2535 * end of wanderlust addressbook export filter
2536 */
2537
2538/*
2539 * BSD calendar export filter
2540 */
2541
2542static int
2543bsdcal_export_database(FILE *out, struct db_enumerator e)
2544{
2545 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
2546 int year, month = 0, day = 0;
2547 char *anniversary = db_fget(e.item, ANNIVERSARY)real_db_field_get(e.item, ANNIVERSARY, 1);
2548
2549 if(anniversary) {
2550 if(!parse_date_string(anniversary, &day, &month, &year))
2551 continue;
2552
2553 fprintf(out,
2554 _("%02d/%02d\tAnniversary of %s\n")((const char *) ("%02d/%02d\tAnniversary of %s\n")),
2555 month,
2556 day,
2557 safe_str(db_name_get(e.item))((real_db_field_get(e.item, NAME, 1) == ((void*)0)) ? "" : real_db_field_get
(e.item, NAME, 1))
2558 );
2559 }
2560 }
2561
2562 return 0;
2563}
2564
2565static int
2566find_field_enum(char *s) {
2567 int i = -1;
2568 while(standard_fields[++i].key)
2569 if(!strcmp(standard_fields[i].key, s)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(standard_fields[i].key) && __builtin_constant_p (s)
&& (__s1_len = strlen (standard_fields[i].key), __s2_len
= strlen (s), (!((size_t)(const void *)((standard_fields[i].
key) + 1) - (size_t)(const void *)(standard_fields[i].key) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((s) + 1) - (size_t)(const void *)(s) == 1) || __s2_len >=
4)) ? __builtin_strcmp (standard_fields[i].key, s) : (__builtin_constant_p
(standard_fields[i].key) && ((size_t)(const void *)(
(standard_fields[i].key) + 1) - (size_t)(const void *)(standard_fields
[i].key) == 1) && (__s1_len = strlen (standard_fields
[i].key), __s1_len < 4) ? (__builtin_constant_p (s) &&
((size_t)(const void *)((s) + 1) - (size_t)(const void *)(s)
== 1) ? __builtin_strcmp (standard_fields[i].key, s) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (s); int __result = (((const unsigned char *) (const
char *) (standard_fields[i].key))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (standard_fields[i].key))[1] - __s2[1
]); if (__s1_len > 1 && __result == 0) { __result =
(((const unsigned char *) (const char *) (standard_fields[i]
.key))[2] - __s2[2]); if (__s1_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (standard_fields
[i].key))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(s) && ((size_t)(const void *)((s) + 1) - (size_t)(const
void *)(s) == 1) && (__s2_len = strlen (s), __s2_len
< 4) ? (__builtin_constant_p (standard_fields[i].key) &&
((size_t)(const void *)((standard_fields[i].key) + 1) - (size_t
)(const void *)(standard_fields[i].key) == 1) ? __builtin_strcmp
(standard_fields[i].key, s) : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) (standard_fields
[i].key); int __result = (((const unsigned char *) (const char
*) (s))[0] - __s2[0]); if (__s2_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
s))[1] - __s2[1]); if (__s2_len > 1 && __result ==
0) { __result = (((const unsigned char *) (const char *) (s)
)[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (s))[3]
- __s2[3]); } } __result; })))) : __builtin_strcmp (standard_fields
[i].key, s)))); })
)
2570 return i;
2571 return -1;
2572}
2573
2574/* Convert a string with named placeholders to
2575 a *printf() compatible string.
2576 Stores the abook field values into ft. */
2577void
2578parse_custom_format(char *s, char *fmt_string, enum field_types *ft)
2579{
2580 if(! fmt_string || ! ft) {
2581 fprintf(stderrstderr, _("parse_custom_format: fmt_string or ft not allocated\n")((const char *) ("parse_custom_format: fmt_string or ft not allocated\n"
))
);
2582 exit(EXIT_FAILURE1);
2583 }
2584
2585 char tmp[1] = { 0 };
2586 char *p, *start, *field_name = NULL((void*)0);
2587 p = start = s;
2588
2589 while(*p) {
2590 if(*p == '{') {
2591 start = ++p;
2592
2593 if(! *start) goto cannotparse;
2594 p = strchr(start, '}')(__extension__ (__builtin_constant_p ('}') && !__builtin_constant_p
(start) && ('}') == '\0' ? (char *) __rawmemchr (start
, '}') : __builtin_strchr (start, '}')))
;
2595 if(! p) goto cannotparse;
2596 strcat(fmt_string, "%s");
2597 field_name = strndup(start, (size_t)(p-start))(__extension__ (__builtin_constant_p (start) && ((size_t
)(const void *)((start) + 1) - (size_t)(const void *)(start) ==
1) ? (((const char *) (start))[0] == '\0' ? (char *) calloc (
(size_t) 1, (size_t) 1) : ({ size_t __len = strlen (start) + 1
; size_t __n = ((size_t)(p-start)); char *__retval; if (__n <
__len) __len = __n + 1; __retval = (char *) malloc (__len); if
(__retval != ((void*)0)) { __retval[__len - 1] = '\0'; __retval
= (char *) memcpy (__retval, start, __len - 1); } __retval; }
)) : __strndup (start, (size_t)(p-start))))
;
2598 *ft = find_field_enum(field_name);
2599 if(*ft == -1) {
2600 fprintf(stderrstderr, _("parse_custom_format: invalid placeholder: {%s}\n")((const char *) ("parse_custom_format: invalid placeholder: {%s}\n"
))
, field_name);
2601 exit(EXIT_FAILURE1);
2602 }
2603
2604 ft++;
2605 start = ++p;
2606 }
2607
2608 else if(*p == '\\') {
2609 ++p;
2610 if(! *p) tmp[0] = '\\'; // last char is a '\' ?
2611 else if(*p == 'n') *tmp = '\n';
2612 else if(*p == 't') *tmp = '\t';
2613 else if(*p == 'r') *tmp = '\r';
2614 else if(*p == 'v') *tmp = '\v';
2615 else if(*p == 'b') *tmp = '\b';
2616 else if(*p == 'a') *tmp = '\a';
2617 else *tmp = *p;
2618 strncat(fmt_string, tmp, 1)__builtin_strncat (fmt_string, tmp, 1);
2619 start = ++p;
2620 }
2621
2622 // if no '\' following: quick mode using strchr/strncat
2623 else if(! strchr(start, '\\')(__extension__ (__builtin_constant_p ('\\') && !__builtin_constant_p
(start) && ('\\') == '\0' ? (char *) __rawmemchr (start
, '\\') : __builtin_strchr (start, '\\')))
) {
2624 p = strchr(start, '{')(__extension__ (__builtin_constant_p ('{') && !__builtin_constant_p
(start) && ('{') == '\0' ? (char *) __rawmemchr (start
, '{') : __builtin_strchr (start, '{')))
;
2625 if(p) { // copy until the next placeholder
2626 strncat(fmt_string, start, (size_t)(p-start))__builtin_strncat (fmt_string, start, (size_t)(p-start));
2627 start = p;
2628 }
2629 else { // copy till the end
2630 strncat( fmt_string,__builtin_strncat (fmt_string, start, 128 - strlen(fmt_string
) - 1)
2631 start,__builtin_strncat (fmt_string, start, 128 - strlen(fmt_string
) - 1)
2632 FORMAT_STRING_LEN - strlen(fmt_string) - 1 )__builtin_strncat (fmt_string, start, 128 - strlen(fmt_string
) - 1)
;
2633 break;
2634 }
2635 }
2636
2637 // otherwise character by character
2638 else {
2639 strncat(fmt_string, p, 1)__builtin_strncat (fmt_string, p, 1);
2640 start = ++p;
2641 }
2642 }
2643
2644 *ft = ITEM_FIELDS;
2645 return;
2646
2647 cannotparse:
2648 fprintf(stderrstderr, _("%s: invalid format, index %ld\n")((const char *) ("%s: invalid format, index %ld\n")), __FUNCTION__, (start - s));
2649 free(fmt_string);
2650 while(*ft) free(ft--);
2651 exit(EXIT_FAILURE1);
2652}
2653
2654static int
2655custom_export_item(FILE *out, int item, char *s, enum field_types *ft);
2656
2657
2658// used to store the format string from --outformatstr when "custom" format is used
2659// default value overriden in export_file()
2660extern char *parsed_custom_format;
2661extern enum field_types *custom_format_fields;
2662
2663/* wrapper for custom_export_item:
2664 1) avoid messing with extern pointer
2665 2) adds \n
2666 3) follow the prototype needed for an abook_output_item_filter entry */
2667void
2668custom_print_item(FILE *out, int item)
2669{
2670
2671 if(custom_export_item(out, item, parsed_custom_format, custom_format_fields) == 0)
2672 fprintf(out, "\n");
2673}
2674
2675static int
2676custom_export_item(FILE *out, int item, char *fmt, enum field_types *ft)
2677{
2678 char *p, *q = 0;
2679
2680 // if the first character is '!':
2681 // we first check that all fields exist before continuing
2682 if(*fmt == '!') {
2683 enum field_types *ftp = ft;
2684 while(*ft != ITEM_FIELDS) {
2685 if(! db_fget(item, *ft)real_db_field_get(item, *ft, 1) )
2686 return 1;
2687 ft++;
2688 }
2689 ft = ftp;
2690 fmt++;
2691 }
2692
2693 while (*fmt) {
2694 if(!strncmp(fmt, "%s", 2)(__extension__ (__builtin_constant_p (2) && ((__builtin_constant_p
(fmt) && strlen (fmt) < ((size_t) (2))) || (__builtin_constant_p
("%s") && strlen ("%s") < ((size_t) (2)))) ? __extension__
({ size_t __s1_len, __s2_len; (__builtin_constant_p (fmt) &&
__builtin_constant_p ("%s") && (__s1_len = strlen (fmt
), __s2_len = strlen ("%s"), (!((size_t)(const void *)((fmt) +
1) - (size_t)(const void *)(fmt) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)(("%s") + 1) - (size_t)(const void *
)("%s") == 1) || __s2_len >= 4)) ? __builtin_strcmp (fmt, "%s"
) : (__builtin_constant_p (fmt) && ((size_t)(const void
*)((fmt) + 1) - (size_t)(const void *)(fmt) == 1) &&
(__s1_len = strlen (fmt), __s1_len < 4) ? (__builtin_constant_p
("%s") && ((size_t)(const void *)(("%s") + 1) - (size_t
)(const void *)("%s") == 1) ? __builtin_strcmp (fmt, "%s") : (
__extension__ ({ const unsigned char *__s2 = (const unsigned char
*) (const char *) ("%s"); int __result = (((const unsigned char
*) (const char *) (fmt))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (fmt))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (fmt))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (fmt))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("%s") && ((size_t)(const void *)(("%s") + 1) - (size_t
)(const void *)("%s") == 1) && (__s2_len = strlen ("%s"
), __s2_len < 4) ? (__builtin_constant_p (fmt) && (
(size_t)(const void *)((fmt) + 1) - (size_t)(const void *)(fmt
) == 1) ? __builtin_strcmp (fmt, "%s") : (- (__extension__ ({
const unsigned char *__s2 = (const unsigned char *) (const char
*) (fmt); int __result = (((const unsigned char *) (const char
*) ("%s"))[0] - __s2[0]); if (__s2_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
"%s"))[1] - __s2[1]); if (__s2_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
"%s"))[2] - __s2[2]); if (__s2_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) ("%s"
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (fmt
, "%s")))); }) : strncmp (fmt, "%s", 2)))
) {
2695 fprintf(out, "%s", safe_str(db_fget(item, *ft))((real_db_field_get(item, *ft, 1) == ((void*)0)) ? "" : real_db_field_get
(item, *ft, 1))
);
2696 ft++;
2697 fmt+=2;
2698 } else if (*ft == ITEM_FIELDS) {
2699 fprintf(out, "%s", fmt);
2700 return 0;
2701 } else {
2702 p = strchr(fmt, '%')(__extension__ (__builtin_constant_p ('%') && !__builtin_constant_p
(fmt) && ('%') == '\0' ? (char *) __rawmemchr (fmt, '%'
) : __builtin_strchr (fmt, '%')))
;
2703 if(*p) {
2704 q = strndup(fmt, (size_t)(p-fmt))(__extension__ (__builtin_constant_p (fmt) && ((size_t
)(const void *)((fmt) + 1) - (size_t)(const void *)(fmt) == 1
) ? (((const char *) (fmt))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (fmt) + 1; size_t
__n = ((size_t)(p-fmt)); char *__retval; if (__n < __len)
__len = __n + 1; __retval = (char *) malloc (__len); if (__retval
!= ((void*)0)) { __retval[__len - 1] = '\0'; __retval = (char
*) memcpy (__retval, fmt, __len - 1); } __retval; })) : __strndup
(fmt, (size_t)(p-fmt))))
;
2705 fprintf(out, "%s", q);
2706 free(q);
2707 fmt = p;
2708 }
2709 else {
2710 fprintf(out, "%s", fmt);
2711 return 0;
2712 }
2713 }
2714 }
2715
2716 return 0;
2717}
2718
2719// used to store the format string from --outformatstr when "custom" format is used
2720// default value overriden from abook.c
2721extern char custom_format[FORMAT_STRING_LEN128];
2722
2723static int
2724custom_export_database(FILE *out, struct db_enumerator e)
2725{
2726 char *format_string =
2727 (char *)malloc(FORMAT_STRING_LEN128 * sizeof(char*));
2728
2729 enum field_types *ft =
2730 (enum field_types *)malloc(FORMAT_STRING_MAX_FIELDS16 * sizeof(enum field_types *));
Result of 'malloc' is converted to a pointer of type 'enum field_types', which is incompatible with sizeof operand type 'enum field_types *'
2731
2732 parse_custom_format(custom_format, format_string, ft);
2733
2734 db_enumerate_items(e)while( -1 != (e.item = real_db_enumerate_items(e))) {
2735 if(custom_export_item(out, e.item, format_string, ft) == 0)
2736 fprintf(out, "\n");
2737 }
2738 return 0;
2739}
2740
2741/*
2742 * end of BSD calendar export filter
2743 */
2744