X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=mymail.c;h=e078bf6f7f603cc884bb7182198d952f7ed93108;hb=cf24e85e7e8dad2d7e002982bca9124e0ae9832f;hp=3d835a709c2b953c482a67515b7e21f7938cb184;hpb=5dc0d1c32d1e8c24188bccd30f7591819f79e750;p=mymail.git diff --git a/mymail.c b/mymail.c index 3d835a7..e078bf6 100644 --- a/mymail.c +++ b/mymail.c @@ -58,6 +58,7 @@ /* Global variables! */ int global_quiet; +int global_use_leading_time; regex_t global_leading_from_line_regexp; @@ -210,6 +211,9 @@ void print_usage(FILE *out) { fprintf(out, " print the version number\n"); fprintf(out, " -q, --quiet\n"); fprintf(out, " do not print information during search\n"); + fprintf(out, " -t, --use-leading-time\n"); + fprintf(out, " use the time stamp from the leading line of each mail and not the Date:\n"); + fprintf(out, " field\n"); fprintf(out, " -p , --db-pattern \n"); fprintf(out, " set the db filename pattern for recursive search\n"); fprintf(out, " -r , --db-root \n"); @@ -249,21 +253,31 @@ int mbox_line_match_search(struct search_condition *condition, int mbox_id, const char *mbox_value) { if(condition->field_id == ID_INTERVAL) { - if(mbox_id == ID_LEADING_LINE) { - const 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)); + const char *c; + time_t t; + struct tm tm; + if(global_use_leading_time) { + if(mbox_id == ID_LEADING_LINE) { + 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 0; + if(mbox_id == ID_DATE) { + strptime(mbox_value, "%a, %d %b %Y %k:%M:%S", &tm); + t = mktime(&tm); + return (t >= condition->interval_start && + (condition->interval_stop == 0 || + t <= condition->interval_stop)); + } else { + return 0; + } } } else { return @@ -568,16 +582,29 @@ void index_mbox(const char *mbox_filename, while(fgets(raw_mbox_line, BUFFER_SIZE, file)) { if(is_a_leading_from_line(raw_mbox_line)) { + /* This starts a new mail */ if(in_header) { fprintf(stderr, "Got a ^\"From \" in the header in %s:%lu.\n", mbox_filename, position_in_file); fprintf(stderr, "%s", raw_mbox_line); } + + /* printf("LEADING_LINE %s", raw_mbox_line); */ + in_header = 1; new_header = 1; } else if(raw_mbox_line[0] == '\n') { - if(in_header) { in_header = 0; } + if(in_header) { + in_header = 0; + /* We leave the header, index the current line */ + if(full_line[0]) { + /* printf("INDEX %s\n", full_line); */ + index_one_mbox_line(nb_fields_to_parse, fields_to_parse, full_line, db_file); + } + end_of_full_line = full_line; + *end_of_full_line = '\0'; + } } if(in_header) { @@ -587,6 +614,7 @@ void index_mbox(const char *mbox_filename, } if(raw_mbox_line[0] == ' ' || raw_mbox_line[0] == '\t') { + /* Continuation of a line */ char *start = raw_mbox_line; while(*start == ' ' || *start == '\t') start++; *(end_of_full_line++) = ' '; @@ -598,17 +626,10 @@ void index_mbox(const char *mbox_filename, } else { - /* - if(!((raw_mbox_line[0] >= 'a' && raw_mbox_line[0] <= 'z') || - (raw_mbox_line[0] >= 'A' && raw_mbox_line[0] <= 'Z'))) { - fprintf(stderr, - "Header line syntax error %s:%lu.\n", - mbox_filename, position_in_file); - fprintf(stderr, "%s", raw_mbox_line); - } - */ + /* Start a new header line, not a continuation */ if(full_line[0]) { + /* printf("INDEX %s\n", full_line); */ index_one_mbox_line(nb_fields_to_parse, fields_to_parse, full_line, db_file); } @@ -676,6 +697,7 @@ static struct option long_options[] = { { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'v' }, { "quiet", no_argument, 0, 'q' }, + { "use-leading-time", no_argument, 0, 't' }, { "db-file-generate", 1, 0, 'd' }, { "db-pattern", 1, 0, 'p' }, { "db-root", 1, 0, 'r' }, @@ -790,6 +812,7 @@ void init_condition(struct search_condition *condition, const char *full_string, } } string = full_string; + if(string[0] == '!') { string++; } } } @@ -846,6 +869,7 @@ int main(int argc, char **argv) { } global_quiet = 0; + global_use_leading_time = 0; default_search_field = 0; strncpy(output_filename, "", PATH_MAX); @@ -870,6 +894,10 @@ int main(int argc, char **argv) { global_quiet = 1; break; + case 't': + global_use_leading_time = 1; + break; + case 'i': action_index = 1; break;