X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=mymail.c;h=a8fa8c95c3fbb934d0cd8504eca9eb3b8e1ff680;hb=cf362936559fd3708d5bd864d24e499c68d07d2f;hp=692e0a3a48ad67c95744f23f464faa1b69015260;hpb=8cee89a392dc0a2e1379ae9b56d03c4bf70e0254;p=mymail.git diff --git a/mymail.c b/mymail.c index 692e0a3..a8fa8c9 100644 --- a/mymail.c +++ b/mymail.c @@ -43,6 +43,7 @@ #include #include #include +#include #define MYMAIL_DB_MAGIC_TOKEN "mymail_index_file" #define VERSION "0.9.1" @@ -61,27 +62,33 @@ int paranoid; int action_index; int quiet; +time_t being_today; + /********************************************************************/ enum { ID_MAIL = 0, + ID_LEADING_LINE, ID_FROM, ID_TO, ID_SUBJECT, ID_DATE, ID_PARTICIPANT, ID_BODY, + ID_INTERVAL, MAX_ID }; static char *field_names[] = { "mail", + "lead", "from", "to", "subject", "date", "part", - "body" + "body", + "interval" }; /********************************************************************/ @@ -90,6 +97,7 @@ struct search_condition { int field_id; int negation; regex_t regexp; + time_t interval_start, interval_stop; }; /********************************************************************/ @@ -101,9 +109,15 @@ struct parsable_field { }; static struct parsable_field fields_to_parse[] = { + { + ID_LEADING_LINE, + "^From ", + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { ID_FROM, - "^\\(From \\|[Ff][Rr][Oo][Mm]:\\|[R][r][E][e][P][p][L][l][Y][y]-[T][t][O][o]:\\)", + "^\\([Ff][Rr][Oo][Mm]:\\|[Rr][Ee][Pp][Ll][Yy]-[Tt][Oo]:\\|[Ss][Ee][Nn][Dd][Ee][Rr]:\\)", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, @@ -204,11 +218,43 @@ int ignore_entry(const char *name) { int mbox_line_match_search(struct search_condition *condition, int mbox_id, char *mbox_value) { - return - (condition->field_id == mbox_id || - (condition->field_id == ID_PARTICIPANT && (mbox_id == ID_FROM || mbox_id == ID_TO))) - && - regexec(&condition->regexp, mbox_value, 0, 0, 0) == 0; + + if(condition->field_id == ID_INTERVAL) { + if(mbox_id == ID_LEADING_LINE) { + char *c; + time_t t; + struct tm tm; + + c = mbox_value; + while(*c && *c != ' ') c++; while(*c && *c == ' ') c++; + strptime(c, "%a %b %e %k:%M:%S %Y", &tm); + t = mktime(&tm); + + return (t >= condition->interval_start && + (condition->interval_stop == 0 || + t <= condition->interval_stop)); + } else { + return 0; + } + } else { + return + ( + + (condition->field_id == mbox_id) + + || + + (condition->field_id == ID_PARTICIPANT && (mbox_id == ID_LEADING_LINE || + mbox_id == ID_FROM || + mbox_id == ID_TO)) + || + + (condition->field_id == ID_FROM && mbox_id == ID_LEADING_LINE) + + ) + && + regexec(&condition->regexp, mbox_value, 0, 0, 0) == 0; + } } void search_in_db(FILE *db_file, @@ -772,6 +818,7 @@ int main(int argc, char **argv) { optind++; } + fflush(db_file); fclose(db_file); for(f = 0; f < nb_fields_to_parse; f++) { @@ -788,7 +835,6 @@ int main(int argc, char **argv) { for(n = 0; n < nb_search_conditions; n++) { search_field = search_condition_strings[n]; - search_regexp_string = segment_next_field(search_condition_strings[n]); if(search_field[0] == '!') { search_field++; @@ -797,28 +843,45 @@ int main(int argc, char **argv) { search_conditions[n].negation = 0; } - search_conditions[n].field_id = -1; - for(m = 0; (m < MAX_ID) && search_conditions[n].field_id == -1; m++) { - if(strncmp(field_names[m], search_field, strlen(search_field)) == 0) { - search_conditions[n].field_id = m; - } + if(strcmp(search_field, "today") == 0) { + search_conditions[n].field_id = ID_INTERVAL; + search_conditions[n].interval_start = time(0) - 3600 * 24; + search_conditions[n].interval_stop = 0; } - if(search_conditions[n].field_id == -1) { - fprintf(stderr, - "mymail: Syntax error in field name \"%s\".\n", - search_field); - exit(EXIT_FAILURE); + else if(strcmp(search_field, "yesterday") == 0) { + search_conditions[n].field_id = ID_INTERVAL; + search_conditions[n].interval_start = time(0) - 2 * 3600 * 24; + search_conditions[n].interval_stop = time(0) - 3600 * 24; } - if(regcomp(&search_conditions[n].regexp, - search_regexp_string, - REG_ICASE)) { - fprintf(stderr, - "mymail: Syntax error in regexp \"%s\" for field \"%s\".\n", - search_regexp_string, - field_names[search_conditions[n].field_id]); - exit(EXIT_FAILURE); + else { + search_regexp_string = segment_next_field(search_condition_strings[n]); + + search_conditions[n].field_id = -1; + + for(m = 0; (m < MAX_ID) && search_conditions[n].field_id == -1; m++) { + if(strncmp(field_names[m], search_field, strlen(search_field)) == 0) { + search_conditions[n].field_id = m; + } + } + + if(search_conditions[n].field_id == -1) { + fprintf(stderr, + "mymail: Syntax error in field name \"%s\".\n", + search_field); + exit(EXIT_FAILURE); + } + + if(regcomp(&search_conditions[n].regexp, + search_regexp_string, + REG_ICASE)) { + fprintf(stderr, + "mymail: Syntax error in regexp \"%s\" for field \"%s\".\n", + search_regexp_string, + field_names[search_conditions[n].field_id]); + exit(EXIT_FAILURE); + } } } @@ -902,6 +965,7 @@ int main(int argc, char **argv) { } if(output_file != stdout) { + fflush(output_file); fclose(output_file); }