diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-26 01:22:13 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-26 01:22:13 +0000 |
commit | 145200b6c8b73baa0b8e7ee048e4aca1ba0d9e3c (patch) | |
tree | 7bca89ff40dc3a09433debe2a119abd1c08b0a3f /libstdc++-v3/src/localename.cc | |
parent | 279dda50554686af3140c454f49fcc009dbf9fd4 (diff) | |
download | gcc-145200b6c8b73baa0b8e7ee048e4aca1ba0d9e3c.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59486 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/src/localename.cc')
-rw-r--r-- | libstdc++-v3/src/localename.cc | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index 0a2c5210215..daed6f1f203 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<char>(__cloc, 0, false)); _M_init_facet(new codecvt<char, char, mbstate_t>(__cloc)); |