base64dec: skip non-printable characters like \r\n - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ee5cc8e903574bf629e5159334ae6b0fad6af402
 (DIR) parent 274d46ace00003d1df718b974d17642cbce167d5
 (HTM) Author: Suraj N. Kurapati <sunaku@riseup.net>
       Date:   Thu, 17 Aug 2017 23:00:10 -0700
       
       base64dec: skip non-printable characters like \r\n
       
       Non-printable characters, such as line breaks, in a base64 encoded
       string violate the "string length must be a multiple of four" rule.
       
       This patch pads the result buffer by one extra unit of four bytes,
       and skips over non-printable characters found in the input string.
       
       Diffstat:
         M st.c                                |      17 ++++++++++++-----
       
       1 file changed, 12 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -386,6 +386,13 @@ static const char base64_digits[] = {
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        };
        
       +char
       +base64dec_getc(const char **src)
       +{
       +        while (**src && !isprint(**src)) (*src)++;
       +        return *((*src)++);
       +}
       +
        char *
        base64dec(const char *src)
        {
       @@ -393,13 +400,13 @@ base64dec(const char *src)
                char *result, *dst;
        
                if (in_len % 4)
       -                return NULL;
       +                in_len += 4 - (in_len % 4);
                result = dst = xmalloc(in_len / 4 * 3 + 1);
                while (*src) {
       -                int a = base64_digits[(unsigned char) *src++];
       -                int b = base64_digits[(unsigned char) *src++];
       -                int c = base64_digits[(unsigned char) *src++];
       -                int d = base64_digits[(unsigned char) *src++];
       +                int a = base64_digits[(unsigned char) base64dec_getc(&src)];
       +                int b = base64_digits[(unsigned char) base64dec_getc(&src)];
       +                int c = base64_digits[(unsigned char) base64dec_getc(&src)];
       +                int d = base64_digits[(unsigned char) base64dec_getc(&src)];
        
                        *dst++ = (a << 2) | ((b & 0x30) >> 4);
                        if (c == -1)