aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2002-11-26 02:22:13 +0100
committerPaolo Carlini <paolo@gcc.gnu.org>2002-11-26 01:22:13 +0000
commitb1455c558e80a696200f259871a0ebf16baa2d7d (patch)
tree7bca89ff40dc3a09433debe2a119abd1c08b0a3f
parent162c7cd92dae4c0504dd653b948369a3f593ca32 (diff)
downloadgcc-b1455c558e80a696200f259871a0ebf16baa2d7d.zip
gcc-b1455c558e80a696200f259871a0ebf16baa2d7d.tar.gz
gcc-b1455c558e80a696200f259871a0ebf16baa2d7d.tar.bz2
localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread safety.
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
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/src/localename.cc31
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 <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.
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<char>(__cloc, 0, false));
_M_init_facet(new codecvt<char, char, mbstate_t>(__cloc));