From 28a390db0115b52f2faa9f0c2746abd2e318105f Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Mon, 4 Feb 2013 08:17:25 +0100 Subject: [PATCH] Added the --output and --quiet options. --- mymail-vm.el | 2 +- mymail.c | 76 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/mymail-vm.el b/mymail-vm.el index d5d7f4e..5ca0045 100644 --- a/mymail-vm.el +++ b/mymail-vm.el @@ -31,6 +31,6 @@ (while (get-file-buffer (setq mbox-name (format "/tmp/mymail-vm-%d.mbox" n))) (setq n (+ n 1))) - (shell-command (concat "mymail " args " > " mbox-name)) + (shell-command (concat "mymail --output " mbox-name " " args)) (vm-visit-folder mbox-name t) )) diff --git a/mymail.c b/mymail.c index 03ecfb8..af3ef6c 100644 --- a/mymail.c +++ b/mymail.c @@ -55,9 +55,11 @@ char *db_filename; char *db_filename_regexp_string; char *db_root_path; char *db_filename_list; +char output_filename[PATH_MAX + 1]; int paranoid; int action_index; +int quiet; /********************************************************************/ @@ -173,6 +175,8 @@ void print_usage(FILE *out) { fprintf(out, " show this help\n"); fprintf(out, " -v, --version\n"); fprintf(out, " print the version number\n"); + fprintf(out, " -q, --quiet\n"); + fprintf(out, " do not print information during search\n"); fprintf(out, " -p , --db-pattern \n"); fprintf(out, " set the db filename pattern for recursive search\n"); fprintf(out, " -r , --db-root \n"); @@ -185,6 +189,8 @@ void print_usage(FILE *out) { fprintf(out, " set the db filename for indexing\n"); fprintf(out, " -i, --index\n"); fprintf(out, " index mails\n"); + fprintf(out, " -o , --output \n"); + fprintf(out, " set the result file, use stdout if unset\n"); } /*********************************************************************/ @@ -205,9 +211,11 @@ int mbox_line_match_search(struct search_condition *condition, regexec(&condition->regexp, mbox_value, 0, 0, 0) == 0; } -void search_in_db(int nb_search_conditions, +void search_in_db(FILE *db_file, + int nb_search_conditions, struct search_condition *search_conditions, - FILE *db_file) { + FILE *output_file) { + int hits[MAX_NB_SEARCH_CONDITIONS]; char raw_db_line[BUFFER_SIZE]; char raw_mbox_line[BUFFER_SIZE]; @@ -315,13 +323,13 @@ void search_in_db(int nb_search_conditions, if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) { last_mbox_line_was_empty = 1; - printf("%s", raw_mbox_line); + fprintf(output_file, "%s", raw_mbox_line); while(1) { if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) || (last_mbox_line_was_empty && strncmp(raw_mbox_line, "From ", 5) == 0)) break; last_mbox_line_was_empty = (raw_mbox_line[0] == '\n'); - printf("%s", raw_mbox_line); + fprintf(output_file, "%s", raw_mbox_line); } } @@ -358,7 +366,8 @@ void search_in_db(int nb_search_conditions, void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, int nb_search_conditions, - struct search_condition *search_conditions) { + struct search_condition *search_conditions, + FILE *output_file) { DIR *dir; struct dirent *dir_e; struct stat sb; @@ -380,7 +389,8 @@ void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, if(!ignore_entry(dir_e->d_name)) { snprintf(subname, PATH_MAX, "%s/%s", entry_name, dir_e->d_name); recursive_search_in_db(subname, db_filename_regexp, - nb_search_conditions, search_conditions); + nb_search_conditions, search_conditions, + output_file); } } closedir(dir); @@ -393,6 +403,10 @@ void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, if(regexec(db_filename_regexp, filename, 0, 0, 0) == 0) { FILE *db_file = fopen(entry_name, "r"); + if(!quiet) { + printf("Searching in '%s' ... ", entry_name); + } + if(!db_file) { fprintf(stderr, "mymail: Cannot open \"%s\" for reading: %s\n", @@ -415,9 +429,13 @@ void recursive_search_in_db(const char *entry_name, regex_t *db_filename_regexp, exit(EXIT_FAILURE); } - search_in_db(nb_search_conditions, search_conditions, db_file); + search_in_db(db_file, nb_search_conditions, search_conditions, output_file); fclose(db_file); + + if(!quiet) { + printf("done.\n"); + } } } } @@ -569,12 +587,14 @@ enum { static struct option long_options[] = { { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'v' }, + { "quiet", no_argument, 0, 'q' }, { "db-file", 1, 0, 'd' }, { "db-pattern", 1, 0, 'p' }, { "db-root", 1, 0, 'r' }, { "db-list", 1, 0, 'l' }, { "search", 1, 0, 's' }, { "index", 0, 0, 'i' }, + { "output", 1, 0, 'o' }, { 0, 0, 0, 0 } }; @@ -587,22 +607,20 @@ int main(int argc, char **argv) { int f; int nb_search_conditions; char *search_condition_strings[MAX_NB_SEARCH_CONDITIONS]; - - /* for(f = 0; f < argc; f++) { */ - /* printf("arg %d \"%s\"\n", f, argv[f]); */ - /* } */ + FILE *output_file; paranoid = 0; action_index = 0; db_filename = 0; db_root_path = 0; db_filename_list = 0; + quiet = 0; setlocale(LC_ALL, ""); nb_search_conditions = 0; - while ((c = getopt_long(argc, argv, "hvip:s:d:r:l:", + while ((c = getopt_long(argc, argv, "hvqip:s:d:r:l:o:", long_options, NULL)) != -1) { switch(c) { @@ -615,6 +633,10 @@ int main(int argc, char **argv) { print_version(stdout); break; + case 'q': + quiet = 1; + break; + case 'i': action_index = 1; break; @@ -627,6 +649,10 @@ int main(int argc, char **argv) { db_filename_regexp_string = strdup(optarg); break; + case 'o': + strncpy(output_filename, optarg, PATH_MAX); + break; + case 'r': db_root_path = strdup(optarg); break; @@ -685,6 +711,21 @@ int main(int argc, char **argv) { } } + if(output_filename[0]) { + output_file = fopen(output_filename, "w"); + + if(!output_file) { + fprintf(stderr, + "mymail: Cannot open result file \"%s\" for writing: %s\n", + output_filename, + strerror(errno)); + exit(EXIT_FAILURE); + } + } else { + output_file = stdout; + quiet = 1; + } + if(error) { print_usage(stderr); exit(EXIT_FAILURE); @@ -793,7 +834,8 @@ int main(int argc, char **argv) { } recursive_search_in_db(db_root_path, &db_filename_regexp, - nb_search_conditions, search_conditions); + nb_search_conditions, search_conditions, + output_file); regfree(&db_filename_regexp); } @@ -824,7 +866,7 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } - search_in_db(nb_search_conditions, search_conditions, db_file); + search_in_db(db_file, nb_search_conditions, search_conditions, output_file); fclose(db_file); } @@ -844,7 +886,7 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } - search_in_db(nb_search_conditions, search_conditions, db_file); + search_in_db(db_file, nb_search_conditions, search_conditions, output_file); fclose(db_file); optind++; @@ -857,6 +899,10 @@ int main(int argc, char **argv) { } } + if(output_file != stdout) { + fclose(output_file); + } + free(db_filename); free(db_filename_regexp_string); free(db_root_path); -- 2.20.1