Fixed a bug indexing the last header line of a mail in the next one.
[mymail.git] / mymail.c
index 50e5ba5..87c23a3 100644 (file)
--- a/mymail.c
+++ b/mymail.c
@@ -57,9 +57,9 @@
 
 /* Global variables! */
 
-int quiet;
+int global_quiet;
 
-regex_t leading_from_line_regexp;
+regex_t global_leading_from_line_regexp;
 
 /********************************************************************/
 
@@ -242,7 +242,7 @@ int ignore_entry(const char *name) {
 int is_a_leading_from_line(char *mbox_line) {
   return
     strncmp(mbox_line, "From ", 5) == 0 &&
-    regexec(&leading_from_line_regexp, mbox_line, 0, 0, 0) == 0;
+    regexec(&global_leading_from_line_regexp, mbox_line, 0, 0, 0) == 0;
 }
 
 int mbox_line_match_search(struct search_condition *condition,
@@ -373,7 +373,7 @@ int search_in_db(const char *db_filename,
 
   nb_extracted_mails = 0;
 
-  if(!quiet) {
+  if(!global_quiet) {
     printf("Searching in '%s' ... ", db_filename);
     fflush(stdout);
   }
@@ -477,7 +477,7 @@ int search_in_db(const char *db_filename,
 
   fclose(db_file);
 
-  if(!quiet) {
+  if(!global_quiet) {
     printf("done.\n");
     fflush(stdout);
   }
@@ -568,16 +568,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 +600,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 +612,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);
         }
 
@@ -790,6 +797,7 @@ void init_condition(struct search_condition *condition, const char *full_string,
           }
         }
         string = full_string;
+        if(string[0] == '!') { string++; }
       }
     }
 
@@ -839,13 +847,13 @@ int main(int argc, char **argv) {
   unsigned int nb_search_conditions;
   struct search_condition search_conditions[MAX_NB_SEARCH_CONDITIONS];
 
-  if(regcomp(&leading_from_line_regexp, LEADING_FROM_LINE_REGEXP_STRING, 0)) {
+  if(regcomp(&global_leading_from_line_regexp, LEADING_FROM_LINE_REGEXP_STRING, 0)) {
     fprintf(stderr,
             "mymail: Cannot compile leading \"from\" line regexp. That is strange.\n");
     exit(EXIT_FAILURE);
   }
 
-  quiet = 0;
+  global_quiet = 0;
   default_search_field = 0;
   strncpy(output_filename, "", PATH_MAX);
 
@@ -867,7 +875,7 @@ int main(int argc, char **argv) {
       break;
 
     case 'q':
-      quiet = 1;
+      global_quiet = 1;
       break;
 
     case 'i':
@@ -1039,7 +1047,7 @@ int main(int argc, char **argv) {
       output_file = safe_fopen(output_filename, "w", "result mbox");
     } else {
       output_file = stdout;
-      quiet = 1;
+      global_quiet = 1;
     }
 
     if(nb_search_conditions > 0) {
@@ -1091,7 +1099,7 @@ int main(int argc, char **argv) {
       }
     }
 
-    if(!quiet) {
+    if(!global_quiet) {
       if(nb_extracted_mails > 0) {
         printf("Found %d matching mails.\n", nb_extracted_mails);
       } else {
@@ -1116,7 +1124,7 @@ int main(int argc, char **argv) {
   free(db_filename_list);
   free(mbox_filename_regexp_string);
 
-  regfree(&leading_from_line_regexp);
+  regfree(&global_leading_from_line_regexp);
 
   exit(EXIT_SUCCESS);
 }