+struct search_condition {
+ int field_id;
+ int negation;
+ regex_t regexp;
+ time_t interval_start, interval_stop;
+};
+
+/********************************************************************/
+
+struct parsable_field {
+ int id;
+ char *regexp_string;
+ regex_t regexp;
+};
+
+static struct parsable_field fields_to_parse[] = {
+ {
+ ID_LEADING_LINE,
+ "^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]:\\)",
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ },
+
+ {
+ ID_TO,
+ "^\\([Tt][Oo]\\|[Cc][Cc]\\|[Bb][Cc][Cc]\\): ",
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ },
+
+ {
+ ID_SUBJECT,
+ "^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]: ",
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ },
+
+ {
+ ID_DATE,
+ "^[Dd][Aa][Tt][Ee]: ",
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ },
+
+};
+
+/********************************************************************/
+
+int xor(int a, int b) {
+ return (a && !b) || (!a && b);
+}
+
+char *parse_token(char *token_buffer, size_t token_buffer_size,
+ char separator, char *string) {
+ char *u = token_buffer;
+ while(u < token_buffer + token_buffer_size - 1 && *string &&
+ *string != separator) {
+ *(u++) = *(string++);
+ }
+ while(*string == separator) string++;
+ *u = '\0';
+ return string;