44#if 6 == _RWSTD_HP_aCC_MAJOR && _RWSTD_HP_aCC_MINOR <= 1600
47# pragma diag_suppress 20200
58__rw_combine_names (__rw_chararray &locname,
59 const char *name_1,
const char *name_2,
int cat)
67 for (_RWSTD_SIZE_T
i = 0;
i != __rw_n_cats; ++
i) {
72 nxt1 = name_1 + strlen (name_1);
75 nxt2 = name_2 + strlen (name_2);
78 const int c = __rw_locale::_C_LC2category (__rw_cats [
i].cat);
95 locname.append (from,
len);
108_C_construct (
const __rw_locale &
rhs,
const __rw_facet *pfacet)
114#if defined (__i386__) || !defined (__GNUG__) || __GNUG__ < 3
116 memcpy (_C_std_facets,
rhs._C_std_facets,
117 _C_n_std_facets *
sizeof *_C_std_facets);
125 for(_RWSTD_SIZE_T
i = 0;
i != _C_n_std_facets;
i++)
126 _C_std_facets [
i] =
rhs._C_std_facets [
i];
133 _RWSTD_SIZE_T
inx = pfacet
134 ?
rhs._C_get_facet_inx (*pfacet->_C_pid) : (_RWSTD_SIZE_T)(-1);
137 _C_n_usr_facets =
rhs._C_n_usr_facets
138 + (
inx >
rhs._C_n_usr_facets + _C_n_std_facets);
141 _C_usr_facets = _C_n_usr_facets ?
new __rw_facet* [_C_n_usr_facets] : 0;
144 memcpy (_C_usr_facets,
rhs._C_usr_facets,
145 rhs._C_n_usr_facets *
sizeof *_C_usr_facets);
152 _C_std_facet_bits =
rhs._C_std_facet_bits;
153 _C_byname_facet_bits =
rhs._C_byname_facet_bits;
158 if (
inx < _C_n_std_facets) {
159 _C_std_facets [
inx] =
pf;
161 const _RWSTD_SIZE_T facet_bit = 1UL <<
inx;
168 _C_std_facet_bits |= facet_bit;
170 _C_std_facet_bits &= ~facet_bit;
174 _C_byname_facet_bits &= ~facet_bit;
176 _C_byname_facet_bits |= facet_bit;
182 else if ((_RWSTD_SIZE_T)(-1) ==
inx)
183 _C_usr_facets [_C_n_usr_facets - 1] =
pf;
185 _C_usr_facets [
inx - _C_n_std_facets] =
pf;
190 const _RWSTD_SIZE_T
size = strlen (
rhs._C_name) + 1;
191 char*
const name =
size <=
sizeof _C_namebuf
192 ? _C_namebuf :
new char [
size];
199 for (
inx = 0;
inx != _C_n_std_facets; ++
inx) {
200 if (_C_std_facets [
inx])
202 _C_std_facets [
inx]->_C_mutex);
205 for (
inx = 0;
inx != _C_n_usr_facets; ++
inx) {
207 _C_usr_facets [
inx]->_C_mutex);
213_C_construct (
const __rw_locale &
one,
const __rw_locale &other,
int cat)
222 _C_n_usr_facets =
one._C_n_usr_facets;
225 _C_usr_facets = _C_n_usr_facets ?
new __rw_facet* [_C_n_usr_facets] : 0;
228 memcpy (_C_std_facets,
one._C_std_facets,
229 _C_n_std_facets *
sizeof *_C_std_facets);
232 memcpy (_C_usr_facets,
one._C_usr_facets,
233 _C_n_usr_facets *
sizeof *_C_usr_facets);
236 const int bits = _C_LC2facet_bits (cat);
238 _C_std_facet_bits =
one._C_std_facet_bits & ~bits
239 | other._C_std_facet_bits & bits;
241 _C_byname_facet_bits =
one._C_byname_facet_bits & ~bits
242 | other._C_byname_facet_bits & bits;
244 for (_RWSTD_SIZE_T
i = 0;
i != _C_n_std_facets; ++
i) {
248 const int c = _C_LC2category (__rw_get_cat (
int (
i) + 1));
252 _C_std_facets [
i] = other._C_std_facets [
i];
255 if (_C_std_facets [
i]) {
258 _C_std_facets [
i]->_C_mutex);
263 for (_RWSTD_SIZE_T
j = 0;
j != _C_n_usr_facets; ++
j) {
268 _C_usr_facets [
j]->_C_mutex);
271 __rw_chararray locname;
273 __rw_combine_names (locname,
one._C_name, other._C_name, cat);
275 if (locname.size () >=
one._C_namebuf_size)
276 _C_name = locname.release ();
278 _C_name = _C_namebuf;
279 memcpy (_C_namebuf, locname.data (), locname.size () + 1);
284_RW::__rw_locale* __rw_locale::
285_C_combine (
const __rw_facet *pfacet)
const
298 const char*
const one_locname = _C_name ? _C_name :
"C";
301 const char*
const facet_locname =
302 pfacet->_C_name ? pfacet->_C_name :
"C";
305 const int facet_cat =
306 _C_LC2category (__rw_get_cat (
int (*pfacet->_C_pid)));
308 bool managed =
false;
310 if (pfacet->_C_type && !_C_n_usr_facets) {
317 const _RWSTD_SIZE_T facet_bit =
318 (_RWSTD_SIZE_T)1U << (*pfacet->_C_pid - 1U);
341 if (__rw_locale::_C_all == (_C_std_facet_bits | facet_bit)) {
345 const int cat_bits = _C_LC2facet_bits (facet_cat);
348 const _RWSTD_SIZE_T facet_inx =
349 _C_get_facet_inx (*pfacet->_C_pid);
359 for (_RWSTD_SIZE_T
i = 0;
i != _C_n_std_facets; ++
i) {
362 if (!((1 <<
i) & cat_bits))
369 const char*
const ones_facet_locname =
370 _C_std_facets [
i] ? _C_std_facets [
i]->_C_name
371 ? _C_std_facets [
i]->_C_name :
"C" : one_locname;
373 if (strcmp (facet_locname, ones_facet_locname)) {
381 __rw_locale *plocale;
385 __rw_chararray locname;
386 __rw_combine_names (locname, one_locname, facet_locname, facet_cat);
388 plocale = __rw_locale::_C_manage (0, locname.data ());
394 plocale =
new __rw_locale (*
this, pfacet);
397 _RWSTD_ASSERT (!plocale->_C_is_managed (_STD::locale::none));
404__rw_locale* __rw_locale::
405_C_combine (
const __rw_locale &other,
int cat)
408 cat = _C_LC2category (cat);
411 if (!_C_check_category (cat))
417 if (
this == &other || _STD::locale::none == cat) {
430 if (_RWSTD_LC_ALL == cat || _STD::locale::all == cat) {
439 if ( _C_is_managed (_STD::locale::all & ~cat)
440 && other._C_is_managed (cat)) {
446 const char *name_1 = _C_name;
447 const char *name_2 = other._C_name;
449 if (0 == strcmp (name_1, name_2)) {
451 __rw_locale*
const plocale = __rw_locale::_C_manage (0, name_1);
459 __rw_chararray locname;
462 __rw_combine_names (locname, name_1, name_2, cat);
465 __rw_locale*
const plocale =
466 __rw_locale::_C_manage (0, locname.data ());
478 __rw_locale *plocale =
new __rw_locale (*
this, other, cat);
480 _RWSTD_ASSERT (!plocale->_C_is_managed (_STD::locale::none));
486 __rw_locale* __rw_locale::
487_C_get_body (__rw_locale *
one,
491 const __rw_facet *pfacet)
493 __rw_chararray realname;
496 if (locname && !strncmp (locname,
"LC_", 3)) {
502 const char *pcatnames [__rw_n_cats] = { 0 };
509 for (
const char *
s = locname; *
s; ) {
511 const char *next = strchr (
s, *sep);
513 next =
s + strlen (
s);
515 const char*
const endcat = strchr (
s,
'=');
523 for (_RWSTD_SIZE_T
i = 0;
i != __rw_n_cats; ++
i) {
524 if (!strncmp (__rw_cats [
i].
name,
s, endcat -
s)) {
528 pcatnames [
i] = endcat + 1;
533 s = *next ? next + 1 : next;
537 _RWSTD_SIZE_T
size = 0;
538 for (_RWSTD_SIZE_T
i = 0;
i != __rw_n_cats; ++
i) {
540 if (!pcatnames [
i]) {
545 const char *endcat = strchr (pcatnames [
i], *sep);
548 endcat = pcatnames [
i] + strlen (pcatnames [
i]);
550 const _RWSTD_SIZE_T catsize = endcat - pcatnames [
i];
553 realname.append (pcatnames [
i], catsize);
559 locname = realname.data ();
566 if (!
one && !other && !locname && _STD::locale::none == cat && !pfacet) {
568 __rw_locale*
const global = __rw_locale::_C_manage (0, 0);
575 if (
one && !other && !locname && _STD::locale::none == cat && !pfacet) {
585 if (!
one && !other && locname && _STD::locale::none == cat && !pfacet) {
588 __rw_locale*
const plocale = __rw_locale::_C_manage (0, locname);
590 _RWSTD_ASSERT (!plocale || plocale->_C_is_managed (_STD::locale::none));
595 if (
one && !other && !locname && _STD::locale::none == cat && pfacet) {
601 __rw_locale*
const plocale =
one->_C_combine (pfacet);
608 if (
one && !other && locname && !pfacet) {
612 const _STD::locale
tmp (locname);
615 __rw_locale*
const plocale =
one->_C_combine (*
tmp._C_body, cat);
620 if (
one && other && !locname && !pfacet) {
622 return one->_C_combine (*other, cat);
625 _RWSTD_ASSERT (!
"logic error: bad combination of arguments");
638locale (
const char *locname)
643 _RWSTD_FUNC (
"locale::locale (const char*)"),
"(null)"));
645 _C_body = _RW::__rw_locale::_C_get_body (0, 0, locname, none, 0);
650 _RWSTD_FUNC (
"locale::locale (const char*)"), locname));
656locale (
const locale &
rhs,
const char *locname, category cat)
662 "const char*, category)"),
"(null"));
664 _C_body = _RW::__rw_locale::_C_get_body (
rhs._C_body, 0, locname, cat, 0);
670 "const char*, category)"), locname));
676locale (
const locale &
one,
const locale &other, category cat)
677 : _C_body (_RW::__rw_locale::_C_get_body (
one._C_body, other._C_body,
684 "const locale&, category)"), cat));
690locale (_RW::__rw_locale &
rhs,
const facet *pfacet)
691 : _C_body (_RW::__rw_locale::_C_get_body (&
rhs, 0, 0, none, pfacet))
697const locale::facet* locale::
698_C_get_facet (
const id &fid)
const
710 const _RWSTD_SIZE_T
inx = _C_body->_C_get_facet_inx (fid._C_id);
711 if ((_RWSTD_SIZE_T)(-1) ==
inx)
714 const locale::facet*
const pfacet =
inx < _RW::__rw_locale::_C_n_std_facets
715 ? _C_body->_C_std_facets [
inx]
716 : _C_body->_C_usr_facets [
inx - _RW::__rw_locale::_C_n_std_facets];
#define _RWSTD_REQUIRES(pred, args)
#define _RWSTD_ATOMIC_PREINCREMENT(x, ignore)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_FUNC(ignore)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_CONST_CAST(T, x)
#define _RWSTD_ERROR_LOCALE_BAD_NAME
#define _RWSTD_ERROR_LOCALE_BAD_CAT