📄 mf.c
字号:
case LX_ATOM: case LX_QSTR: pers = add (buffer, add (" ", pers)); more_phrase: ; /* sigh (1) */ if (phrase (buffer) == NOTOK) return NOTOK; switch (last_lex) { case LX_LBRK: get_addr: ; if (route_addr (buffer) == NOTOK) return NOTOK; if (last_lex == LX_RBRK) return OK; (void) sprintf (err, "missing right-bracket (%s)", buffer); return NOTOK; case LX_COLN: get_group: ; if (glevel++ > 0) { (void) sprintf (err, "nested groups not allowed (%s)", pers); return NOTOK; } grp = add (": ", pers); pers = NULL; { char *pp = cp; for (;;) switch (my_lex (buffer)) { case LX_SEMI: case LX_END: /* tsk, tsk */ glevel--; return OK; case LX_COMA: continue; default: cp = pp; return parse_address (); } } case LX_DOT: /* sigh (1) */ pers = add (".", pers); goto more_phrase; default: (void) sprintf (err, "no mailbox in address, only a phrase (%s%s)", pers, buffer); return NOTOK; }/* */ case LX_LBRK: goto get_addr; case LX_COLN: goto get_group; case LX_DOT: mbox = add (buffer, pers); pers = NULL; if (route_addr (buffer) == NOTOK) return NOTOK; goto check_end; case LX_AT: ingrp = glevel; mbox = pers; pers = NULL; if (domain (buffer) == NOTOK) return NOTOK; check_end: ; switch (last_lex) { case LX_SEMI: if (glevel-- <= 0) { (void) strcpy (err, "extraneous semi-colon"); return NOTOK; } case LX_COMA: case LX_END: return OK; default: (void) sprintf (err, "junk after local@domain (%s)", buffer); return NOTOK; } case LX_SEMI: /* no host */ case LX_COMA: case LX_END: ingrp = glevel; if (last_lex == LX_SEMI && glevel-- <= 0) { (void) strcpy (err, "extraneous semi-colon"); return NOTOK; } mbox = pers; pers = NULL; return OK; default: (void) sprintf (err, "missing mailbox (%s)", buffer); return NOTOK; }}/* */static int phrase (buffer)register char *buffer;{ for (;;) switch (my_lex (buffer)) { case LX_ATOM: case LX_QSTR: pers = add (buffer, add (" ", pers)); continue; default: return OK; }}/* */static int route_addr (buffer)register char *buffer;{ register char *pp = cp; if (my_lex (buffer) == LX_AT) { if (route (buffer) == NOTOK) return NOTOK; } else cp = pp; if (local_part (buffer) == NOTOK) return NOTOK; switch (last_lex) { case LX_AT: return domain (buffer); case LX_SEMI: /* if in group */ case LX_RBRK: /* no host */ case LX_COMA: case LX_END: return OK; default: (void) sprintf (err, "no at-sign after local-part (%s)", buffer); return NOTOK; }}/* */static int local_part (buffer)register char *buffer;{ ingrp = glevel; for (;;) { switch (my_lex (buffer)) { case LX_ATOM: case LX_QSTR: mbox = add (buffer, mbox); break; default: (void) sprintf (err, "no mailbox in local-part (%s)", buffer); return NOTOK; } switch (my_lex (buffer)) { case LX_DOT: mbox = add (buffer, mbox); continue; default: return OK; } }}/* */static int domain (buffer)register char *buffer;{ for (;;) { switch (my_lex (buffer)) { case LX_ATOM: case LX_DLIT: host = add (buffer, host); break; default: (void) sprintf (err, "no sub-domain in domain-part of address (%s)", buffer); return NOTOK; } switch (my_lex (buffer)) { case LX_DOT: host = add (buffer, host); continue; case LX_AT: /* sigh (0) */ mbox = add (host, add ("%", mbox)); free (host); host = NULL; continue; default: return OK; } }}/* */static int route (buffer)register char *buffer;{ path = getcpy ("@"); for (;;) { switch (my_lex (buffer)) { case LX_ATOM: case LX_DLIT: path = add (buffer, path); break; default: (void) sprintf (err, "no sub-domain in domain-part of address (%s)", buffer); return NOTOK; } switch (my_lex (buffer)) { case LX_COMA: path = add (buffer, path); for (;;) { switch (my_lex (buffer)) { case LX_COMA: continue; case LX_AT: path = add (buffer, path); break; default: (void) sprintf (err, "no at-sign found for next domain in route (%s)", buffer); } break; } continue; case LX_AT: /* XXX */ case LX_DOT: path = add (buffer, path); continue; case LX_COLN: path = add (buffer, path); return OK; default: (void) sprintf (err, "no colon found to terminate route (%s)", buffer); return NOTOK; } }}/* */static int my_lex (buffer)register char *buffer;{ int i, gotat = 0; register char c, *bp; bp = buffer; *bp = 0; if (!cp) return (last_lex = LX_END); gotat = isat (cp); c = *cp++; while (isspace (c)) c = *cp++; if (c == 0) { cp = NULL; return (last_lex = LX_END); } if (c == '(') for (*bp++ = c, i = 0;;) switch (c = *cp++) { case 0: cp = NULL; return (last_lex = LX_ERR); case QUOTE: *bp++ = c; if ((c = *cp++) == 0) { cp = NULL; return (last_lex = LX_ERR); } *bp++ = c; continue; case '(': i++; default: *bp++ = c; continue; case ')': *bp++ = c; if (--i < 0) { *bp = 0; note = note ? add (buffer, add (" ", note)) : getcpy (buffer); return my_lex (buffer); } }/* */ if (c == '"') for (*bp++ = c;;) switch (c = *cp++) { case 0: cp = NULL; return (last_lex = LX_ERR); case QUOTE: *bp++ = c; if ((c = *cp++) == 0) { cp = NULL; return (last_lex = LX_ERR); } default: *bp++ = c; continue; case '"': *bp++ = c; *bp = 0; return (last_lex = LX_QSTR); } if (c == '[') for (*bp++ = c;;) switch (c = *cp++) { case 0: cp = NULL; return (last_lex = LX_ERR); case QUOTE: *bp++ = c; if ((c = *cp++) == 0) { cp = NULL; return (last_lex = LX_ERR); } default: *bp++ = c; continue; case ']': *bp++ = c; *bp = 0; return (last_lex = LX_DLIT); }/* */ *bp++ = c; *bp = 0; for (i = 0; special[i].lx_chr != 0; i++) if (c == special[i].lx_chr) return (last_lex = special[i].lx_val); if (iscntrl (c)) return (last_lex = LX_ERR); for (;;) { if ((c = *cp++) == 0) break; for (i = 0; special[i].lx_chr != 0; i++) if (c == special[i].lx_chr) goto got_atom; if (iscntrl (c) || isspace (c)) break; *bp++ = c; }got_atom: ; if (c == 0) cp = NULL; else cp--; *bp = 0; last_lex = !gotat || cp == NULL || index (cp, '<') != NULL ? LX_ATOM : LX_AT; return last_lex;}/* */char *legal_person (p)register char *p;{ int i; register char *cp; static char buffer[BUFSIZ]; if (*p == '"') return p; for (cp = p; *cp; cp++) for (i = 0; special[i].lx_chr; i++) if (*cp == special[i].lx_chr) { (void) sprintf (buffer, "\"%s\"", p); return buffer; } return p;}/* */int mfgets (in, bp)register FILE *in;register char **bp;{ int i; register char *cp, *dp, *ep; static int len = 0; static char *pp = NULL; if (pp == NULL) if ((pp = malloc ((unsigned) (len = BUFSIZ))) == NULL) return NOTOK; for (ep = (cp = pp) + len - 2;;) { switch (i = getc (in)) { case EOF: eol: ; if (cp != pp) { *cp = 0; *bp = pp; return OK; } eoh: ; *bp = NULL; free (pp); pp = NULL; return DONE; case 0: continue; case '\n': if (cp == pp) /* end of headers, gobble it */ goto eoh; switch (i = getc (in)) { default: /* end of line */ case '\n': /* end of headers, save for next call */ (void) ungetc (i, in); goto eol; case ' ': /* continue headers */ case '\t': *cp++ = '\n'; break; } /* fall into default case */ default: *cp++ = i; break; } if (cp >= ep) if ((dp = realloc (pp, (unsigned) (len += BUFSIZ))) == NULL) { free (pp); pp = NULL; return NOTOK; } else cp += dp - pp, ep = (pp = cp) + len - 2; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -