X-Git-Url: https://git.distorted.org.uk/~mdw/ezmlm/blobdiff_plain/5b62e993b0af39700031c2875d7f6654e6a02850..f8beb284087c279acfb30506f5bb32baa4949b44:/author.c diff --git a/author.c b/author.c new file mode 100644 index 0000000..c5bf0dc --- /dev/null +++ b/author.c @@ -0,0 +1,103 @@ +/*$Id: author.c,v 1.3 1999/09/29 03:11:44 lindberg Exp $*/ +/*$Name:*/ + +unsigned int author_name(char **sout,char *s,unsigned int l) +/* s is a string that contains a from: line argument\n. We parse */ +/* s as follows: If there is an unquoted '<' we eliminate everything after */ +/* it else if there is a unquoted ';' we eliminate everything after it. */ +/* Then, we eliminate LWSP and '"' from the beginning and end. Note that */ +/* this is not strict rfc822, but all we need is a display handle that */ +/* doesn't show the address. If in the remaining text there is a '@' we put*/ +/* in a '.' instead. Also, there are some non-rfc822 from lines out there */ +/* and we still want to maximize the chance of getting a handle, even if it*/ +/* costs a little extra work.*/ +{ + int squote = 0; + int dquote = 0; + int level = 0; + int flagdone; + unsigned int len; + char ch; + char *cpfirst,*cp; + char *cpcomlast = 0; + char *cpquotlast = 0; + char *cpquot = 0; + char *cpcom = 0; + char *cplt = 0; + + if (!s || !l) { /* Yuck - pass the buck */ + *sout = s; + return 0; + } + cp = s; len = l; + + while (len--) { + ch = *(cp++); + if (squote) { + squote = 0; + continue; + } + if (ch == '\\') { + squote = 1; + continue; + } + if (ch == '"') { /* "name" */ + if (dquote) { + cpquotlast = cp - 2; + break; + } else { + cpquot = cp; + dquote = 1; + } + continue; + } else if (dquote) continue; + if (ch == '(') { + if (!level) cpcom = cp; + level++; + } else if (ch == ')') { + level--; + if (!level) + cpcomlast = cp - 2; /* address@host (name) */ + } else if (!level) { + if (ch == '<') { /* name */ + cplt = cp - 2; + break; + } else if (ch == ';') break; /* address@host ;garbage */ + } + } + if (cplt) { /* non-comment '<' */ + cp = cplt; + cpfirst = s; + } else if (cpquot && cpquotlast >= cpquot) { + cpfirst = cpquot; + cp = cpquotlast; + } else if (cpcom && cpcomlast >= cpcom) { + cpfirst = cpcom; + cp = cpcomlast; + } else { + cp = s + l - 1; + cpfirst = s; + } + flagdone = 0; + for (;;) { /* e.g. LWSP */ + while (cpfirst <= cp && + (*cpfirst == ' ' || *cpfirst == '\t' || *cpfirst == '<')) cpfirst++; + while (cp >= cpfirst && + (*cp == ' ' || *cp == '\t' || *cp == '\n' || *cp == '>')) cp--; + if (cp >= cpfirst || flagdone) + break; + cp = s + l - 1; + cpfirst = s; + flagdone = 1; + } + + *sout = cpfirst; + len = cp - cpfirst + 1; + while (cpfirst <= cp) { + if (*cpfirst == '@') + *cpfirst = '.'; + cpfirst++; + } + return len; +} +