aboutsummaryrefslogtreecommitdiffstats
path: root/camel
diff options
context:
space:
mode:
Diffstat (limited to 'camel')
-rw-r--r--camel/ChangeLog13
-rw-r--r--camel/camel-mime-filter-basic.c9
-rw-r--r--camel/camel-mime-utils.c98
3 files changed, 96 insertions, 24 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 3086a3410e..6f01dbbd19 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -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
diff --git a/camel/camel-mime-filter-basic.c b/camel/camel-mime-filter-basic.c
index 60566abf4e..082fa209ad 100644
--- a/camel/camel-mime-filter-basic.c
+++ b/camel/camel-mime-filter-basic.c
@@ -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;
}
diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c
index dbf4e4bfc3..46825a952e 100644
--- a/camel/camel-mime-utils.c
+++ b/camel/camel-mime-utils.c
@@ -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;
}