4 * by JH <jheinonen@bigfoot.com>
6 * Copyright (C) Jaakko Heinonen
18 #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
30 static void init_abook();
31 static void set_filenames();
32 static void free_filenames();
33 static void parse_command_line(int argc, char **argv);
34 static void show_usage();
35 static void mutt_query(char *str);
36 static void init_mutt_query();
37 static void quit_mutt_query();
38 static void convert(char *srcformat, char *srcfile,
39 char *dstformat, char *dstfile);
41 char *datafile = NULL;
50 signal(SIGINT, quit_abook);
51 signal(SIGKILL, quit_abook);
52 signal(SIGTERM, quit_abook);
60 * this is very ugly for now
62 /*if( options_get_int("datafile", "autosave") )*/
64 if( load_database(datafile) == 2 ) {
65 char *tmp = strconcat(getenv("HOME"),
68 if( safe_strcmp(tmp, datafile) ) {
70 statusline_msg("Sorry, the specified file does "
71 "not appear to be a valid abook addressbook");
72 statusline_msg("Will open default addressbook...");
75 load_database(datafile);
86 if( options_get_int("autosave") )
89 statusline_addstr("Save database (y/N)");
106 main(int argc, char **argv)
108 #if defined(HAVE_SETLOCALE) && defined(HAVE_LOCALE_H)
109 setlocale(LC_ALL, "" );
112 parse_command_line(argc, argv);
128 if( (stat(getenv("HOME"), &s)) == -1 || ! S_ISDIR(s.st_mode) ) {
129 fprintf(stderr,"%s is not a valid HOME directory\n", getenv("HOME") );
134 datafile = strconcat(getenv("HOME"), "/" DATAFILE, NULL);
136 rcfile = strconcat(getenv("HOME"), "/" RCFILE, NULL);
138 atexit(free_filenames);
149 parse_command_line(int argc, char **argv)
153 for( i = 1; i < argc; i++ ) {
154 if( !strcmp(argv[i], "--help") ) {
158 if( !strcmp(argv[i], "--mutt-query") )
159 mutt_query(argv[i + 1]);
161 if( !strcmp(argv[i], "--datafile") ) {
163 if (argv[i+1][0] != '/') {
164 char *cwd = my_getcwd();
165 datafile = strconcat(cwd, "/", argv[i+1], NULL);
168 datafile = strdup(argv[i+1]);
176 if( !strcmp(argv[i], "--convert") ) {
177 if( argc < 5 || argc > 6 ) {
178 fprintf(stderr, "incorrect number of argumets to make conversion\n");
179 fprintf(stderr, "try %s --help\n", argv[0]);
183 convert(argv[i+1], argv[i+2],
184 argv[i+3], argv[i+4]);
186 convert(argv[i+1], argv[i+2], argv[i+3], "-");
188 printf("option %s not recognized\n", argv[i]);
189 printf("try %s --help\n", argv[0]);
199 puts (PACKAGE " v " VERSION "\n");
200 puts (" --help show usage");
201 puts (" --datafile <filename> use an alternative addressbook file");
202 puts (" --mutt-query <string> make a query for mutt");
203 puts (" --convert <inputformat> <inputfile> "
204 "<outputformat> <outputfile>");
206 puts ("available formats for --convert option:");
209 puts ("\nWarning: this version compiled with DEBUG flag ON");
213 extern list_item *database;
217 muttq_print_item(int item)
219 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
222 split_emailstr(item, emails);
224 for(i = 0; i < (options_get_int("mutt_return_all_emails") ?
225 MAX_EMAILS : 1) ; i++)
227 printf("%s\t%s\t%s\n", emails[i],
228 database[item][NAME],
229 database[item][NOTES] == NULL ? " " :
230 database[item][NOTES]
235 mutt_query_name(char *str)
240 for(i = 0, j = 0 ; i < items; i++) {
241 tmp = strdup(database[i][NAME]);
242 if( strstr( strupper(tmp), strupper(str) ) != NULL ) {
255 mutt_query_email(char *str)
258 char *tmp, emails[MAX_EMAILS][MAX_EMAIL_LEN];
260 for(i = 0, j = 0; i < items; i++) {
261 split_emailstr(i, emails);
262 for(k = 0; k < MAX_EMAILS; k++) {
264 tmp = strdup( emails[k] );
265 if( strstr( strupper(tmp), strupper(str) ) != NULL ) {
269 if( options_get_int("mutt_return_all_emails") ) {
274 printf("%s\t%s\n", emails[k],
286 mutt_query(char *str)
292 if( str == NULL || !strcasecmp(str, "all") ) {
293 printf("All items\n");
294 for(i = 0; i < items; i++)
297 if( !mutt_query_name(str) && !mutt_query_email(str) ) {
298 printf("Not found\n");
312 if( load_database(datafile) ) {
313 printf("Cannot open database\n");
320 quit_mutt_query(int status)
333 char email[MAX_EMAIL_LEN];
335 char *tmp = options_get_str("mutt_command");
337 if( list_is_empty() )
340 cmd = strconcat(tmp, " '", NULL );
342 for(i=0; i < items; i++) {
343 if( ! is_selected(i) && i != list_current_item() )
345 get_first_email(email, i);
346 tmp = mkstr("%s \"%s\"", cmd, database[i][NAME]);
348 if( *database[i][EMAIL] ) {
349 cmd = mkstr("%s <%s>", tmp, email);
353 cmd = strconcat(tmp, " ", NULL);
357 tmp = mkstr("%s%c", cmd, '\'');
361 fprintf(stderr, "cmd: %s\n", cmd);
374 if( list_is_empty() )
377 if( database[list_current_item()][URL] )
378 cmd = mkstr("%s '%s'",
379 options_get_str("www_command"),
380 safe_str(database[list_current_item()][URL]));
392 abook_malloc(size_t size)
396 if ( (ptr = malloc(size)) == NULL ) {
397 if( is_ui_initialized() )
399 perror("malloc() failed");
407 abook_realloc(void *ptr, size_t size)
409 ptr = realloc(ptr, size);
415 if( is_ui_initialized() )
417 perror("realloc() failed");
425 abook_fopen (const char *path, const char *mode)
429 if( ! strchr(mode, 'r') )
430 return fopen(path, mode);
432 if ( (stat(path, &s)) == -1 )
435 return S_ISREG(s.st_mode) ? fopen(path, mode) : NULL;
441 convert(char *srcformat, char *srcfile, char *dstformat, char *dstfile)
445 if( !srcformat || !srcfile || !dstformat || !dstfile ) {
446 fprintf(stderr, "too few argumets to make conversion\n");
447 fprintf(stderr, "try --help\n");
453 if( !strcmp(srcformat, dstformat) ) {
454 printf( "input and output formats are the same\n"
462 switch( import(srcformat, srcfile) ) {
464 printf("input format %s not supported\n", srcformat);
467 printf("cannot read file %s\n", srcfile);
472 switch( export(dstformat, dstfile) ) {
474 printf("output format %s not supported\n",
479 printf("cannot write file %s\n", dstfile);