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") )
88 else if( statusline_ask_boolean("Save database", FALSE) )
100 main(int argc, char **argv)
102 #if defined(HAVE_SETLOCALE) && defined(HAVE_LOCALE_H)
103 setlocale(LC_ALL, "" );
106 parse_command_line(argc, argv);
122 if( (stat(getenv("HOME"), &s)) == -1 || ! S_ISDIR(s.st_mode) ) {
123 fprintf(stderr,"%s is not a valid HOME directory\n", getenv("HOME") );
128 datafile = strconcat(getenv("HOME"), "/" DATAFILE, NULL);
130 rcfile = strconcat(getenv("HOME"), "/" RCFILE, NULL);
132 atexit(free_filenames);
143 parse_command_line(int argc, char **argv)
147 for( i = 1; i < argc; i++ ) {
148 if( !strcmp(argv[i], "--help") ) {
152 if( !strcmp(argv[i], "--mutt-query") )
153 mutt_query(argv[i + 1]);
155 if( !strcmp(argv[i], "--datafile") ) {
157 if (argv[i+1][0] != '/') {
158 char *cwd = my_getcwd();
159 datafile = strconcat(cwd, "/", argv[i+1], NULL);
162 datafile = strdup(argv[i+1]);
170 if( !strcmp(argv[i], "--convert") ) {
171 if( argc < 5 || argc > 6 ) {
172 fprintf(stderr, "incorrect number of argumets to make conversion\n");
173 fprintf(stderr, "try %s --help\n", argv[0]);
177 convert(argv[i+1], argv[i+2],
178 argv[i+3], argv[i+4]);
180 convert(argv[i+1], argv[i+2], argv[i+3], "-");
182 printf("option %s not recognized\n", argv[i]);
183 printf("try %s --help\n", argv[0]);
193 puts (PACKAGE " v " VERSION "\n");
194 puts (" --help show usage");
195 puts (" --datafile <filename> use an alternative addressbook file");
196 puts (" --mutt-query <string> make a query for mutt");
197 puts (" --convert <inputformat> <inputfile> "
198 "<outputformat> <outputfile>");
200 puts ("available formats for --convert option:");
203 puts ("\nWarning: this version compiled with DEBUG flag ON");
207 extern list_item *database;
211 muttq_print_item(int item)
213 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
216 split_emailstr(item, emails);
218 for(i = 0; i < (options_get_int("mutt_return_all_emails") ?
219 MAX_EMAILS : 1) ; i++)
221 printf("%s\t%s\t%s\n", emails[i],
222 database[item][NAME],
223 database[item][NOTES] == NULL ? " " :
224 database[item][NOTES]
229 mutt_query_name(char *str)
234 for(i = 0, j = 0 ; i < items; i++) {
235 tmp = strdup(database[i][NAME]);
236 if( strstr( strupper(tmp), strupper(str) ) != NULL ) {
249 mutt_query_email(char *str)
252 char *tmp, emails[MAX_EMAILS][MAX_EMAIL_LEN];
254 for(i = 0, j = 0; i < items; i++) {
255 split_emailstr(i, emails);
256 for(k = 0; k < MAX_EMAILS; k++) {
258 tmp = strdup( emails[k] );
259 if( strstr( strupper(tmp), strupper(str) ) != NULL ) {
263 if( options_get_int("mutt_return_all_emails") ) {
268 printf("%s\t%s\n", emails[k],
280 mutt_query(char *str)
286 if( str == NULL || !strcasecmp(str, "all") ) {
287 printf("All items\n");
288 for(i = 0; i < items; i++)
291 if( !mutt_query_name(str) && !mutt_query_email(str) ) {
292 printf("Not found\n");
306 if( load_database(datafile) ) {
307 printf("Cannot open database\n");
314 quit_mutt_query(int status)
327 char email[MAX_EMAIL_LEN];
329 char *tmp = options_get_str("mutt_command");
331 if( list_is_empty() )
334 cmd = strconcat(tmp, " '", NULL );
336 for(i=0; i < items; i++) {
337 if( ! is_selected(i) && i != list_current_item() )
339 get_first_email(email, i);
340 tmp = mkstr("%s \"%s\"", cmd, database[i][NAME]);
342 if( *database[i][EMAIL] ) {
343 cmd = mkstr("%s <%s>", tmp, email);
347 cmd = strconcat(tmp, " ", NULL);
351 tmp = mkstr("%s%c", cmd, '\'');
355 fprintf(stderr, "cmd: %s\n", cmd);
368 if( list_is_empty() )
371 if( database[list_current_item()][URL] )
372 cmd = mkstr("%s '%s'",
373 options_get_str("www_command"),
374 safe_str(database[list_current_item()][URL]));
386 abook_malloc(size_t size)
390 if ( (ptr = malloc(size)) == NULL ) {
391 if( is_ui_initialized() )
393 perror("malloc() failed");
401 abook_realloc(void *ptr, size_t size)
403 ptr = realloc(ptr, size);
409 if( is_ui_initialized() )
411 perror("realloc() failed");
419 abook_fopen (const char *path, const char *mode)
423 if( ! strchr(mode, 'r') )
424 return fopen(path, mode);
426 if ( (stat(path, &s)) == -1 )
429 return S_ISREG(s.st_mode) ? fopen(path, mode) : NULL;
435 convert(char *srcformat, char *srcfile, char *dstformat, char *dstfile)
439 if( !srcformat || !srcfile || !dstformat || !dstfile ) {
440 fprintf(stderr, "too few argumets to make conversion\n");
441 fprintf(stderr, "try --help\n");
447 if( !strcmp(srcformat, dstformat) ) {
448 printf( "input and output formats are the same\n"
456 switch( import(srcformat, srcfile) ) {
458 printf("input format %s not supported\n", srcformat);
461 printf("cannot read file %s\n", srcfile);
466 switch( export(dstformat, dstfile) ) {
468 printf("output format %s not supported\n",
473 printf("cannot write file %s\n", dstfile);