about summary refs log tree commit diff
path: root/magrep.c
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2016-08-02 15:50:30 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2016-08-02 15:50:30 +0200
commit612d1564cc5bb9a3af890ceecc2652ccc0ae4197 (patch)
tree51edfb5df0e1ac0234099f92b574a58eab74b5e2 /magrep.c
parent18c6351b00401bd7d21fd7525bfdb396c4cd744d (diff)
downloadmblaze-612d1564cc5bb9a3af890ceecc2652ccc0ae4197.tar.gz
mblaze-612d1564cc5bb9a3af890ceecc2652ccc0ae4197.tar.xz
mblaze-612d1564cc5bb9a3af890ceecc2652ccc0ae4197.zip
add magrep
Diffstat (limited to 'magrep.c')
-rw-r--r--magrep.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/magrep.c b/magrep.c
new file mode 100644
index 0000000..7b6a7a4
--- /dev/null
+++ b/magrep.c
@@ -0,0 +1,116 @@
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "blaze822.h"
+
+static int aflag;
+static int cflag;
+static int dflag;
+static int iflag;
+static int qflag;
+static int vflag;
+static long matches;
+
+static regex_t pattern;
+static char *header;
+
+int
+match(char *file, char *s)
+{
+	if (vflag ^ (regexec(&pattern, s, 0, 0, 0) == 0)) {
+		if (qflag)
+			exit(0);
+		if (!cflag)
+			printf("%s\n", file);
+		matches++;
+		return 1;
+	}
+
+	return 0;
+}
+
+void
+magrep(char *file)
+{
+	char *filename = file;
+	while (*filename == ' ' || *filename == '\t')
+                filename++;
+
+	struct message *msg = blaze822(filename);
+	if (!msg)
+		return;
+
+	char *v = blaze822_chdr(msg, header);
+	if (v) {
+		if (dflag) {
+			char d[4096];
+			blaze822_decode_rfc2047(d, v, sizeof d, "UTF-8");
+			match(file, d);
+		} else if (aflag) {
+			char *disp, *addr;
+                        while ((v = blaze822_addr(v, &disp, &addr))) {
+				if (addr && match(file, addr))
+					break;
+			}
+		} else {
+			match(file, v);
+		}
+	}
+
+	blaze822_free(msg);
+}
+
+int
+main(int argc, char *argv[])
+{
+	int c;
+	while ((c = getopt(argc, argv, "acdiqv")) != -1)
+		switch(c) {
+                case 'a': aflag = 1; break;
+                case 'c': cflag = 1; break;
+                case 'd': dflag = 1; break;
+                case 'i': iflag = REG_ICASE; break;
+                case 'q': qflag = 1; break;
+                case 'v': vflag = 1; break;
+		default:
+		usage:
+			fprintf(stderr,
+"Usage: magrep [-c|-q] [-v] [-i] [-a|-d] header:regex [msgs...]\n");
+			exit(2);
+		}
+
+	if (argc == optind)
+		goto usage;
+	header = argv[optind++];
+
+	char *rx = strchr(header, ':');
+	if (!rx)
+		goto usage;
+
+	*rx++ = 0;
+	int r = regcomp(&pattern, rx, REG_EXTENDED | iflag);
+	if (r != 0) {
+		char buf[256];
+		regerror(r, &pattern, buf, sizeof buf);
+		fprintf(stderr, "magrep: regex error: %s\n", buf);
+		exit(2);
+	}
+
+	if (argc == optind && isatty(0))
+		blaze822_loop1(":", magrep);
+	else
+		blaze822_loop(argc-optind, argv+optind, magrep);
+	
+	if (cflag)
+		printf("%ld\n", matches);
+
+	return !matches;
+}