-
Notifications
You must be signed in to change notification settings - Fork 15
/
encodeQ.c
47 lines (43 loc) · 1.13 KB
/
encodeQ.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* $Id$*/
#include "errtxt.h"
#include "mime.h"
#include "stralloc.h"
#include "strerr.h"
#include "die.h"
#include "idx.h"
static const char hexchar[16] = "0123456789ABCDEF";
void encodeQ(const char *indata,unsigned int n,stralloc *outdata)
/* converts any character with the high order bit set to */
/* quoted printable. In: n chars of indata, out: stralloc outdata*/
{
char *cpout;
char ch;
unsigned int i;
const char *cpin;
cpin = indata;
i = 0;
/* max 3 outchars per inchar & 2 char newline per 72 chars */
if (!stralloc_copys(outdata,"")) die_nomem();
if (!stralloc_ready(outdata,n * 3 + n/36)) die_nomem(); /* worst case */
cpout = outdata->s;
while (n--) {
ch = *cpin++;
if (ch != ' ' && ch != '\n' && ch != '\t' &&
(ch > 126 || ch < 33 || ch == 61)) {
*(cpout++) = '=';
*(cpout++) = hexchar[(ch >> 4) & 0xf];
*(cpout++) = hexchar[ch & 0xf];
i += 3;
} else {
if (ch == '\n')
i = 0;
*(cpout++) = ch;
}
if (i >= 72) {
*(cpout++) = '=';
*(cpout++) = '\n';
i = 0;
}
}
outdata->len = (unsigned int) (cpout - outdata->s);
}