From: Francois Fleuret Date: Fri, 22 Mar 2013 07:56:16 +0000 (+0100) Subject: Fixed a bug for the last mail of each db (it was ignored ...) + redefined "today" X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=mymail.git;a=commitdiff_plain;h=7b9e0f6566b6a597dc83f79dd405e0ddd520a7ff Fixed a bug for the last mail of each db (it was ignored ...) + redefined "today" --- diff --git a/mymail.c b/mymail.c index e078bf6..5e2cb21 100644 --- a/mymail.c +++ b/mymail.c @@ -270,7 +270,9 @@ int mbox_line_match_search(struct search_condition *condition, } } else { if(mbox_id == ID_DATE) { - strptime(mbox_value, "%a, %d %b %Y %k:%M:%S", &tm); + if(!strptime(mbox_value, "%a, %d %b %Y %k:%M:%S", &tm)) { + strptime(mbox_value, "%d %b %Y %k:%M:%S", &tm); + } t = mktime(&tm); return (t >= condition->interval_start && (condition->interval_stop == 0 || @@ -368,6 +370,45 @@ void extract_mail(const char *mail_filename, unsigned long int position_in_mail, fclose(mail_file); } +int check_full_mail_match(char *current_mail_filename, + int nb_search_conditions, + struct search_condition *search_conditions, + int nb_body_conditions, + int *hits, + int current_position_in_mail) { + int n, nb_fulfilled_body_conditions; + + /* We first check all conditions but the body ones */ + + for(n = 0; n < nb_search_conditions && + ((search_conditions[n].field_id == ID_BODY) || + xor(hits[n], search_conditions[n].negation)); n++); + + if(n == nb_search_conditions) { + + /* Now check the body ones */ + + nb_fulfilled_body_conditions = 0; + + if(nb_body_conditions > 0) { + update_body_hits(current_mail_filename, current_position_in_mail, + nb_search_conditions, search_conditions, + nb_body_conditions, + hits); + + for(n = 0; n < nb_search_conditions; n++) { + if(search_conditions[n].field_id == ID_BODY && + xor(hits[n], search_conditions[n].negation)) { + nb_fulfilled_body_conditions++; + } + } + } + return nb_body_conditions == nb_fulfilled_body_conditions; + } else { + return 0; + } +} + int search_in_db(const char *db_filename, int nb_search_conditions, struct search_condition *search_conditions, @@ -381,7 +422,7 @@ int search_in_db(const char *db_filename, const char *mbox_value; int mbox_id; int already_written, m, n; - int nb_body_conditions, nb_fulfilled_body_conditions; + int nb_body_conditions; FILE *db_file; int nb_extracted_mails; @@ -431,44 +472,14 @@ int search_in_db(const char *db_filename, if(strcmp("mail", mbox_key) == 0) { char position_in_file_string[TOKEN_BUFFER_SIZE]; - - if(current_mail_filename[0]) { - - /* We first check all conditions but the body ones */ - - for(n = 0; n < nb_search_conditions && - ((search_conditions[n].field_id == ID_BODY) || - xor(hits[n], search_conditions[n].negation)); n++); - - if(n == nb_search_conditions) { - - /* Now check the body ones */ - - nb_fulfilled_body_conditions = 0; - - if(nb_body_conditions > 0) { - update_body_hits(current_mail_filename, current_position_in_mail, - nb_search_conditions, search_conditions, - nb_body_conditions, - hits); - - for(n = 0; n < nb_search_conditions; n++) { - if(search_conditions[n].field_id == ID_BODY && - xor(hits[n], search_conditions[n].negation)) { - nb_fulfilled_body_conditions++; - } - } - } - - if(nb_body_conditions == nb_fulfilled_body_conditions) { - nb_extracted_mails++; - extract_mail(current_mail_filename, current_position_in_mail, output_file); - } - } + if(current_mail_filename[0] && + check_full_mail_match(current_mail_filename, + nb_search_conditions, search_conditions, + nb_body_conditions, hits, current_position_in_mail)) { + nb_extracted_mails++; + extract_mail(current_mail_filename, current_position_in_mail, output_file); } - for(n = 0; n < nb_search_conditions; n++) { hits[n] = 0; } - mbox_value = parse_token(position_in_file_string, TOKEN_BUFFER_SIZE, ' ', mbox_value); mbox_value = parse_token(current_mail_filename, TOKEN_BUFFER_SIZE, '\n', mbox_value); current_position_in_mail = atol(position_in_file_string); @@ -489,6 +500,14 @@ int search_in_db(const char *db_filename, } } + if(current_mail_filename[0] && + check_full_mail_match(current_mail_filename, + nb_search_conditions, search_conditions, + nb_body_conditions, hits, current_position_in_mail)) { + nb_extracted_mails++; + extract_mail(current_mail_filename, current_position_in_mail, output_file); + } + fclose(db_file); if(!global_quiet) { @@ -721,7 +740,6 @@ struct time_criterion { static struct time_criterion time_criteria[] = { { "8h", 8, -1, -1 }, - { "today", 24, -1, -1 }, { "24h", 24, -1, -1 }, { "48h", 48, -1, -1 }, { "week", 24 * 7, -1, -1 }, @@ -730,6 +748,7 @@ static struct time_criterion time_criteria[] = { { "yesterday", 48, 24, -1 }, + { "today", -1, -1, 0 }, { "monday", -1, -1, 1 }, { "tuesday", -1, -1, 2 }, { "wednesday", -1, -1, 3 }, @@ -748,8 +767,11 @@ time_t time_for_past_day(int day) { int delta_day; t = time(0); tm = localtime(&t); - delta_day = (7 + tm->tm_wday - day) % 7; - if(delta_day == 0) { delta_day = 7; } + if(day > 0) { + delta_day = (7 + tm->tm_wday - day) % 7; + } else { + delta_day = 0; + } return t - (delta_day * 3600 * 24 + tm->tm_sec + 60 * tm->tm_min + 3600 * tm->tm_hour); }