From 84ff5b5db5f801f5da6690d8904cc88cea4700e8 Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Sun, 19 Feb 2012 14:50:14 +0100
Subject: [PATCH] In ecpglib rewrote code that used strtok_r to not use library
 functions anymore. This way we don't have to worry which compiler on which OS
 offers which version of strtok.

---
 src/interfaces/ecpg/ecpglib/connect.c | 42 ++++++++++++++++-----------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index 716988c570e..cf625f96a34 100644
--- a/src/interfaces/ecpg/ecpglib/connect.c
+++ b/src/interfaces/ecpg/ecpglib/connect.c
@@ -10,10 +10,6 @@
 #include "extern.h"
 #include "sqlca.h"
 
-#ifdef WIN32_ONLY_COMPILER
-#define strtok_r(s,d,p) strtok_s(s,d,p)
-#endif
-
 #ifdef ENABLE_THREAD_SAFETY
 static pthread_mutex_t connections_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_key_t actual_connection_key;
@@ -560,25 +556,37 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
 	}
 	if (options)
 	{
-		char *saveptr, *token1, *token2, *str;
+		char *str;
 
 		/* options look like this "option1 = value1 option2 = value2 ... */
 		/* we have to break up the string into single options */
-		for (str = options; ; str = NULL)
+		for (str = options; *str;)
 		{
-			token1 = strtok_r(str, "=", &saveptr);
-			if (token1 == NULL)
-				break;
-			/* strip leading blanks */
-			for (; *token1 && *token1 == ' '; token1++); 
+			int e, a;
+			char *token1, *token2;
 
-			token2 = strtok_r(NULL, "&", &saveptr);
-			if (token2 == NULL)
-                                break;
+			for (token1 = str; *token1 && *token1 == ' '; token1++); 
+			for (e = 0; token1[e] && token1[e] != '='; e++);
+			if (token1[e]) /* found "=" */
+			{
+				token1[e] = '\0';
+				for (token2 = token1 + e + 1; *token2 && *token2 == ' '; token2++);
+				for (a = 0; token2[a] && token2[a] != '&'; a++);
+				if (token2[a]) /* found "&" => another option follows */
+				{
+					token2[a] = '\0';
+					str = token2 + a + 1;
+				}
+				else
+					str = token2 + a;
 
-			conn_keywords[i] = token1;
-			conn_values[i] = token2;
-			i++;
+				conn_keywords[i] = token1;
+				conn_values[i] = token2;
+				i++;
+			}	
+			else
+				/* the parser should not be able to create this invalid option */
+				str = token1 + e; 
 		}
 
 	}
-- 
GitLab