Added the --use-leading-time option.
[mymail.git] / mymail.c
index 3d835a7..e078bf6 100644 (file)
--- 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 filename pattern>, --db-pattern <db filename pattern>\n");
   fprintf(out, "         set the db filename pattern for recursive search\n");
   fprintf(out, " -r <db root path>, --db-root <db root path>\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;