In ecpglib rewrote code that used strtok_r to not use library functions
authorMichael Meskes <meskes@postgresql.org>
Sun, 19 Feb 2012 13:50:14 +0000 (14:50 +0100)
committerMichael Meskes <meskes@postgresql.org>
Sun, 19 Feb 2012 13:50:14 +0000 (14:50 +0100)
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

index 716988c570e5363f00d188b1eb302bee420ef6ce..cf625f96a34c64789470e3962d63c05c1d844fe8 100644 (file)
 #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; 
        }
 
    }