X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=mymail.git;a=blobdiff_plain;f=mymail.c;h=5d16bb3b31f8e18f610a1a7b2df11eb3c95adcaf;hp=b1734f23207663f31d50b8c2bba7375b3891d7d8;hb=ed9a958f95d7436aa585bc57a5e4761e8120be02;hpb=bb821f06831e36cb8fa7088f7eabbf1d567efdb5 diff --git a/mymail.c b/mymail.c index b1734f2..5d16bb3 100644 --- a/mymail.c +++ b/mymail.c @@ -55,17 +55,11 @@ regex_t leading_from_line_regexp; -char *db_filename; -char *db_filename_regexp_string; -char *db_root_path; -char *db_filename_list; -char output_filename[PATH_MAX + 1]; +/* Global variables! */ int paranoid; -int action_index; int quiet; - -time_t being_today; +char *default_search_field; /********************************************************************/ @@ -213,6 +207,20 @@ void print_usage(FILE *out) { fprintf(out, " index mails\n"); fprintf(out, " -o , --output \n"); fprintf(out, " set the result file, use stdout if unset\n"); + fprintf(out, " -a , --default-search \n"); + fprintf(out, " set the default search field\n"); +} + +/*********************************************************************/ + +time_t time_for_past_day(int day) { + time_t t; + struct tm *tm; + int delta_day; + t = time(0); + tm = localtime(&t); + delta_day = (7 + tm->tm_wday - day) % 7 + 1; + return t - delta_day * 3600 * 24 + tm->tm_sec + 60 * tm->tm_min + 3600 * tm->tm_hour; } /*********************************************************************/ @@ -678,16 +686,18 @@ static struct option long_options[] = { { "search", 1, 0, 's' }, { "index", 0, 0, 'i' }, { "output", 1, 0, 'o' }, + { "default-search", 1, 0, 'a' }, { 0, 0, 0, 0 } }; /*********************************************************************/ -void init_condition(struct search_condition *condition, char *string) { +void init_condition(struct search_condition *condition, char *full_string) { char full_search_field[TOKEN_BUFFER_SIZE], *search_field; int m; + char *string; - string = parse_token(full_search_field, TOKEN_BUFFER_SIZE, ' ', string); + string = parse_token(full_search_field, TOKEN_BUFFER_SIZE, ' ', full_string); search_field = full_search_field; if(search_field[0] == '!') { @@ -697,9 +707,23 @@ void init_condition(struct search_condition *condition, char *string) { condition->negation = 0; } - if(strcmp(search_field, "6h") == 0) { + /* Recently */ + + if(strcmp(search_field, "8h") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time(0) - 3600 * 8; + condition->interval_stop = 0; + } + + else if(strcmp(search_field, "week") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time(0) - 3600 * 24 * 7; + condition->interval_stop = 0; + } + + else if(strcmp(search_field, "month") == 0) { condition->field_id = ID_INTERVAL; - condition->interval_start = time(0) - 3600 * 6; + condition->interval_start = time(0) - 3600 * 24 * 31; condition->interval_stop = 0; } @@ -710,13 +734,62 @@ void init_condition(struct search_condition *condition, char *string) { condition->interval_stop = 0; } + /* Yesterday */ + else if(strcmp(search_field, "yesterday") == 0) { condition->field_id = ID_INTERVAL; condition->interval_start = time(0) - 2 * 3600 * 24; - condition->interval_stop = time(0) - 3600 * 24; + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + /* Week days */ + + else if(strcmp(search_field, "monday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(1); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "tuesday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(2); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "wednesday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(3); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "thursday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(4); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "friday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(5); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "saturday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(6); + condition->interval_stop = condition->interval_start + 3600 * 24; + } + + else if(strcmp(search_field, "sunday") == 0) { + condition->field_id = ID_INTERVAL; + condition->interval_start = time_for_past_day(7); + condition->interval_stop = condition->interval_start + 3600 * 24; } else { + + /* header-related conditions */ + condition->field_id = -1; for(m = 0; (m < MAX_ID) && condition->field_id == -1; m++) { @@ -725,6 +798,18 @@ void init_condition(struct search_condition *condition, char *string) { } } + if(condition->field_id == -1) { + if(default_search_field) { + for(m = 0; (m < MAX_ID) && condition->field_id == -1; m++) { + if(strncmp(field_names[m], + default_search_field, strlen(default_search_field)) == 0) { + condition->field_id = m; + } + } + string = full_string; + } + } + if(condition->field_id == -1) { fprintf(stderr, "mymail: Syntax error in field name \"%s\".\n", @@ -755,6 +840,12 @@ void free_condition(struct search_condition *condition) { /*********************************************************************/ int main(int argc, char **argv) { + char *db_filename; + char *db_filename_regexp_string; + char *db_root_path; + char *db_filename_list; + char output_filename[PATH_MAX + 1]; + int action_index; int error = 0, show_help = 0; const int nb_fields_to_parse = sizeof(fields_to_parse) / sizeof(struct parsable_field); char c; @@ -764,7 +855,7 @@ int main(int argc, char **argv) { struct search_condition search_conditions[MAX_NB_SEARCH_CONDITIONS]; if(regcomp(&leading_from_line_regexp, - "^From [^ ]*@[^ ]* \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\) \\(Jan\\|Feb\\|Mar\\|Apr\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\) [ 123][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9][0-9][0-9]\n$", + "^From [^ ]* \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\) \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\) [ 123][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9][0-9][0-9]\n$", 0)) { fprintf(stderr, "mymail: Cannot compile leading \"from\" line regexp. That is strange.\n"); @@ -774,15 +865,17 @@ int main(int argc, char **argv) { paranoid = 0; action_index = 0; db_filename = 0; + db_filename_regexp_string = 0; db_root_path = 0; db_filename_list = 0; quiet = 0; + default_search_field = 0; setlocale(LC_ALL, ""); nb_search_conditions = 0; - while ((c = getopt_long(argc, argv, "hvqip:s:d:r:l:o:", + while ((c = getopt_long(argc, argv, "hvqip:s:d:r:l:o:a:", long_options, NULL)) != -1) { switch(c) { @@ -832,6 +925,10 @@ int main(int argc, char **argv) { nb_search_conditions++; break; + case 'a': + default_search_field = optarg; + break; + default: error = 1; break;