FreeCalypso > hg > falcon-mail-tools
diff f-demime/b2q_out.c @ 0:7e0d08176f32
f-demime starting code
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 06 May 2023 06:14:03 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/f-demime/b2q_out.c Sat May 06 06:14:03 2023 +0000 @@ -0,0 +1,90 @@ +/* + * This module implements the output side of base64-to-QP conversion. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "defs.h" + +extern FILE *tempfile; + +static char linebuf[QP_MAX_LINE]; +static unsigned line_len, trailing_newline; + +static void +add_plain_char(ch) +{ + linebuf[line_len++] = ch; + linebuf[line_len] = '\0'; + if (!strcmp(linebuf, "From ")) { + strcpy(linebuf, "=46rom "); + line_len = 7; + } else if (!strcmp(linebuf, "--")) { + strcpy(linebuf, "=2D-"); + line_len = 4; + } else if (!strcmp(linebuf, ".")) { + strcpy(linebuf, "=2E"); + line_len = 3; + } +} + +static void +add_octet_char(ch) +{ + sprintf(linebuf + line_len, "=%02X", ch); + line_len += 3; +} + +static void +process_newline() +{ + if (line_len) { + if (linebuf[line_len-1] == ' ') + strcpy(linebuf + line_len - 1, "=20"); + fputs(linebuf, stdout); + line_len = 0; + } + putchar('\n'); +} + +static void +process_char(ch) +{ + if (ch == '\n') { + process_newline(); + trailing_newline++; + if (trailing_newline > 2) + trailing_newline = 2; + return; + } + if (line_len >= QP_MAX_LINE - 2) { + printf("%s=\n", linebuf); + line_len = 0; + } + if (ch == '=') + add_octet_char(ch); + else if (ch >= ' ' && ch <= '~') + add_plain_char(ch); + else + add_octet_char(ch); + trailing_newline = 0; +} + +void +b2q_emit_output() +{ + int c; + + rewind(tempfile); + line_len = 0; + trailing_newline = 1; + while ((c = getc(tempfile)) != EOF) + process_char(c); + fclose(tempfile); + while (trailing_newline < 2) { + process_newline(); + trailing_newline++; + } +}