diff options
Diffstat (limited to 'rfc2045/rfc2045acprep.c')
| -rw-r--r-- | rfc2045/rfc2045acprep.c | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/rfc2045/rfc2045acprep.c b/rfc2045/rfc2045acprep.c new file mode 100644 index 0000000..f3defa3 --- /dev/null +++ b/rfc2045/rfc2045acprep.c @@ -0,0 +1,106 @@ +/* +** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for +** distribution information. +*/ + +#include	"rfc2045.h" +#include	<ctype.h> +#include	<string.h> + + +static void start_rwprep(struct rfc2045 *); +static void do_rwprep(const char *, size_t); +static void end_rwprep(); + +static struct rfc2045ac rfc2045acprep={ +	&start_rwprep, +	&do_rwprep, +	&end_rwprep}; + +static struct rfc2045 *currwp; +static int curlinepos=0; + +typedef enum { +	raw, +	quotedprint, +	qpseeneq, +	qpseeneqh, +	base64} state_t; + +static state_t curstate; +static int statechar; + +#define	h2nyb(c) ( (c) >= 'a' && (c) <= 'f' ? (c)-('a'-10): \ +		   (c) >= 'A' && (c) <= 'F' ? (c)-('A'-10): (c)-'0') + +struct rfc2045 *rfc2045_alloc_ac() +{ +struct rfc2045 *p=rfc2045_alloc(); + +	if (p)	p->rfc2045acptr= &rfc2045acprep; +	currwp=0; +	return (p); +} + + +static void start_rwprep(struct rfc2045 *p) +{ +	currwp=p; +	curlinepos=0; +	curstate=raw; +	if (p->content_transfer_encoding) +	{ +		if (strcmp(p->content_transfer_encoding, +			"quoted-printable") == 0) +			curstate=quotedprint; +		else if (strcmp(p->content_transfer_encoding, "base64") == 0) +			curstate=base64; +	} +} + +static void do_rwprep(const char * p, size_t n) +{ +	if (!currwp)	return; +	for ( ; n; --n, ++p) +		switch (curstate)	{ +		case quotedprint: +			if (*p == '=') +			{ +				curstate=qpseeneq; +				continue; +			} +			/* FALLTHRU */ +		case raw: +			if (*p == '\r' || *p == '\n') +				curlinepos=0; +			else if (++curlinepos > 500) +				currwp->haslongline=1; +			if ((unsigned char)*p >= 127) +				currwp->has8bitchars=1; +			break; +		case qpseeneq: +			if (*p == '\n') +			{ +				curstate=quotedprint; +				continue; +			} +			if (isspace((int)(unsigned char)*p))	continue; /* Ignore WSP */ +			statechar=*p; +			curstate=qpseeneqh; +			continue; +		case qpseeneqh: +			curstate=quotedprint; +			if ( (unsigned char) +				( (h2nyb(statechar) << 4) + h2nyb(*p) ) >= 127 +				) currwp->has8bitchars=1; +			if (++curlinepos > 500) +				currwp->haslongline=1; +			continue; +		case base64: +			break; +		} +} + +static void end_rwprep() +{ +} | 
