From 86ae825fb67734391fc7cc72d5c9b004570ab0a9 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Tue, 12 Nov 2013 18:17:00 +0100 Subject: base64: get rid of strtok_r and use strspn+strcspn instead strtok_r is not available on win32 and the designated strtok_s function is reported to not work on windows xp. Hence we use an easier an non-destructive implementation with strspn and strcspn to strip out the whitespace. --- src/base64.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/base64.c b/src/base64.c index acec723..83205c2 100644 --- a/src/base64.c +++ b/src/base64.c @@ -21,10 +21,6 @@ #include #include "base64.h" -#ifdef WIN32 -#define strtok_r strtok_s -#endif - static const char base64_str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char base64_pad = '='; @@ -112,18 +108,23 @@ unsigned char *base64decode(const char *buf, size_t *size) size_t len = strlen(buf); if (len <= 0) return NULL; unsigned char *outbuf = (unsigned char*)malloc((len/4)*3+3); - - unsigned char *line; + const char *ptr = buf; int p = 0; - char* saveptr = NULL; - line = (unsigned char*)strtok_r((char*)buf, "\r\n\t ", &saveptr); - while (line) { - p+=base64decode_block(outbuf+p, (const char*)line, strlen((char*)line)); + do { + ptr += strspn(ptr, "\r\n\t "); + if (*ptr == '\0') { + break; + } + len = strcspn(ptr, "\r\n\t "); + if (len > 0) { + p+=base64decode_block(outbuf+p, ptr, len); + ptr += len; + } else { + break; + } + } while (1); - // get next line of base64 encoded block - line = (unsigned char*)strtok_r(NULL, "\r\n\t ", &saveptr); - } outbuf[p] = 0; *size = p; return outbuf; -- cgit v1.1-32-gdbae