From dc9e1fb7f31e28f33795d806f97018bb8802602f Mon Sep 17 00:00:00 2001 From: Christian Neukirchen Date: Wed, 20 Jul 2016 13:50:53 +0200 Subject: mscan: rename from scan --- mscan.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 mscan.c (limited to 'mscan.c') diff --git a/mscan.c b/mscan.c new file mode 100644 index 0000000..d962d33 --- /dev/null +++ b/mscan.c @@ -0,0 +1,164 @@ +#define _GNU_SOURCE + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "blaze822.h" + +wchar_t replacement = '?'; + +void +u8putstr(FILE *out, char *s, size_t l, int pad) +{ + while (*s && l) { + if (*s >= 32 && *s < 127) { + putc(*s, out); + s++; + l--; + } else { + wchar_t wc; + int r = mbtowc(&wc, s, 4); + if (r < 0) { + r = 1; + wc = replacement; + } + s += r; + fprintf(out, "%lc", wc); + l -= wcwidth(wc); + } + } + if (pad) + while (l-- > 0) + putc(' ', out); +} + +static char *cur; + +void +oneline(char *file) +{ + int indent = 0; + while (*file == ' ' || *file == '\t') { + indent++; + file++; + } + indent *= 2; + + char *e = file + strlen(file) - 1; + while (file < e && (*e == ' ' || *e == '\t')) + *e-- = 0; + + struct message *msg = blaze822(file); + if (!msg) { + int p = 80-38-3-indent; + printf("%*.*s\\_ %*.*s\n", -38 - indent, 38 + indent, "", + -p, p, file); + return; + } + + char flag1, flag2; + + char *f = strstr(file, ":2,"); + if (!f) + f = ""; + + if (strcmp(cur, file) == 0) + flag1 = '>'; + else if (!strchr(f, 'S')) + flag1 = '.'; + else if (strchr(f, 'T')) + flag1 = 'x'; + else + flag1 = ' '; + + if (strchr(f, 'F')) + flag2 = '*'; + else if (strchr(f, 'R')) + flag2 = '-'; + else + flag2 = ' '; + + char date[16]; + char *v; + + if ((v = blaze822_hdr(msg, "date"))) { + time_t t = blaze822_date(v); + if (t != -1) { + struct tm *tm; + tm = localtime(&t); + strftime(date, sizeof date, "%Y-%m-%d", tm); + } else { + strcpy(date, "(invalid)"); + } + } else { + strcpy(date, "(unknown)"); + // mtime perhaps? + } + + + char *from = "(unknown)"; + if ((v = blaze822_hdr(msg, "from"))) { + char *disp, *addr; + blaze822_addr(v, &disp, &addr); + if (*disp) + from = disp; + else if (*addr) + from = addr; + else + from = "(unknown)"; + } + + char fromdec[17]; + blaze822_decode_rfc2047(fromdec, from, sizeof fromdec - 1, "UTF-8"); + fromdec[sizeof fromdec - 1] = 0; + + char *subj = "(no subject)"; + char subjdec[100]; + if ((v = blaze822_hdr(msg, "subject"))) { + subj = v; + } + blaze822_decode_rfc2047(subjdec, subj, sizeof subjdec - 1, "UTF-8"); + + long lineno = blaze822_seq_find(file); + if (lineno) + printf("%c%c %-3ld %-10s ", flag1, flag2, lineno, date); + else + printf("%c%c %-10s ", flag1, flag2, date); + u8putstr(stdout, fromdec, 17, 1); + printf(" "); + int z; + for (z = 0; z < indent; z++) + printf(" "); + u8putstr(stdout, subjdec, 80-38-indent, 0); + printf("\n"); + + blaze822_free(msg); +} + +int +main(int argc, char *argv[]) +{ + setlocale(LC_ALL, ""); // for wcwidth later + if (wcwidth(0xFFFD) > 0) + replacement = 0xFFFD; + + char *seqmap = blaze822_seq_open(0); + blaze822_seq_load(seqmap); + cur = blaze822_seq_cur(); + + int i = blaze822_loop(argc-1, argv+1, oneline); + + fprintf(stderr, "%d mails scanned\n", i); + + return 0; +} -- cgit 1.4.1