Cosmetics.
[mymail.git] / mymail.c
index b890b4b..54febff 100644 (file)
--- a/mymail.c
+++ b/mymail.c
@@ -101,6 +101,7 @@ struct search_condition {
 
 struct parsable_field {
   int id;
+  int cflags;
   char *regexp_string;
   regex_t regexp;
 };
@@ -108,31 +109,36 @@ struct parsable_field {
 static struct parsable_field fields_to_parse[] = {
   {
     ID_LEADING_LINE,
+    0,
     "^From ",
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
   },
 
   {
     ID_FROM,
-    "^\\([Ff][Rr][Oo][Mm]:\\|[Rr][Ee][Pp][Ll][Yy]-[Tt][Oo]:\\|[Ss][Ee][Nn][Dd][Ee][Rr]:\\)",
+    REG_ICASE,
+    "^\\(from\\|reply-to\\|sender\\|return-path\\): ",
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
   },
 
   {
     ID_TO,
-    "^\\([Tt][Oo]\\|[Cc][Cc]\\|[Bb][Cc][Cc]\\): ",
+    REG_ICASE,
+    "^\\(to\\|cc\\|bcc\\): ",
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
   },
 
   {
     ID_SUBJECT,
-    "^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]: ",
+    REG_ICASE,
+    "^subject: ",
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
   },
 
   {
     ID_DATE,
-    "^[Dd][Aa][Tt][Ee]: ",
+    REG_ICASE,
+    "^date: ",
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
   },
 
@@ -156,11 +162,6 @@ char *parse_token(char *token_buffer, size_t token_buffer_size,
   return string;
 }
 
-void remove_eof(char *c) {
-  while(*c && *c != '\n' && *c != '\r') c++;
-  *c = '\0';
-}
-
 /********************************************************************/
 
 /* malloc with error checking.  */
@@ -286,7 +287,9 @@ int mbox_line_match_search(struct search_condition *condition,
        (condition->field_id == ID_FROM && mbox_id == ID_LEADING_LINE)
 
        )
+
       &&
+
       regexec(&condition->regexp, mbox_value, 0, 0, 0) == 0;
   }
 }
@@ -342,6 +345,39 @@ void update_body_hits(char *mail_filename, int position_in_mail,
   fclose(mail_file);
 }
 
+void write_mail(const char *mail_filename, unsigned long int position_in_mail,
+                FILE *output_file) {
+  char raw_mbox_line[BUFFER_SIZE];
+  int last_mbox_line_was_empty;
+  FILE *mail_file;
+
+  mail_file = fopen(mail_filename, "r");
+
+  if(!mail_file) {
+    fprintf(stderr,
+            "mymail: Cannot open mbox '%s' for mail extraction.\n",
+            mail_filename);
+    exit(EXIT_FAILURE);
+  }
+
+  fseek(mail_file, position_in_mail, SEEK_SET);
+
+  if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) {
+    last_mbox_line_was_empty = 0;
+    fprintf(output_file, "%s", raw_mbox_line);
+    while(1) {
+      if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) ||
+         (is_a_leading_from_line(last_mbox_line_was_empty, raw_mbox_line))
+         )
+        break;
+      last_mbox_line_was_empty = (raw_mbox_line[0] == '\n');
+      fprintf(output_file, "%s", raw_mbox_line);
+    }
+  }
+
+  fclose(mail_file);
+}
+
 void search_in_db(const char *db_filename,
                   int nb_search_conditions,
                   struct search_condition *search_conditions,
@@ -349,13 +385,11 @@ void search_in_db(const char *db_filename,
 
   int hits[MAX_NB_SEARCH_CONDITIONS];
   char raw_db_line[BUFFER_SIZE];
-  char raw_mbox_line[BUFFER_SIZE];
   char current_mail_filename[PATH_MAX + 1];
   unsigned long int current_position_in_mail;
   char mbox_name[TOKEN_BUFFER_SIZE], *mbox_value;
   int mbox_id;
   int already_written, m, n;
-  int last_mbox_line_was_empty;
   int nb_body_conditions, nb_fulfilled_body_conditions;
   FILE *db_file;
 
@@ -374,6 +408,8 @@ void search_in_db(const char *db_filename,
     exit(EXIT_FAILURE);
   }
 
+  /* First, check the db file leading line integrity */
+
   if(fgets(raw_db_line, BUFFER_SIZE, db_file)) {
     if(strncmp(raw_db_line, MYMAIL_DB_MAGIC_TOKEN, strlen(MYMAIL_DB_MAGIC_TOKEN))) {
       fprintf(stderr,
@@ -388,6 +424,8 @@ void search_in_db(const char *db_filename,
     exit(EXIT_FAILURE);
   }
 
+  /* Then parse the said db file */
+
   current_position_in_mail = 0;
   already_written = 0;
 
@@ -418,8 +456,7 @@ void search_in_db(const char *db_filename,
 
         if(n == nb_search_conditions) {
 
-          /* all conditions but the body ones are fine, check the body
-             ones */
+          /* Now check the body ones */
 
           if(nb_body_conditions > 0) {
             update_body_hits(current_mail_filename, current_position_in_mail,
@@ -438,33 +475,7 @@ void search_in_db(const char *db_filename,
           }
 
           if(nb_body_conditions == nb_fulfilled_body_conditions) {
-            FILE *mail_file;
-
-            mail_file = fopen(current_mail_filename, "r");
-
-            if(!mail_file) {
-              fprintf(stderr,
-                      "mymail: Cannot open mbox '%s' for mail extraction.\n",
-                      current_mail_filename);
-              exit(EXIT_FAILURE);
-            }
-
-            fseek(mail_file, current_position_in_mail, SEEK_SET);
-
-            if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) {
-              last_mbox_line_was_empty = 0;
-              fprintf(output_file, "%s", raw_mbox_line);
-              while(1) {
-                if(!fgets(raw_mbox_line, BUFFER_SIZE, mail_file) ||
-                   (is_a_leading_from_line(last_mbox_line_was_empty, raw_mbox_line))
-                   )
-                  break;
-                last_mbox_line_was_empty = (raw_mbox_line[0] == '\n');
-                fprintf(output_file, "%s", raw_mbox_line);
-              }
-            }
-
-            fclose(mail_file);
+            write_mail(current_mail_filename, current_position_in_mail, output_file);
           }
         }
       }
@@ -472,9 +483,8 @@ void search_in_db(const char *db_filename,
       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, ' ', mbox_value);
+      mbox_value = parse_token(current_mail_filename, TOKEN_BUFFER_SIZE, '\n', mbox_value);
       current_position_in_mail = atol(position_in_file_string);
-      remove_eof(current_mail_filename);
       already_written = 0;
     }
 
@@ -725,6 +735,13 @@ void init_condition(struct search_condition *condition, char *full_string) {
     condition->interval_stop = 0;
   }
 
+  else if(strcmp(search_field, "24h") == 0 ||
+          strcmp(search_field, "today") == 0) {
+    condition->field_id = ID_INTERVAL;
+    condition->interval_start = time(0) - 3600 * 24;
+    condition->interval_stop = 0;
+  }
+
   else if(strcmp(search_field, "week") == 0) {
     condition->field_id = ID_INTERVAL;
     condition->interval_start = time(0) - 3600 * 24 * 7;
@@ -737,10 +754,9 @@ void init_condition(struct search_condition *condition, char *full_string) {
     condition->interval_stop = 0;
   }
 
-  else if(strcmp(search_field, "24h") == 0 ||
-          strcmp(search_field, "today") == 0) {
+  else if(strcmp(search_field, "year") == 0) {
     condition->field_id = ID_INTERVAL;
-    condition->interval_start = time(0) - 3600 * 24;
+    condition->interval_start = time(0) - 3600 * 24 * 365;
     condition->interval_stop = 0;
   }
 
@@ -1022,7 +1038,7 @@ int main(int argc, char **argv) {
     for(f = 0; f < nb_fields_to_parse; f++) {
       if(regcomp(&fields_to_parse[f].regexp,
                  fields_to_parse[f].regexp_string,
-                 REG_ICASE)) {
+                 fields_to_parse[f].cflags)) {
         fprintf(stderr,
                 "mymail: Syntax error in regexp \"%s\" for field \"%s\".\n",
                 fields_to_parse[f].regexp_string,