projects
/
mymail.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Starting to convert the ID from strings to integers to speed things up.
[mymail.git]
/
mymail.c
diff --git
a/mymail.c
b/mymail.c
index
a241a86
..
dcb44bf
100644
(file)
--- a/
mymail.c
+++ b/
mymail.c
@@
-51,8
+51,25
@@
#define BUFFER_SIZE 65536
#define BUFFER_SIZE 65536
+enum {
+ ID_MAIL,
+ ID_FROM,
+ ID_DEST,
+ ID_SUBJECT,
+ ID_FROMDEST,
+ MAX_ID
+};
+
+static char *field_names[] = {
+ "mail",
+ "from",
+ "dest",
+ "subj",
+ "fromdest"
+};
+
struct parsable_field {
struct parsable_field {
-
char *name
;
+
int id
;
char *regexp_string;
regex_t regexp;
};
char *regexp_string;
regex_t regexp;
};
@@
-60,8
+77,6
@@
struct parsable_field {
char *db_filename;
char *db_root_path;
char *db_filename;
char *db_root_path;
-int multi_db_files;
-
int paranoid;
int action_index;
int paranoid;
int action_index;
@@
-101,7
+116,7
@@
void print_usage(FILE *out) {
print_version(out);
fprintf(out, "Written by Francois Fleuret <francois@fleuret.org>.\n");
fprintf(out, "\n");
print_version(out);
fprintf(out, "Written by Francois Fleuret <francois@fleuret.org>.\n");
fprintf(out, "\n");
- fprintf(out, "Usage: mymail [options] [<
filename1> [<filename
2> ...]]\n");
+ fprintf(out, "Usage: mymail [options] [<
mbox dir1> [<mbox dir
2> ...]]\n");
fprintf(out, "\n");
fprintf(out, " -h, --help\n");
fprintf(out, " show this help\n");
fprintf(out, "\n");
fprintf(out, " -h, --help\n");
fprintf(out, " show this help\n");
@@
-109,10
+124,12
@@
void print_usage(FILE *out) {
fprintf(out, " print the version number\n");
fprintf(out, " -i, --index\n");
fprintf(out, " index mails\n");
fprintf(out, " print the version number\n");
fprintf(out, " -i, --index\n");
fprintf(out, " index mails\n");
- fprintf(out, " -d <db filename>, --db-file <db filename>\n");
- fprintf(out, " set the data-base file\n");
fprintf(out, " -s <search pattern>, --search <search pattern>\n");
fprintf(out, " search for matching mails in the data-base file\n");
fprintf(out, " -s <search pattern>, --search <search pattern>\n");
fprintf(out, " search for matching mails in the data-base file\n");
+ fprintf(out, " -d <db filename>, --db-file <db filename>\n");
+ fprintf(out, " set the data-base file\n");
+ fprintf(out, " -r <db root path>, --db-root <db root path>\n");
+ fprintf(out, " set the data-base root path for recursive search\n");
}
/*********************************************************************/
}
/*********************************************************************/
@@
-124,26
+141,32
@@
int ignore_entry(const char *name) {
(name[0] == '.' && name[1] != '/');
}
(name[0] == '.' && name[1] != '/');
}
+int mbox_line_match_search(int search_id, regex_t *search_regexp,
+ int mbox_id, char *mbox_value) {
+ return search_id == mbox_id && regexec(search_regexp, mbox_value, 0, 0, 0) == 0;
+}
+
void search_in_db(int nb_search_patterns,
void search_in_db(int nb_search_patterns,
-
char **search_name, char **search_regexp_string
,
+
int *search_ids, char **search_regexp_strings
,
FILE *db_file) {
int hits[MAX_NB_SEARCH_PATTERNS];
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;
FILE *db_file) {
int hits[MAX_NB_SEARCH_PATTERNS];
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 *name, *value;
- regex_t regexp[MAX_NB_SEARCH_PATTERNS];
- int already_written, n;
+ char *mbox_name, *mbox_value;
+ int mbox_id;
+ regex_t search_regexps[MAX_NB_SEARCH_PATTERNS];
+ int already_written, m, n;
for(n = 0; n < nb_search_patterns; n++) {
for(n = 0; n < nb_search_patterns; n++) {
- if(regcomp(&
regexp
[n],
- search_regexp_string[n],
+ if(regcomp(&
search_regexps
[n],
+ search_regexp_string
s
[n],
REG_ICASE)) {
fprintf(stderr,
"mymail: Syntax error in regexp \"%s\" for field \"%s\".\n",
REG_ICASE)) {
fprintf(stderr,
"mymail: Syntax error in regexp \"%s\" for field \"%s\".\n",
- search_regexp_string[n],
-
search_name[n
]);
+ search_regexp_string
s
[n],
+
field_names[search_ids[n]
]);
exit(EXIT_FAILURE);
}
}
exit(EXIT_FAILURE);
}
}
@@
-154,10
+177,10
@@
void search_in_db(int nb_search_patterns,
for(n = 0; n < nb_search_patterns; n++) { hits[n] = 0; }
while(fgets(raw_db_line, BUFFER_SIZE, db_file)) {
for(n = 0; n < nb_search_patterns; n++) { hits[n] = 0; }
while(fgets(raw_db_line, BUFFER_SIZE, db_file)) {
- name = raw_db_line;
- value = segment_next_field(raw_db_line);
+
mbox_
name = raw_db_line;
+
mbox_
value = segment_next_field(raw_db_line);
- if(strcmp("mail", name) == 0) {
+ if(strcmp("mail",
mbox_
name) == 0) {
char *position_in_file_string;
char *mail_filename;
char *position_in_file_string;
char *mail_filename;
@@
-165,12
+188,16
@@
void search_in_db(int nb_search_patterns,
if(n == nb_search_patterns) {
FILE *mail_file;
if(n == nb_search_patterns) {
FILE *mail_file;
+
mail_file = fopen(current_mail_filename, "r");
mail_file = fopen(current_mail_filename, "r");
+
if(!mail_file) {
fprintf(stderr, "mymail: Cannot open mbox '%s'.\n", current_mail_filename);
exit(EXIT_FAILURE);
}
if(!mail_file) {
fprintf(stderr, "mymail: Cannot open mbox '%s'.\n", current_mail_filename);
exit(EXIT_FAILURE);
}
+
fseek(mail_file, current_position_in_mail, SEEK_SET);
fseek(mail_file, current_position_in_mail, SEEK_SET);
+
if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) {
printf("%s", raw_mbox_line);
while(fgets(raw_mbox_line, BUFFER_SIZE, mail_file) &&
if(fgets(raw_mbox_line, BUFFER_SIZE, mail_file)) {
printf("%s", raw_mbox_line);
while(fgets(raw_mbox_line, BUFFER_SIZE, mail_file) &&
@@
-178,13
+205,14
@@
void search_in_db(int nb_search_patterns,
printf("%s", raw_mbox_line);
}
}
printf("%s", raw_mbox_line);
}
}
+
fclose(mail_file);
}
for(n = 0; n < nb_search_patterns; n++) { hits[n] = 0; }
fclose(mail_file);
}
for(n = 0; n < nb_search_patterns; n++) { hits[n] = 0; }
- position_in_file_string = value;
- mail_filename = segment_next_field(value);
+ position_in_file_string =
mbox_
value;
+ mail_filename = segment_next_field(
mbox_
value);
current_position_in_mail = atol(position_in_file_string);
strcpy(current_mail_filename, mail_filename);
current_position_in_mail = atol(position_in_file_string);
strcpy(current_mail_filename, mail_filename);
@@
-193,21
+221,27
@@
void search_in_db(int nb_search_patterns,
}
else {
}
else {
+ mbox_id = -1;
+ for(m = 0; (m < MAX_ID) && mbox_id == -1; m++) {
+ if(strncmp(field_names[m], mbox_name, strlen(mbox_name)) == 0) {
+ mbox_id = m;
+ }
+ }
for(n = 0; n < nb_search_patterns; n++) {
for(n = 0; n < nb_search_patterns; n++) {
- hits[n] |=
-
(strcmp(search_name[n], name) == 0 && regexec(®exp[n], value, 0, 0, 0) == 0
);
+ hits[n] |=
mbox_line_match_search(search_ids[n], &search_regexps[n],
+
mbox_id, mbox_value
);
}
}
}
for(n = 0; n < nb_search_patterns; n++) {
}
}
}
for(n = 0; n < nb_search_patterns; n++) {
- regfree(&
regexp
[n]);
+ regfree(&
search_regexps
[n]);
}
}
void recursive_search_in_db(const char *entry_name,
int nb_search_patterns,
}
}
void recursive_search_in_db(const char *entry_name,
int nb_search_patterns,
-
char **search_name, char **search_regexp_string
) {
+
int *search_ids, char **search_regexp_strings
) {
DIR *dir;
struct dirent *dir_e;
struct stat sb;
DIR *dir;
struct dirent *dir_e;
struct stat sb;
@@
-230,7
+264,7
@@
void recursive_search_in_db(const char *entry_name,
snprintf(subname, PATH_MAX, "%s/%s", entry_name, dir_e->d_name);
recursive_search_in_db(subname,
nb_search_patterns,
snprintf(subname, PATH_MAX, "%s/%s", entry_name, dir_e->d_name);
recursive_search_in_db(subname,
nb_search_patterns,
- search_
name, search_regexp_string
);
+ search_
ids, search_regexp_strings
);
}
}
closedir(dir);
}
}
closedir(dir);
@@
-263,7
+297,7
@@
void recursive_search_in_db(const char *entry_name,
exit(EXIT_FAILURE);
}
exit(EXIT_FAILURE);
}
- search_in_db(nb_search_patterns, search_
name, search_regexp_string
,
+ search_in_db(nb_search_patterns, search_
ids, search_regexp_strings
,
db_file);
fclose(db_file);
db_file);
fclose(db_file);
@@
-280,7
+314,7
@@
void index_one_mbox_line(int nb_fields_to_parse, struct parsable_field *fields_t
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",
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",
- field
s_to_parse[f].name
,
+ field
_names[fields_to_parse[f].id]
,
raw_mbox_line + matches.rm_eo);
}
}
raw_mbox_line + matches.rm_eo);
}
}
@@
-343,13
+377,15
@@
void index_mbox(const char *mbox_filename,
}
else {
}
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); */
- /* } */
+ /*
+ 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);
+ }
+ */
if(full_line[0]) {
index_one_mbox_line(nb_fields_to_parse, fields_to_parse, full_line, db_file);
if(full_line[0]) {
index_one_mbox_line(nb_fields_to_parse, fields_to_parse, full_line, db_file);
@@
-414,28
+450,27
@@
static struct option long_options[] = {
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'v' },
{ "db-file", 1, 0, 'd' },
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'v' },
{ "db-file", 1, 0, 'd' },
- { "db-root", 1, 0, '
p
' },
- { "search
-pattern
", 1, 0, 's' },
+ { "db-root", 1, 0, '
r
' },
+ { "search", 1, 0, 's' },
{ "index", 0, 0, 'i' },
{ "index", 0, 0, 'i' },
- { "multi-db-files", 0, 0, 'm' },
{ 0, 0, 0, 0 }
};
static struct parsable_field fields_to_parse[] = {
{
{ 0, 0, 0, 0 }
};
static struct parsable_field fields_to_parse[] = {
{
-
"from"
,
+
ID_FROM
,
"^\\([Ff][Rr][Oo][Mm]:\\|From\\) *",
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
{
"^\\([Ff][Rr][Oo][Mm]:\\|From\\) *",
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
{
-
"dest"
,
+
ID_DEST
,
"^\\([Tt][Oo]\\|[Cc][Cc]\\|[Bb][Cc][Cc]\\): *",
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
{
"^\\([Tt][Oo]\\|[Cc][Cc]\\|[Bb][Cc][Cc]\\): *",
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
{
-
"subj"
,
+
ID_SUBJECT
,
"^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]: *",
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
"^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]: *",
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
@@
-452,17
+487,20
@@
int main(int argc, char **argv) {
int nb_search_patterns;
char *search_pattern[MAX_NB_SEARCH_PATTERNS];
int nb_search_patterns;
char *search_pattern[MAX_NB_SEARCH_PATTERNS];
+ /* for(f = 0; f < argc; f++) { */
+ /* printf("arg %d \"%s\"\n", f, argv[f]); */
+ /* } */
+
paranoid = 0;
action_index = 0;
db_filename = 0;
db_root_path = 0;
paranoid = 0;
action_index = 0;
db_filename = 0;
db_root_path = 0;
- multi_db_files = 0;
setlocale(LC_ALL, "");
nb_search_patterns = 0;
setlocale(LC_ALL, "");
nb_search_patterns = 0;
- while ((c = getopt_long(argc, argv, "hvi
mp:s:d:p
:",
+ while ((c = getopt_long(argc, argv, "hvi
p:s:d:r
:",
long_options, NULL)) != -1) {
switch(c) {
long_options, NULL)) != -1) {
switch(c) {
@@
-479,15
+517,11
@@
int main(int argc, char **argv) {
action_index = 1;
break;
action_index = 1;
break;
- case 'm':
- multi_db_files = 1;
- break;
-
case 'd':
db_filename = strdup(optarg);
break;
case 'd':
db_filename = strdup(optarg);
break;
- case '
p
':
+ case '
r
':
db_root_path = strdup(optarg);
break;
db_root_path = strdup(optarg);
break;
@@
-509,11
+543,7
@@
int main(int argc, char **argv) {
char *default_db_filename = getenv("MYMAIL_DB_FILE");
if(!default_db_filename) {
char *default_db_filename = getenv("MYMAIL_DB_FILE");
if(!default_db_filename) {
- if(multi_db_files) {
- default_db_filename = "mymail.db";
- } else {
- default_db_filename = "/tmp/mymail.db";
- }
+ default_db_filename = "mymail.db";
}
db_filename = strdup(default_db_filename);
}
db_filename = strdup(default_db_filename);
@@
-522,17
+552,18
@@
int main(int argc, char **argv) {
if(!db_root_path) {
char *default_db_root_path = getenv("MYMAIL_DB_ROOT");
if(!db_root_path) {
char *default_db_root_path = getenv("MYMAIL_DB_ROOT");
- if(!default_db_root_path) {
- if(multi_db_files) {
- default_db_root_path = "mymail.db";
- } else {
- default_db_root_path = "/tmp/mymail.db";
- }
+ if(default_db_root_path) {
+ db_root_path = strdup(default_db_root_path);
}
}
+ }
- db_root_path = strdup(default_db_root_path);
+ if(!db_root_path) {
+ fprintf(stderr,
+ "mymail: db root path is not set\n");
+ exit(EXIT_FAILURE);
}
}
+
if(error) {
print_usage(stderr);
exit(EXIT_FAILURE);
if(error) {
print_usage(stderr);
exit(EXIT_FAILURE);
@@
-563,7
+594,7
@@
int main(int argc, char **argv) {
fprintf(stderr,
"mymail: Syntax error in regexp \"%s\" for field \"%s\".\n",
fields_to_parse[f].regexp_string,
fprintf(stderr,
"mymail: Syntax error in regexp \"%s\" for field \"%s\".\n",
fields_to_parse[f].regexp_string,
- field
s_to_parse[f].name
);
+ field
_names[fields_to_parse[f].id]
);
exit(EXIT_FAILURE);
}
}
exit(EXIT_FAILURE);
}
}
@@
-587,23
+618,28
@@
int main(int argc, char **argv) {
else {
if(nb_search_patterns > 0) {
else {
if(nb_search_patterns > 0) {
-
char *search_name
[MAX_NB_SEARCH_PATTERNS];
- char *search_regexp_string[MAX_NB_SEARCH_PATTERNS];
- int n;
+
int search_ids
[MAX_NB_SEARCH_PATTERNS];
+ char *search_regexp_string
s
[MAX_NB_SEARCH_PATTERNS];
+ int
m,
n;
for(n = 0; n < nb_search_patterns; n++) {
for(n = 0; n < nb_search_patterns; n++) {
- search_name[n] = search_pattern[n];
- search_regexp_string[n] = segment_next_field(search_pattern[n]);
+ search_regexp_strings[n] = segment_next_field(search_pattern[n]);
+ search_ids[n] = -1;
+ for(m = 0; (m < MAX_ID) && search_ids[n] == -1; m++) {
+ if(strncmp(field_names[m], search_pattern[n], strlen(search_pattern[n])) == 0) {
+ search_ids[n] = m;
+ }
+ }
}
}
- if(!*search_regexp_string) {
+ if(!*search_regexp_string
s
) {
fprintf(stderr,
"Syntax error in the search pattern.\n");
exit(EXIT_FAILURE);
}
recursive_search_in_db(db_root_path,
fprintf(stderr,
"Syntax error in the search pattern.\n");
exit(EXIT_FAILURE);
}
recursive_search_in_db(db_root_path,
- nb_search_patterns, search_
name, search_regexp_string
);
+ nb_search_patterns, search_
ids, search_regexp_strings
);
for(n = 0; n < nb_search_patterns; n++) {
free(search_pattern[n]);
for(n = 0; n < nb_search_patterns; n++) {
free(search_pattern[n]);