From 145200b6c8b73baa0b8e7ee048e4aca1ba0d9e3c Mon Sep 17 00:00:00 2001 From: paolo Date: Tue, 26 Nov 2002 01:22:13 +0000 Subject: [PATCH] 2002-11-25 Paolo Carlini Nathan Myers * src/localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread safety. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59486 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/src/localename.cc | 31 ++++++++++++++++--------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 57c188c..fbf147f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2002-11-25 Paolo Carlini + Nathan Myers + + * src/localename.cc + (locale::_Impl::_Impl(const char*, size_t)): + Avoid strtok for thread safety. + 2002-11-25 Stephen M. Webb * testsuite/testsuite_allocator.h: New file. diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index 0a2c521..daed6f1 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -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(__cloc, 0, false)); _M_init_facet(new codecvt(__cloc)); -- 2.7.4