/*********************************************************************/
-time_t time_for_past_day(int day) {
- time_t t;
- struct tm *tm;
- int delta_day;
- t = time(0);
- tm = localtime(&t);
- delta_day = (7 + tm->tm_wday - day) % 7 + 1;
- return t - delta_day * 3600 * 24 + tm->tm_sec + 60 * tm->tm_min + 3600 * tm->tm_hour;
-}
-
-/*********************************************************************/
-
int ignore_entry(const char *name) {
return
strcmp(name, ".") == 0 ||
/*********************************************************************/
-void index_one_mbox_line(int nb_fields_to_parse, struct parsable_field *fields_to_parse,
+void index_one_mbox_line(unsigned int nb_fields_to_parse,
+ struct parsable_field *fields_to_parse,
char *raw_mbox_line, FILE *db_file) {
regmatch_t matches;
- int f;
+ unsigned int f;
for(f = 0; f < nb_fields_to_parse; f++) {
if(regexec(&fields_to_parse[f].regexp, raw_mbox_line, 1, &matches, 0) == 0) {
fprintf(db_file, "%s %s\n",
{ 0, 0, 0, 0 }
};
+struct time_criterion {
+ char *label;
+ int start_hour, end_hour;
+ int past_week_day;
+};
+
+/*********************************************************************/
+
+static struct time_criterion time_criteria[] = {
+
+ { "8h", 8, -1, -1 },
+ { "today", 24, -1, -1 },
+ { "24h", 24, -1, -1 },
+ { "week", 24 * 7, -1, -1 },
+ { "month", 24 * 31, -1, -1 },
+ { "year", 24 * 365, -1, -1 },
+
+ { "yesterday", 48, 24, -1 },
+
+ { "monday", -1, -1, 1 },
+ { "tuesday", -1, -1, 2 },
+ { "wednesday", -1, -1, 3 },
+ { "thursday", -1, -1, 4 },
+ { "friday", -1, -1, 5 },
+ { "saturday", -1, -1, 6 },
+ { "sunday", -1, -1, 7 },
+
+};
+
/*********************************************************************/
+time_t time_for_past_day(int day) {
+ time_t t;
+ struct tm *tm;
+ int delta_day;
+ t = time(0);
+ tm = localtime(&t);
+ delta_day = (7 + tm->tm_wday - day) % 7;
+ if(delta_day == 0) { delta_day = 7; }
+ return t - (delta_day * 3600 * 24 + tm->tm_sec + 60 * tm->tm_min + 3600 * tm->tm_hour);
+}
+
void init_condition(struct search_condition *condition, const char *full_string,
const char *default_search_field) {
char full_search_field[TOKEN_BUFFER_SIZE], *search_field;
- int m;
+ unsigned int k, m;
const char *string;
string = parse_token(full_search_field, TOKEN_BUFFER_SIZE, ' ', full_string);
condition->negation = 0;
}
- /* Recently */
-
- if(strcmp(search_field, "8h") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time(0) - 3600 * 8;
- condition->interval_stop = 0;
- }
+ condition->field_id = -1;
- 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;
- condition->interval_stop = 0;
- }
-
- else if(strcmp(search_field, "month") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time(0) - 3600 * 24 * 31;
- condition->interval_stop = 0;
- }
-
- else if(strcmp(search_field, "year") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time(0) - 3600 * 24 * 365;
- condition->interval_stop = 0;
- }
-
- /* Yesterday */
-
- else if(strcmp(search_field, "yesterday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time(0) - 2 * 3600 * 24;
- condition->interval_stop = condition->interval_start + 3600 * 24;
- }
-
- /* Week days */
-
- else if(strcmp(search_field, "monday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time_for_past_day(1);
- condition->interval_stop = condition->interval_start + 3600 * 24;
- }
-
- else if(strcmp(search_field, "tuesday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time_for_past_day(2);
- condition->interval_stop = condition->interval_start + 3600 * 24;
- }
-
- else if(strcmp(search_field, "wednesday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time_for_past_day(3);
- condition->interval_stop = condition->interval_start + 3600 * 24;
- }
-
- else if(strcmp(search_field, "thursday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time_for_past_day(4);
- condition->interval_stop = condition->interval_start + 3600 * 24;
- }
-
- else if(strcmp(search_field, "friday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time_for_past_day(5);
- condition->interval_stop = condition->interval_start + 3600 * 24;
- }
-
- else if(strcmp(search_field, "saturday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time_for_past_day(6);
- condition->interval_stop = condition->interval_start + 3600 * 24;
- }
+ /* Recently */
- else if(strcmp(search_field, "sunday") == 0) {
- condition->field_id = ID_INTERVAL;
- condition->interval_start = time_for_past_day(7);
- condition->interval_stop = condition->interval_start + 3600 * 24;
+ for(k = 0; k < sizeof(time_criteria) / sizeof(struct time_criterion); k++) {
+ if(strcmp(time_criteria[k].label, search_field) == 0) {
+ condition->field_id = ID_INTERVAL;
+ if(time_criteria[k].past_week_day < 0) {
+ condition->interval_start = time(0) - 3600 * time_criteria[k].start_hour;
+ if(time_criteria[k].end_hour >= 0) {
+ condition->interval_stop = time(0) - 3600 * time_criteria[k].end_hour;
+ } else {
+ condition->interval_stop = 0;
+ }
+ } else {
+ condition->interval_start = time_for_past_day(time_criteria[k].past_week_day);
+ condition->interval_stop = condition->interval_start + 3600 * 24;
+ }
+ break;
+ }
}
- else {
-
- /* header-related conditions */
+ if(condition->field_id == -1) {
- condition->field_id = -1;
+ /* No time condition matched, look for the search fields */
for(m = 0; (m < MAX_ID) && condition->field_id == -1; m++) {
if(strncmp(field_names[m], search_field, strlen(search_field)) == 0) {
}
}
+ /* None match, if there is a default search field, re-run the search with it */
+
if(condition->field_id == -1) {
if(default_search_field) {
for(m = 0; (m < MAX_ID) && condition->field_id == -1; m++) {
char output_filename[PATH_MAX + 1];
int action_index = 0;
int error = 0, show_help = 0;
- const int nb_fields_to_parse = sizeof(fields_to_parse) / sizeof(struct parsable_field);
+ const unsigned int nb_fields_to_parse =
+ sizeof(fields_to_parse) / sizeof(struct parsable_field);
char c;
- int f, n;
- int nb_search_conditions;
+ unsigned int f, n;
+ 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)) {