⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mf.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -