]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread...
authorPaolo Carlini <pcarlini@unitus.it>
Tue, 26 Nov 2002 01:22:13 +0000 (02:22 +0100)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 26 Nov 2002 01:22:13 +0000 (01:22 +0000)
2002-11-25  Paolo Carlini  <pcarlini@unitus.it>
    Nathan Myers  <ncm@cantrip.org>

* src/localename.cc
(locale::_Impl::_Impl(const char*, size_t)):
Avoid strtok for thread safety.

Co-Authored-By: Nathan Myers <ncm@cantrip.org>
From-SVN: r59486

libstdc++-v3/ChangeLog
libstdc++-v3/src/localename.cc

index 57c188c56f25dce41b8bee5d8d6d5e37891b0122..fbf147f5a8c70625ae34d52ce6850cdda392327a 100644 (file)
@@ -1,3 +1,10 @@
+2002-11-25  Paolo Carlini  <pcarlini@unitus.it>
+            Nathan Myers  <ncm@cantrip.org>
+
+       * src/localename.cc
+       (locale::_Impl::_Impl(const char*, size_t)):
+       Avoid strtok for thread safety.
+
 2002-11-25  Stephen M. Webb  <stephen@bregmasoft.com>
 
        * testsuite/testsuite_allocator.h: New file.
index 0a2c5210215f6714531d956de469ec4adbfd3cdd..daed6f1f20326853c3b5ede3c20da897c02dd0e6 100644 (file)
@@ -141,9 +141,9 @@ namespace std
       }
 
     // Name all the categories.
+    size_t __len = strlen(__s) + 1;
     if (!strchr(__s, ';'))
       {
-       size_t __len = strlen(__s) + 1;
        for (size_t __i = 0; 
             __i < _S_categories_size + _S_extra_categories_size; ++__i)
          {
@@ -152,27 +152,28 @@ namespace std
          }
       }
     else
-      {
-       char* __tmp = strdup(__s);
-       __tmp[strlen(__tmp)] = ';';
-       strtok(__tmp, "=;");
+     {
+       char* __new;
+       const char* __save = __s;
+       char* __next = strpbrk(__save, "=;");
+       __save = __next + 1;
        for (size_t __i = 0; 
             __i < _S_categories_size + _S_extra_categories_size - 1; ++__i)
          {
-           char* __src = strtok(NULL, "=;");
-           char* __new = new char[strlen(__src) + 1];
-           strcpy(__new, __src);
+           __next = strpbrk(__save, "=;");
+           __new = new char[__next - __save + 1];
+           memcpy(__new, __save, __next - __save);
+           __new[__next - __save] = '\0';
            _M_names[__i] = __new;
-           strtok(NULL, "=;");
+           __save = __next + 1;
+           __next = strpbrk(__save, "=;");
+           __save = __next + 1;
          }
-       char* __src = strtok(NULL, "=;");
-       char* __new = new char[strlen(__src) + 1];
-       strcpy(__new, __src);
+       __new = new char[__s + __len - __save];
+       memcpy(__new, __save, __s + __len - __save);
        _M_names[_S_categories_size + _S_extra_categories_size - 1] = __new;
-
-       free(__tmp);
       }
-      
+
     // Construct all standard facets and add them to _M_facets.  
     _M_init_facet(new std::ctype<char>(__cloc, 0, false));
     _M_init_facet(new codecvt<char, char, mbstate_t>(__cloc));