summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
a743b55)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
#define CONTINUATION_BYTE(c) (((c) & 0xc0) == 0x80)
#define CONTINUATION_BYTE(c) (((c) & 0xc0) == 0x80)
-typedef size_t (*encoder_t) (char *, const char *, size_t,
- const char *);
-
/* converts f of len flen and charset from
into *t of len *tlen and charset to
/* converts f of len flen and charset from
into *t of len *tlen and charset to
while (*p) {
char cset[SHORT_STRING];
while (*p) {
char cset[SHORT_STRING];
q = strchr(p, ':');
if (q) {
q = strchr(p, ':');
if (q) {
+ if (!n || n > (ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 2 - 12)) {
/* Assume that we never need more than 12 characters of
encoded-text to encode a single character. */
/* Assume that we never need more than 12 characters of
encoded-text to encode a single character. */
- n > (ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 2 - 12))
n = convert_string(fromcode, u, ulen, cset, &s, &slen);
if (n < 0)
n = convert_string(fromcode, u, ulen, cset, &s, &slen);
if (n < 0)
-static size_t b_encoder (char *s, const char *d, size_t dlen,
- const char *tocode)
+
+/****************************************************************************/
+/* Encoding functions */
+/****************************************************************************/
+
+typedef size_t (encoder_t)(char *, const char *, ssize_t, const char *);
+
+static size_t
+b_encoder(char *s, const char *d, ssize_t dlen, const char *tocode)
- memcpy (s, "=?", 2), s += 2;
- memcpy (s, tocode, m_strlen(tocode)), s += m_strlen(tocode);
- memcpy (s, "?B?", 3), s += 3;
+ s += sprintf(s, "=?%s?B?", tocode);
+
- if (!dlen)
- break;
- else if (dlen == 1) {
+ switch (dlen) {
+ case 0:
+ goto done;
+
+ case 1:
*s++ = __m_b64chars[(*d >> 2) & 0x3f];
*s++ = __m_b64chars[(*d & 0x03) << 4];
*s++ = '=';
*s++ = '=';
*s++ = __m_b64chars[(*d >> 2) & 0x3f];
*s++ = __m_b64chars[(*d & 0x03) << 4];
*s++ = '=';
*s++ = '=';
- break;
- }
- else if (dlen == 2) {
*s++ = __m_b64chars[(*d >> 2) & 0x3f];
*s++ = __m_b64chars[((*d & 0x03) << 4) | ((d[1] >> 4) & 0x0f)];
*s++ = __m_b64chars[(d[1] & 0x0f) << 2];
*s++ = '=';
*s++ = __m_b64chars[(*d >> 2) & 0x3f];
*s++ = __m_b64chars[((*d & 0x03) << 4) | ((d[1] >> 4) & 0x0f)];
*s++ = __m_b64chars[(d[1] & 0x0f) << 2];
*s++ = '=';
+ goto done;
+
+ default:
*s++ = __m_b64chars[(*d >> 2) & 0x3f];
*s++ = __m_b64chars[((*d & 0x03) << 4) | ((d[1] >> 4) & 0x0f)];
*s++ = __m_b64chars[((d[1] & 0x0f) << 2) | ((d[2] >> 6) & 0x03)];
*s++ = __m_b64chars[(*d >> 2) & 0x3f];
*s++ = __m_b64chars[((*d & 0x03) << 4) | ((d[1] >> 4) & 0x0f)];
*s++ = __m_b64chars[((d[1] & 0x0f) << 2) | ((d[2] >> 6) & 0x03)];
- memcpy (s, "?=", 2), s += 2;
+
+ done:
+ *s++ = '?';
+ *s++ = '=';
-static size_t q_encoder (char *s, const char *d, size_t dlen,
- const char *tocode)
+static size_t
+q_encoder(char *s, const char *d, ssize_t dlen, const char *tocode)
- memcpy (s, "=?", 2), s += 2;
- memcpy (s, tocode, m_strlen(tocode)), s += m_strlen(tocode);
- memcpy (s, "?Q?", 3), s += 3;
+ s += sprintf(s, "=?%s?Q?", tocode);
while (dlen--) {
unsigned char c = *d++;
while (dlen--) {
unsigned char c = *d++;
- else if (c >= 0x7f || c < 0x20 || c == '_' || strchr (MimeSpecials, c)) {
+ } else
+ if (c & 0x80 || c < 0x20 || c == '_' || strchr (MimeSpecials, c)) {
*s++ = '=';
*s++ = __m_b36chars_upper[c >> 4];
*s++ = __m_b36chars_upper[c & 0xf];
*s++ = '=';
*s++ = __m_b36chars_upper[c >> 4];
*s++ = __m_b36chars_upper[c & 0xf];
- memcpy (s, "?=", 2), s += 2;
+
+ *s++ = '?';
+ *s++ = '=';
*/
static size_t try_block (const char *d, ssize_t dlen,
const char *fromcode, const char *tocode,
*/
static size_t try_block (const char *d, ssize_t dlen,
const char *fromcode, const char *tocode,
- encoder_t * encoder, ssize_t *wlen)
+ encoder_t **encoder, ssize_t *wlen)
{
char buf1[ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 1];
iconv_t cd;
{
char buf1[ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 1];
iconv_t cd;
*/
static size_t encode_block (char *s, char *d, ssize_t dlen,
const char *fromcode, const char *tocode,
*/
static size_t encode_block (char *s, char *d, ssize_t dlen,
const char *fromcode, const char *tocode,
{
char buf1[ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 1];
ssize_t ibl, obl, n1, n2;
{
char buf1[ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 1];
ssize_t ibl, obl, n1, n2;
assert (n1 >= 0 && n2 >= 0);
iconv_close (cd);
return (*encoder) (s, buf1, ob - buf1, tocode);
assert (n1 >= 0 && n2 >= 0);
iconv_close (cd);
return (*encoder) (s, buf1, ob - buf1, tocode);
return (*encoder) (s, d, dlen, tocode);
return (*encoder) (s, d, dlen, tocode);
*/
static size_t choose_block(char *d, size_t dlen, int col,
const char *fromcode, const char *tocode,
*/
static size_t choose_block(char *d, size_t dlen, int col,
const char *fromcode, const char *tocode,
- encoder_t *encoder, ssize_t *wlen)
+ encoder_t **encoder, ssize_t *wlen)
{
size_t n, nn;
int utf8 = fromcode && !ascii_strcasecmp (fromcode, "UTF-8");
{
size_t n, nn;
int utf8 = fromcode && !ascii_strcasecmp (fromcode, "UTF-8");
char *u, *t0, *t1, *t;
char *s0, *s1;
ssize_t ulen, r, n, wlen;
char *u, *t0, *t1, *t;
char *s0, *s1;
ssize_t ulen, r, n, wlen;
char *tocode1 = 0;
const char *tocode;
const char *icode = "UTF-8";
char *tocode1 = 0;
const char *tocode;
const char *icode = "UTF-8";