Reset filter on setup. (reset): When resetting qp encoding, set the state

2000-07-13  Not Zed  <NotZed@HelixCode.com>

        * camel-mime-filter-basic.c (camel_mime_filter_basic_new_type):
        Reset filter on setup.
        (reset): When resetting qp encoding, set the state to -1, instead
        of 0.

        * camel-mime-utils.c (quoted_encode_step): Actually count the
        characters output sofar (it never counted any).  Bunch of other
        fixes.
        (quoted_encode_close): Also flush out final character, if ther's
        one.

svn path=/trunk/; revision=4135
This commit is contained in:
Not Zed
2000-07-13 04:02:13 +00:00
committed by Michael Zucci
parent 548fa4f72a
commit 0fcc4e0a67
3 changed files with 96 additions and 24 deletions

View File

@ -1,3 +1,16 @@
2000-07-13 Not Zed <NotZed@HelixCode.com>
* camel-mime-filter-basic.c (camel_mime_filter_basic_new_type):
Reset filter on setup.
(reset): When resetting qp encoding, set the state to -1, instead
of 0.
* camel-mime-utils.c (quoted_encode_step): Actually count the
characters output sofar (it never counted any). Bunch of other
fixes.
(quoted_encode_close): Also flush out final character, if ther's
one.
2000-07-12 Jeffrey Stedfast <fejj@helixcode.com>
Chris forgot to add #include <e-util/e-util.h> to the source files

View File

@ -67,7 +67,13 @@ reset(CamelMimeFilter *mf)
{
CamelMimeFilterBasic *f = (CamelMimeFilterBasic *)mf;
f->state = 0;
switch(f->type) {
case CAMEL_MIME_FILTER_BASIC_QP_ENC:
f->state = -1;
break;
default:
f->state = 0;
}
f->save = 0;
}
@ -214,6 +220,7 @@ camel_mime_filter_basic_new_type(CamelMimeFilterBasicType type)
new = NULL;
break;
}
camel_mime_filter_reset((CamelMimeFilter *)new);
return new;
}

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2000 Helix Code Inc.
*
* this is a line ending in spaces
* and this line only contains spaces no tabs
* Authors: Michael Zucchi <notzed@helixcode.com>
* Jeffrey Stedfast <fejj@helixcode.com>
*
@ -509,55 +510,106 @@ int
quoted_encode_close(unsigned char *in, int len, unsigned char *out, int *state, int *save)
{
register unsigned char *outptr = out;
int last;
if (len>0)
outptr += quoted_encode_step(in, len, outptr, state, save);
last = *state;
if (last != -1) {
/* space/tab must be encoded if its the last character on
the line */
if (is_qpsafe(last) && last!=' ' && last!=9) {
*outptr++ = last;
} else {
*outptr++ = '=';
*outptr++ = tohex[(last>>4) & 0xf];
*outptr++ = tohex[last & 0xf];
}
}
/* hmm, not sure if this should really be added here, we dont want
to add it to the content, afterall ...? */
*outptr++ = '\n';
*save = 0;
*state = 0;
*state = -1;
return outptr-out;
}
/*
FIXME: does not handle trailing spaces/tabs before end of line
*/
int
quoted_encode_step(unsigned char *in, int len, unsigned char *out, int *state, int *save)
quoted_encode_step(unsigned char *in, int len, unsigned char *out, int *statep, int *save)
{
register unsigned char *inptr, *outptr, *inend;
unsigned char c;
register int sofar = *state;
unsigned char c=0x100;
register int sofar = *save, /* keeps track of how many chars on a line */
last=*statep; /* keeps track if last char to end was a space cr etc */
inptr = in;
inend = in+len;
outptr = out;
while (inptr<inend) {
c = *inptr++;
if (is_qpsafe(c)) {
/* check for soft line-break */
if ((++sofar)>74) {
*outptr++='=';
*outptr++='\n';
sofar = 1;
if (c=='\r') {
if (last != -1) {
*outptr++ = '=';
*outptr++ = tohex[(last>>4) & 0xf];
*outptr++ = tohex[last & 0xf];
sofar+=3;
}
*outptr++=c;
last = c;
} else if (c=='\n') {
if (last != -1 && last!='\r') {
*outptr++ = '=';
*outptr++ = tohex[(last>>4) & 0xf];
*outptr++ = tohex[last & 0xf];
}
*outptr++ = '\n';
sofar=0;
last = -1;
} else {
if ((++sofar)>72) {
*outptr++='=';
*outptr++='\n';
sofar = 3;
if (last != -1) {
if (is_qpsafe(last)) {
*outptr++ = last;
sofar++;
} else {
*outptr++ = '=';
*outptr++ = tohex[(last>>4) & 0xf];
*outptr++ = tohex[last & 0xf];
sofar+=3;
}
}
if (is_qpsafe(c)) {
if (sofar>74) {
*outptr++='=';
*outptr++='\n';
sofar = 0;
}
/* delay output of space */
if (c==' ' || c==0x09) {
last = c;
} else {
*outptr++=c;
sofar++;
last = -1;
}
} else {
if (sofar>72) {
*outptr++='=';
*outptr++='\n';
sofar = 3;
} else
sofar += 3;
*outptr++ = '=';
*outptr++ = tohex[(c>>4) & 0xf];
*outptr++ = tohex[c & 0xf];
last = -1;
}
*outptr++ = '=';
*outptr++ = tohex[(c>>4) & 0xf];
*outptr++ = tohex[c & 0xf];
}
}
*state = sofar;
*save = sofar;
*statep = last;
return outptr-out;
}