Added "2weeks" as a criterion.
[mymail.git] / mymail.c
index 347f2a4..8c211f0 100644 (file)
--- a/mymail.c
+++ b/mymail.c
 
 /*
 
-  This command is a dumb mail indexer. It can either (1) scan
-  directories containing mbox files, and create a db file containing
-  for each mail a list of fields computed from the header, or (2)
-  read such a db file and get all the mails matching regexp-defined
-  conditions on the fields, to create a resulting mbox file.
+  mymail is a simple mail indexer. It can:
+
+  (1) scan mbox files, and create a db file containing for each mail a
+      list of fields computed from its header.
+
+  (2) read such a db file, gets all the mails matching regexp-defined
+      conditions on the fields, and generates a resulting mbox file.
 
   It is low-tech, simple, light and fast.
 
@@ -84,6 +86,9 @@ enum {
   ID_PARTICIPANT,
   ID_BODY,
   ID_TIME_INTERVAL,
+  ID_MAIL_ID,
+  ID_REFERENCE_ID,
+  ID_THREAD_ID,
   MAX_ID
 };
 
@@ -96,7 +101,10 @@ static char *field_keys[] = {
   "date",
   "part",
   "body",
-  "interval"
+  "interval",
+  "mailid",
+  "reference",
+  "thread"
 };
 
 /********************************************************************/
@@ -153,6 +161,20 @@ static struct parsable_field fields_to_parse[] = {
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
   },
 
+  {
+    ID_MAIL_ID,
+    REG_ICASE,
+    "^message-id: ",
+    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+  },
+
+  {
+    ID_REFERENCE_ID,
+    REG_ICASE,
+    "^\\(in-reply-to\\|references\\): ",
+    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+  },
+
 };
 
 /********************************************************************/
@@ -293,6 +315,10 @@ int db_line_match_search(struct search_condition *condition,
 
      (condition->db_key == ID_FROM && db_key == ID_LEADING_LINE)
 
+     ||
+
+     (condition->db_key == ID_THREAD_ID && (db_key == ID_MAIL_ID ||
+                                            db_key == ID_REFERENCE_ID))
      )
 
     &&
@@ -506,6 +532,12 @@ int search_in_db(const char *db_filename,
 
   while(nb_extracted_mails < global_nb_mails_max &&
         fgets(raw_db_line, BUFFER_SIZE, db_file)) {
+
+    /* Removes the CR */
+    char *s = raw_db_line;
+    while(*s && *s != '\n') { s++; }
+    *s = '\0';
+
     db_value = parse_token(db_key_string, TOKEN_BUFFER_SIZE, ' ', raw_db_line);
 
     if(strcmp("mail", db_key_string) == 0) {
@@ -521,7 +553,7 @@ int search_in_db(const char *db_filename,
 
       for(n = 0; n < nb_search_conditions; n++) { hits[n] = 0; }
       db_value = parse_token(position_in_file_string, TOKEN_BUFFER_SIZE, ' ', db_value);
-      db_value = parse_token(current_mail_filename, PATH_MAX+1, '\n', db_value);
+      strncpy(current_mail_filename, db_value, PATH_MAX + 1);
       current_position_in_mail = atol(position_in_file_string);
     }
 
@@ -795,6 +827,7 @@ static struct time_criterion time_criteria[] = {
   { "24h",       0, 24,       -1, -1 },
   { "48h",       0, 48,       -1, -1 },
   { "week",      0, 24 *   7, -1, -1 },
+  { "2weeks",    0, 24 *  14, -1, -1 },
   { "month",     0, 24 *  31, -1, -1 },
   { "trimester", 0, 24 *  92, -1, -1 },
   { "year",      0, 24 * 365, -1, -1 },
@@ -1146,6 +1179,16 @@ int main(int argc, char **argv) {
     }
   }
 
+  if(error) {
+    print_usage(stderr);
+    exit(EXIT_FAILURE);
+  }
+
+  if(show_help) {
+    print_usage(stdout);
+    exit(EXIT_SUCCESS);
+  }
+
   /* Set all the values that may defined in the arguments, through
      environment variables, or hard-coded */
 
@@ -1169,18 +1212,6 @@ int main(int argc, char **argv) {
                                               "MYMAIL_MBOX_PATTERN",
                                               0);
 
-  /* Start the processing */
-
-  if(error) {
-    print_usage(stderr);
-    exit(EXIT_FAILURE);
-  }
-
-  if(show_help) {
-    print_usage(stdout);
-    exit(EXIT_SUCCESS);
-  }
-
   /* mbox indexing */
 
   if(action_index) {