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;
openSUSE Build Service is sponsored by