]> granicus.if.org Git - postgresql/commitdiff
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; 
                }
 
        }