summaryrefslogtreecommitdiffstats
path: root/contrib/libstdc++/src/localename.cc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libstdc++/src/localename.cc')
-rw-r--r--contrib/libstdc++/src/localename.cc34
1 files changed, 16 insertions, 18 deletions
diff --git a/contrib/libstdc++/src/localename.cc b/contrib/libstdc++/src/localename.cc
index 61aa952..e9debef 100644
--- a/contrib/libstdc++/src/localename.cc
+++ b/contrib/libstdc++/src/localename.cc
@@ -141,36 +141,31 @@ namespace std
}
// Name all the categories.
+ size_t __len = strlen(__s);
if (!strchr(__s, ';'))
{
- size_t __len = strlen(__s) + 1;
for (size_t __i = 0;
__i < _S_categories_size + _S_extra_categories_size; ++__i)
{
- _M_names[__i] = new char[__len];
+ _M_names[__i] = new char[__len + 1];
strcpy(_M_names[__i], __s);
}
}
else
{
- char* __tmp = strdup(__s);
- __tmp[strlen(__tmp)] = ';';
- strtok(__tmp, "=;");
+ const char* __beg = __s;
for (size_t __i = 0;
- __i < _S_categories_size + _S_extra_categories_size - 1; ++__i)
+ __i < _S_categories_size + _S_extra_categories_size; ++__i)
{
- char* __src = strtok(NULL, "=;");
- char* __new = new char[strlen(__src) + 1];
- strcpy(__new, __src);
+ __beg = strchr(__beg, '=') + 1;
+ const char* __end = strchr(__beg, ';');
+ if (!__end)
+ __end = __s + __len;
+ char* __new = new char[__end - __beg + 1];
+ memcpy(__new, __beg, __end - __beg);
+ __new[__end - __beg] = '\0';
_M_names[__i] = __new;
- strtok(NULL, "=;");
}
- char* __src = strtok(NULL, "=;");
- char* __new = new char[strlen(__src) + 1];
- strcpy(__new, __src);
- _M_names[_S_categories_size + _S_extra_categories_size - 1] = __new;
-
- free(__tmp);
}
// Construct all standard facets and add them to _M_facets.
@@ -214,7 +209,10 @@ namespace std
: _M_references(__refs), _M_facets_size(_GLIBCPP_NUM_FACETS)
{
// Initialize the underlying locale model.
- locale::facet::_S_create_c_locale(locale::facet::_S_c_locale, "C");
+ locale::facet::_S_c_name[0] = 'C';
+ locale::facet::_S_c_name[1] = '\0';
+ locale::facet::_S_create_c_locale(locale::facet::_S_c_locale,
+ locale::facet::_S_c_name);
_M_facets = new(&facet_vec) facet*[_M_facets_size];
for (size_t __i = 0; __i < _M_facets_size; ++__i)
@@ -225,7 +223,7 @@ namespace std
__i < _S_categories_size + _S_extra_categories_size; ++__i)
{
_M_names[__i] = new (&facet_name[__i]) char[2];
- strcpy(_M_names[__i], "C");
+ strcpy(_M_names[__i], locale::facet::_S_c_name);
}
// This is needed as presently the C++ version of "C" locales
OpenPOWER on IntegriCloud