File B0003-base64-get-rid-of-strtok_r-and-use-strspn-strcspn-instead.patch of Package libplist.4095
From 86ae825fb67734391fc7cc72d5c9b004570ab0a9 Mon Sep 17 00:00:00 2001
From: Nikias Bassen <nikias@gmx.li>
Date: Tue, 12 Nov 2013 18:17:00 +0100
Subject: [PATCH] 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(-)
diff --git a/src/base64.c b/src/base64.c
index acec723..83205c2 100644
--- a/src/base64.c
+++ b/src/base64.c
@@ -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;