/*
**
** Copyright (C) 1993 Swedish University Network (SUNET)
**
**
** This program is developed by UDAC, Uppsala University by commission
** of the Swedish University Network (SUNET).
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITTNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
**
** Martin.Wendel@its.uu.se
** Torbjorn.Wictorin@its.uu.se
**
** ITS
** P.O. Box 887
** S-751 08 Uppsala
** Sweden
**
*/
#include "emil.h"
static char toqp[256] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
int
h_to_quoted_printable(struct hprs *h)
{
struct data *inbuf, *outbuf;
static int linelen;
char lastspace;
char cbuf[5];
char *inb;
inbuf = h->td;
/* Exit on empty input */
if (!inbuf->size)
return(NOK);
linelen = 0;
outbuf = (struct data *)Yalloc(sizeof(struct data));
outbuf->encoding = EQP;
outbuf->charset = h->td->charset;
if (outbuf->charset == NULL)
{
sprintf(ebuf, "h_to_quoted_printable: No charset in header");
logger(LOG_DEBUG, ebuf);
return(NOK);
}
append_data(outbuf, "=?", 2, HEAD_BUF);
append_data(outbuf, outbuf->charset, strlen(outbuf->charset), HEAD_BUF);
append_data(outbuf, "?Q?", 3, HEAD_BUF);
/* Initialize working pointers */
inb = inbuf->contents + inbuf->offset;
lastspace = 0;
/*
* Process entire inbuf.
*/
while (inbuf->offset < inbuf->bodyend)
{
if (linelen > 71 && *inb != '\n')
{
append_data(outbuf, "=\n", 2, HEAD_BUF);
outbuf ->lineend += 1;
linelen = 0;
}
if (toqp[(unsigned char)*inb])
{
sprintf(cbuf, "=%.2X", (unsigned char)*inb);
append_data(outbuf, cbuf, 3, HEAD_BUF);
linelen += 3;
}
else
{
if (*inb == '\n')
{
if (lastspace != 0)
{
/* Quote space before end of line */
sprintf(cbuf, "=%.2X\n", (unsigned char)lastspace);
append_data(outbuf, cbuf, 4, HEAD_BUF);
outbuf ->lineend += 1;
}
linelen = 0;
}
else
{
if (*inb == ' ')
append_char(outbuf, '_', HEAD_BUF);
else
append_char(outbuf, *inb, HEAD_BUF);
linelen++;
}
if (*inb == ' ' || *inb == '\t')
lastspace = *inb;
else
lastspace = 0;
}
inb++;
inbuf->offset += 1;
}
append_data(outbuf, "?=", 2, HEAD_BUF);
h->td = outbuf;
h->type = RFC1522;
return(OK);
}
int
h_from_quoted_printable(struct hprs *h)
{
struct data *inbuf, *outbuf;
char *inb;
char *q;
char t[3];
char c;
int l, b;
inbuf = h->td;
/* Exit on empty input */
if (!inbuf->size)
return(NOK);
inbuf->offset = h->pstart;
/* Initialize working pointers */
inb = inbuf->contents + inbuf->offset;
outbuf = (struct data *)Yalloc(sizeof(struct data));
outbuf->encoding = E7BIT;
outbuf->charset = h->td->charset;
t[2] = '\0';
/*
* Process entire inbuf.
*/
while (inbuf->offset < h->pend)
{
if ((q = index(inb, '=')) != NULL &&
(l = q - inb) > -1 &&
(inbuf->offset + l < h->pend))
{
/* Special case of _ character */
for (b = 0; b < l; b++)
if (*(inb + b) == '_')
*(inb + b) = ' ';
append_data(outbuf, inb, l, HEAD_BUF);
inb += l + 1;
inbuf->offset += l + 1;
if (*inb == '\n')
/* Soft line break */
{
inb++;
inbuf->offset += 1;
}
else
{
strncpy(t, inb, 2);
if ((c = (char) strtol(t, (char **)NULL, 16)) == 0)
{
/* Illegal encoding */
return(NOK);
}
else
{
append_char(outbuf, c, HEAD_BUF);
inb += 2;
inbuf->offset += 2;
}
}
}
else
{
/* This is the last bit */
l = h->pend - inbuf->offset;
/* Special case of _ character */
for (b = 0; b < l; b++)
if (*(inb + b) == '_')
*(inb + b) = ' ';
append_data(outbuf, inb, l, HEAD_BUF);
inb += l;
inbuf->offset += l;
}
}
h->td = outbuf;
h->type = ATOM;
return(OK);
}
syntax highlighted by Code2HTML, v. 0.9.1