mirror of
https://github.com/php/php-src.git
synced 2024-10-13 20:42:38 +00:00
100 lines
2.4 KiB
C
100 lines
2.4 KiB
C
/* $Id$ */
|
|
|
|
/*
|
|
** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
|
|
** distribution information.
|
|
*/
|
|
#include "php.h"
|
|
#include "php_mailparse.h"
|
|
|
|
|
|
static void start_rwprep(struct rfc2045ac *, struct rfc2045 *);
|
|
static void do_rwprep(struct rfc2045ac *, const char *, size_t);
|
|
static void end_rwprep(struct rfc2045ac *);
|
|
|
|
static struct rfc2045ac rfc2045acprep={
|
|
&start_rwprep,
|
|
&do_rwprep,
|
|
&end_rwprep};
|
|
|
|
#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 = emalloc(sizeof(struct rfc2045ac));
|
|
memcpy(p->rfc2045acptr, &rfc2045acprep, sizeof(struct rfc2045ac));
|
|
p->rfc2045acptr->curlinepos = 0;
|
|
p->rfc2045acptr->currwp = NULL;
|
|
}
|
|
return (p);
|
|
}
|
|
|
|
|
|
static void start_rwprep(struct rfc2045ac * this_ptr, struct rfc2045 *p)
|
|
{
|
|
this_ptr->currwp = p;
|
|
this_ptr->curlinepos=0;
|
|
this_ptr->curstate=rfc2045ac_raw;
|
|
if (p->content_transfer_encoding)
|
|
{
|
|
if (strcmp(p->content_transfer_encoding,
|
|
"quoted-printable") == 0)
|
|
this_ptr->curstate = rfc2045ac_quotedprint;
|
|
else if (strcmp(p->content_transfer_encoding, "base64") == 0)
|
|
this_ptr->curstate = rfc2045ac_base64;
|
|
}
|
|
}
|
|
|
|
static void do_rwprep(struct rfc2045ac * this_ptr, const char * p, size_t n)
|
|
{
|
|
if (!this_ptr->currwp)
|
|
return;
|
|
for ( ; n; --n, ++p)
|
|
switch (this_ptr->curstate) {
|
|
case rfc2045ac_quotedprint:
|
|
if (*p == '=')
|
|
{
|
|
this_ptr->curstate = rfc2045ac_qpseeneq;
|
|
continue;
|
|
}
|
|
/* FALLTHRU */
|
|
case rfc2045ac_raw:
|
|
if (*p == '\r' || *p == '\n')
|
|
this_ptr->curlinepos = 0;
|
|
else if (++this_ptr->curlinepos > 500)
|
|
this_ptr->currwp->haslongline = 1;
|
|
if ((unsigned char)*p >= 127)
|
|
this_ptr->currwp->has8bitchars = 1;
|
|
break;
|
|
case rfc2045ac_qpseeneq:
|
|
if (*p == '\n')
|
|
{
|
|
this_ptr->curstate = rfc2045ac_quotedprint;
|
|
continue;
|
|
}
|
|
if (isspace((int)(unsigned char)*p)) continue; /* Ignore WSP */
|
|
this_ptr->statechar = *p;
|
|
this_ptr->curstate = rfc2045ac_qpseeneqh;
|
|
continue;
|
|
case rfc2045ac_qpseeneqh:
|
|
this_ptr->curstate = rfc2045ac_quotedprint;
|
|
if ( (unsigned char)
|
|
( (h2nyb(this_ptr->statechar) << 4) + h2nyb(*p) ) >= 127
|
|
) this_ptr->currwp->has8bitchars=1;
|
|
if (++this_ptr->curlinepos > 500)
|
|
this_ptr->currwp->haslongline=1;
|
|
continue;
|
|
case rfc2045ac_base64:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void end_rwprep(struct rfc2045ac * this_ptr)
|
|
{
|
|
}
|