summaryrefslogtreecommitdiff
path: root/tools/mailinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/mailinfo.c')
-rw-r--r--tools/mailinfo.c268
1 files changed, 0 insertions, 268 deletions
diff --git a/tools/mailinfo.c b/tools/mailinfo.c
deleted file mode 100644
index fb2ea2b70b..0000000000
--- a/tools/mailinfo.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Another stupid program, this one parsing the headers of an
- * email to figure out authorship and subject
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-static FILE *cmitmsg, *patchfile;
-
-static char line[1000];
-static char date[1000];
-static char name[1000];
-static char email[1000];
-static char subject[1000];
-
-static char *sanity_check(char *name, char *email)
-{
- int len = strlen(name);
- if (len < 3 || len > 60)
- return email;
- if (strchr(name, '@') || strchr(name, '<') || strchr(name, '>'))
- return email;
- return name;
-}
-
-static int handle_from(char *line)
-{
- char *at = strchr(line, '@');
- char *dst;
-
- if (!at)
- return 0;
-
- /*
- * If we already have one email, don't take any confusing lines
- */
- if (*email && strchr(at+1, '@'))
- return 0;
-
- while (at > line) {
- char c = at[-1];
- if (isspace(c) || c == '<')
- break;
- at--;
- }
- dst = email;
- for (;;) {
- unsigned char c = *at;
- if (!c || c == '>' || isspace(c))
- break;
- *at++ = ' ';
- *dst++ = c;
- }
- *dst++ = 0;
-
- at = line + strlen(line);
- while (at > line) {
- unsigned char c = *--at;
- if (isalnum(c))
- break;
- *at = 0;
- }
-
- at = line;
- for (;;) {
- unsigned char c = *at;
- if (!c)
- break;
- if (isalnum(c))
- break;
- at++;
- }
-
- at = sanity_check(at, email);
-
- strcpy(name, at);
- return 1;
-}
-
-static void handle_date(char *line)
-{
- strcpy(date, line);
-}
-
-static void handle_subject(char *line)
-{
- strcpy(subject, line);
-}
-
-static void check_line(char *line, int len)
-{
- if (!memcmp(line, "From:", 5) && isspace(line[5]))
- handle_from(line+6);
- else if (!memcmp(line, "Date:", 5) && isspace(line[5]))
- handle_date(line+6);
- else if (!memcmp(line, "Subject:", 8) && isspace(line[8]))
- handle_subject(line+9);
-}
-
-static char * cleanup_subject(char *subject)
-{
- for (;;) {
- char *p;
- int len, remove;
- switch (*subject) {
- case 'r': case 'R':
- if (!memcmp("e:", subject+1, 2)) {
- subject +=3;
- continue;
- }
- break;
- case ' ': case '\t': case ':':
- subject++;
- continue;
-
- case '[':
- p = strchr(subject, ']');
- if (!p) {
- subject++;
- continue;
- }
- len = strlen(p);
- remove = p - subject;
- if (remove <= len *2) {
- subject = p+1;
- continue;
- }
- break;
- }
- return subject;
- }
-}
-
-static void cleanup_space(char *buf)
-{
- unsigned char c;
- while ((c = *buf) != 0) {
- buf++;
- if (isspace(c)) {
- buf[-1] = ' ';
- c = *buf;
- while (isspace(c)) {
- int len = strlen(buf);
- memmove(buf, buf+1, len);
- c = *buf;
- }
- }
- }
-}
-
-static void handle_rest(void)
-{
- FILE *out = cmitmsg;
- char *sub = cleanup_subject(subject);
- cleanup_space(name);
- cleanup_space(date);
- cleanup_space(email);
- cleanup_space(sub);
- printf("Author: %s\nEmail: %s\nSubject: %s\nDate: %s\n\n", name, email, sub, date);
-
- do {
- if (!memcmp("diff -", line, 6) ||
- !memcmp("---", line, 3) ||
- !memcmp("Index: ", line, 7))
- out = patchfile;
-
- fputs(line, out);
- } while (fgets(line, sizeof(line), stdin) != NULL);
-
- if (out == cmitmsg) {
- fprintf(stderr, "No patch found\n");
- exit(1);
- }
-
- fclose(cmitmsg);
- fclose(patchfile);
-}
-
-static int eatspace(char *line)
-{
- int len = strlen(line);
- while (len > 0 && isspace(line[len-1]))
- line[--len] = 0;
- return len;
-}
-
-static void handle_body(void)
-{
- int has_from = 0;
- int has_date = 0;
-
- /* First lines of body can have From: and Date: */
- while (fgets(line, sizeof(line), stdin) != NULL) {
- int len = eatspace(line);
- if (!len)
- continue;
- if (!memcmp("From:", line, 5) && isspace(line[5])) {
- if (!has_from && handle_from(line+6)) {
- has_from = 1;
- continue;
- }
- }
- if (!memcmp("Date:", line, 5) && isspace(line[5])) {
- if (!has_date) {
- handle_date(line+6);
- has_date = 1;
- continue;
- }
- }
- line[len] = '\n';
- handle_rest();
- break;
- }
-}
-
-static int read_one_header_line(char *line, int sz, FILE *in)
-{
- int ofs = 0;
- while (ofs < sz) {
- int peek, len;
- if (fgets(line + ofs, sz - ofs, in) == NULL)
- return ofs;
- len = eatspace(line + ofs);
- if (len == 0)
- return ofs;
- peek = fgetc(in); ungetc(peek, in);
- if (peek == ' ' || peek == '\t') {
- /* Yuck, 2822 header "folding" */
- ofs += len;
- continue;
- }
- return ofs + len;
- }
- return ofs;
-}
-
-static void usage(void)
-{
- fprintf(stderr, "mailinfo msg-file patch-file < email\n");
- exit(1);
-}
-
-int main(int argc, char ** argv)
-{
- if (argc != 3)
- usage();
- cmitmsg = fopen(argv[1], "w");
- if (!cmitmsg) {
- perror(argv[1]);
- exit(1);
- }
- patchfile = fopen(argv[2], "w");
- if (!patchfile) {
- perror(argv[2]);
- exit(1);
- }
- while (1) {
- int len = read_one_header_line(line, sizeof(line), stdin);
- if (!len) {
- handle_body();
- break;
- }
- check_line(line, len);
- }
- return 0;
-}