49#ifdef _RWSTD_NO_LOCALE_NAME_FMAT
52# define _RWSTD_CAT_0(pfx) \
53 { _RWSTD_LC_CTYPE, "LC_CTYPE", pfx::_C_ctype }
54# define _RWSTD_CAT_1(pfx) \
55 { _RWSTD_LC_NUMERIC, "LC_NUMERIC", pfx::_C_numeric }
56# define _RWSTD_CAT_2(pfx) \
57 { _RWSTD_LC_TIME, "LC_TIME", pfx::_C_time }
58# define _RWSTD_CAT_3(pfx) \
59 { _RWSTD_LC_COLLATE, "LC_COLLATE", pfx::_C_collate }
60# define _RWSTD_CAT_4(pfx) \
61 { _RWSTD_LC_MONETARY, "LC_MONETARY", pfx::_C_monetary }
62# define _RWSTD_CAT_5(pfx) \
63 { _RWSTD_LC_MESSAGES, "LC_MESSAGES", pfx::_C_messages }
68#if 6 == _RWSTD_HP_aCC_MAJOR && _RWSTD_HP_aCC_MINOR <= 1600
71# pragma diag_suppress 20200
79extern const __rw_cats_t
85 _RWSTD_CAT_0 (_RW::__rw_locale),
86 _RWSTD_CAT_1 (_RW::__rw_locale),
87 _RWSTD_CAT_2 (_RW::__rw_locale),
88 _RWSTD_CAT_3 (_RW::__rw_locale),
89 _RWSTD_CAT_4 (_RW::__rw_locale),
92 _RWSTD_CAT_5 (_RW::__rw_locale)
95 _RWSTD_CAT_0 (_RW::__rw_locale)
129_C_get_cat_names (
char *
buf,
size_t bufsize)
const
131 const size_t savesize = bufsize;
135 buf =
new char [bufsize ? bufsize : (bufsize = 256)];
141 const char *common_name = 0;
147 for (
size_t i = 0;
i != __rw_n_cats; ++
i) {
149 const char *cat_name = 0;
151 for (
size_t j = 0;
j != _C_n_std_facets; ++
j) {
159 switch (_C_std_facets [
j]->_C_type) {
160 case __rw_facet::_C_num_get:
161 case __rw_facet::_C_wnum_get:
162 case __rw_facet::_C_num_put:
163 case __rw_facet::_C_wnum_put:
164 case __rw_facet::_C_money_get:
165 case __rw_facet::_C_wmoney_get:
166 case __rw_facet::_C_money_put:
167 case __rw_facet::_C_wmoney_put:
176 if ( __rw_cats [
i].cat
177 != __rw_get_cat (
int (*_C_std_facets [
j]->_C_pid)))
181 const char *facet_name = _C_std_facets [
j]->_C_name
182 ? _C_std_facets [
j]->_C_name :
"C";
184 if (cat_name && strcmp (cat_name, facet_name))
187 cat_name = facet_name;
192 if (strcmp (common_name, cat_name))
196 common_name = cat_name;
203 if ( strlen (
buf) + strlen (cat_name) + 2
209 tmp =
new char [bufsize *= 2];
223 strcat (
buf, cat_name);
229 if (__rw_facet::_C_opts & __rw_facet::_C_condensed_name) {
232 if (
'*' != common_name [0] ||
'\0' != common_name [1]) {
233 if ( savebuf &&
buf != savebuf
234 && savesize >= strlen (common_name)) {
239 strcpy (
buf, common_name);
244 const size_t len = strlen (
buf);
258__rw_expand_name (__rw_chararray &namebuf,
const char *
name)
269 bool same_cats =
true;
282 const size_t catlen = sep -
name;
286 const __rw_chararray shortname (
name, catlen);
288 __rw_chararray longname;
296 const char*
const fullname =
297 __rw_locale_name (__rw_cats [
i].cat, shortname.data (),
303 const size_t namelen = strlen (fullname);
311 same_cats = !memcmp (namebuf.data (), fullname, namelen)
314 namebuf.append (fullname, namelen);
316 if (++
i == __rw_n_cats || !*sep)
324 else if (
'\0' == *
name) {
327 const __rw_setlocale
loc (
name, _RWSTD_LC_ALL, 1 );
333 for (
size_t i = 0; ; ) {
336 const char*
const fullname = setlocale (__rw_cats [
i].cat, 0);
341 const size_t namelen = strlen (fullname);
344 same_cats = !memcmp (namebuf.data (), fullname, namelen)
347 namebuf.append (fullname, namelen);
349 if (++
i == __rw_n_cats)
356 if (*namebuf.data ()) {
358 if (same_cats && __rw_facet::_C_opts & __rw_facet::_C_condensed_name) {
362 char*
const data = namebuf.data ();
366 namebuf.acquire (
data, sepinx);
367 namebuf.append (
"", 1);
372 const char*
const fullname =
373 __rw_locale_name (_RWSTD_LC_ALL,
name, namebuf);
379 return namebuf.data ();
391 char *first_end = bufbeg;
398 const char *ps =
name;
403 next = ps + strlen (ps);
405 memcpy (pbuf, ps, next - ps);
406 pbuf [next - ps] =
'\0';
408 if (__i < __rw_n_cats) {
410 const int cat = __rw_cats [__i++].cat;
414 if (!__rw_locale_name (cat, pbuf, pbuf, pbuf - bufbeg))
418 const size_t len = strlen (pbuf);
420 if (first_end == bufbeg)
421 first_end = pbuf +
len;
423 && (
size_t (first_end - bufbeg) !=
len
424 || memcmp (bufbeg, pbuf,
len))) {
445 while (__i < __rw_n_cats) {
447 const int cat = __rw_cats [__i++].cat;
449 const __rw_setlocale
loc (
"", cat, 1 );
454 const char* catname = setlocale (cat, 0);
458 strcat (pbuf, catname);
462 if (first_end && memcmp (bufbeg,
name, first_end -
name))
465 pbuf += strlen (pbuf);
475 if ( __rw_facet::_C_opts & __rw_facet::_C_condensed_name
477 bufbeg [first_end - bufbeg] =
'\0';
482 name = __rw_locale_name (_RWSTD_LC_ALL,
name, bufbeg, bufsize);
495_C_get_facet_inx (
size_t id)
const
501 if (
id <= _C_n_std_facets)
507 for (
size_t i = 0;
i != _C_n_usr_facets; ++
i) {
511 if (*_C_usr_facets [
i]->_C_pid ==
id)
512 return i + _C_n_std_facets;
515 return _RWSTD_SIZE_MAX;
520__rw_locale (
const char *
name)
521 : _C_usr_facets (0), _C_n_usr_facets (0), _C_ref (1),
522 _C_std_facet_bits (0), _C_byname_facet_bits (0)
531 __rw_chararray fullname;
532 fullname.acquire (_C_namebuf, 0);
536 _C_name = __rw_expand_name (fullname,
name);
546 const size_t namelen = strlen (
name) + 1;
549 char*
const tmp = namelen <
sizeof _C_namebuf
550 ? _C_namebuf :
new char [namelen];
558 _C_std_facet_bits = _C_all;
561 _C_byname_facet_bits = 0;
569 for (
const char *nm = _C_name; *nm &&
inx != __rw_n_cats; ++nm) {
572 _C_byname_facet_bits |= __rw_cats [
inx].facet_bits;
583 if (!__rw_is_C (_C_name))
584 _C_byname_facet_bits = _C_all;
587#if defined (__i386__) || !defined (__GNUG__) || __GNUG__ < 3
589 memset (_C_std_facets, 0,
sizeof _C_std_facets);
600 for (
size_t i = 0;
i != _C_n_std_facets; ++
i)
601 _C_std_facets [
i] = 0;
610_C_LC2category (
int cat)
613 case _RWSTD_LC_ALL: cat = __rw_cat_all;
break;
614 case _RWSTD_LC_COLLATE: cat = __rw_cat_collate;
break;
615 case _RWSTD_LC_CTYPE: cat = __rw_cat_ctype;
break;
616 case _RWSTD_LC_MONETARY: cat = __rw_cat_monetary;
break;
617 case _RWSTD_LC_NUMERIC: cat = __rw_cat_numeric;
break;
618 case _RWSTD_LC_TIME: cat = __rw_cat_time;
break;
619#ifdef _RWSTD_LC_MESSAGES
620 case _RWSTD_LC_MESSAGES: cat = __rw_cat_messages;
break;
633_C_LC2facet_bits (
int cat)
638 case _RWSTD_LC_ALL: bits = __rw_locale::_C_all;
break;
639 case _RWSTD_LC_COLLATE: bits = __rw_locale::_C_collate;
break;
640 case _RWSTD_LC_CTYPE: bits = __rw_locale::_C_ctype;
break;
641 case _RWSTD_LC_MONETARY: bits = __rw_locale::_C_monetary;
break;
642 case _RWSTD_LC_NUMERIC: bits = __rw_locale::_C_numeric;
break;
643 case _RWSTD_LC_TIME: bits = __rw_locale::_C_time;
break;
644#ifdef _RWSTD_LC_MESSAGES
645 case _RWSTD_LC_MESSAGES: bits = __rw_locale::_C_messages;
break;
653 if (cat & __rw_cat_collate)
654 bits |= _RW::__rw_locale::_C_collate;
655 if (cat & __rw_cat_ctype)
656 bits |= _RW::__rw_locale::_C_ctype;
657 if (cat & __rw_cat_monetary)
658 bits |= _RW::__rw_locale::_C_monetary;
659 if (cat & __rw_cat_numeric)
660 bits |= _RW::__rw_locale::_C_numeric;
661 if (cat & __rw_cat_time)
662 bits |= _RW::__rw_locale::_C_time;
663 if (cat & __rw_cat_messages)
664 bits |= _RW::__rw_locale::_C_messages;
679 if (_C_name != _C_namebuf)
684 for (
size_t i = 0;
i != _C_n_std_facets; ++
i) {
686 if (!_C_std_facets [
i])
689 _RWSTD_ASSERT (_C_std_facets [
i]->_C_type != __rw_facet::_C_invalid);
691 if (_C_std_facets [
i]->_C_type) {
696 const __rw_facet*
const pfacet =
697 __rw_facet::_C_manage (_C_std_facets [
i],
698 _C_std_facets [
i]->_C_type,
699 _C_std_facets [
i]->_C_name,
708 const size_t ref = _C_remove_ref (*_C_std_facets [
i]);
713 delete _C_std_facets [
i];
721 for (
size_t j = 0;
j != _C_n_usr_facets; ++
j) {
725 _RWSTD_ASSERT (_C_usr_facets [
j]->_C_type != __rw_facet::_C_invalid);
728 const size_t ref = _C_remove_ref (*_C_usr_facets [
j]);
733 delete _C_usr_facets [
j];
736 delete[] _C_usr_facets;
744cmplocales (
const void *pv1,
const void *pv2)
749 const __rw_locale*
const pl1 =
751 const __rw_locale*
const pl2 =
757 return strcmp (pl1->_C_get_name (), pl2->_C_get_name ());
763cmplocale (
const void *pv1,
const void *pv2)
770 const __rw_locale*
const plocale =
776 return strcmp (nm1, plocale->_C_get_name ());
797_C_manage (__rw_locale *plocale,
const char *locname)
800 static __rw_locale* locale_buf [8];
801 static __rw_locale**
locales = locale_buf;
802 static __rw_locale* classic = 0;
803 static size_t n_locales = 0;
804 static size_t locale_bufsize =
805 sizeof locale_buf /
sizeof *locale_buf;
811 static __rw_locale* global = 0;
817 static volatile int ginit ;
823 global = _C_manage (0,
"C");
829 while (ginit < 1000) { }
836 __rw_locale*
const tmp = global;
869 bool is_C_locale = __rw_is_C (locname);
874 locname = __rw_C_locale_name;
876 __rw_chararray fullname;
878 if (!plocale && !is_C_locale) {
882 locname = __rw_expand_name (fullname, locname);
887 is_C_locale = __rw_is_C (locname);
890 locname = __rw_C_locale_name;
899 const void*
const pl =
900 bsearch (locname,
locales, n_locales,
sizeof *
locales, &cmplocale);
916 static const size_t bufsize =
917 sizeof locale_buf /
sizeof *locale_buf;
921 if (n_locales < bufsize / 2 &&
locales != locale_buf) {
940 locale_bufsize = bufsize;
952 if (!__rw_is_C (plocale->_C_name))
975 const void*
const pcl =
976 bsearch (locname,
locales, n_locales,
sizeof *
locales, &cmplocale);
991 if (n_locales == locale_bufsize) {
994 __rw_locale**
const tmp =
995 new __rw_locale* [n_locales * 2];
1003 locale_bufsize *= 2;
1006 if (__rw_is_C (locname)) {
1014 char _C_buf [
sizeof (__rw_locale)];
1019 classic =
new (&classic_body) __rw_locale (locname);
1032 plocale =
new __rw_locale (locname);
1040 locales [n_locales++] = plocale;
1056_C_is_managed (
int cat)
const
1061 if (cat == __rw_cat_none) {
1064 if (_C_n_usr_facets) {
1074 if ( (_C_std_facet_bits & _C_all) != _C_all
1075 || (_C_byname_facet_bits & _C_collate)
1076 && (_C_byname_facet_bits & _C_collate) != _C_collate
1077 || (_C_byname_facet_bits & _C_ctype)
1078 && (_C_byname_facet_bits & _C_ctype) != _C_ctype
1079 || (_C_byname_facet_bits & _C_monetary)
1080 && (_C_byname_facet_bits & _C_monetary) != _C_monetary
1081 || (_C_byname_facet_bits & _C_numeric)
1082 && (_C_byname_facet_bits & _C_numeric) != _C_numeric
1083 || (_C_byname_facet_bits & _C_time)
1084 && (_C_byname_facet_bits & _C_time) != _C_time
1085 || (_C_byname_facet_bits & _C_messages)
1086 && (_C_byname_facet_bits & _C_messages) != _C_messages)
1094 const char* locname = _C_name ? _C_name :
"C";
1106 size_t loclen = next ? next - locname : strlen (locname);
1112 for (
size_t i = 0, catinx = 0;
i != _C_n_std_facets; ++
i) {
1114 if (0 == _C_std_facets [
i]) {
1119 const __rw_facet::_C_facet_type facet_type =
1120 _C_get_facet_type (*_C_std_facets [
i]);
1122 switch (facet_type) {
1123 case __rw_facet::_C_money_get:
1124 case __rw_facet::_C_money_put:
1125 case __rw_facet::_C_num_get:
1126 case __rw_facet::_C_num_put:
1127 case __rw_facet::_C_wmoney_get:
1128 case __rw_facet::_C_wmoney_put:
1129 case __rw_facet::_C_wnum_get:
1130 case __rw_facet::_C_wnum_put:
1139 while (next && !(__rw_cats [catinx].facet_bits & (1 <<
i))) {
1152 locname = _C_name ? _C_name :
"C";
1162 loclen = next - locname;
1164 loclen = strlen (locname);
1170 const char*
const facet_name =
1171 _C_std_facets [
i]->_C_get_name ();
1177 if ( strlen (facet_name) != loclen
1178 || memcmp (locname, facet_name, loclen)) {
1193 const int bits = _C_LC2facet_bits (cat);
1195 const int std_bits = bits & int (_C_std_facet_bits);
1197 if (std_bits ? bits == std_bits
1198 : bits == (bits & int (_C_byname_facet_bits)))
1225 _RW::__rw_locale*
const body =
rhs._C_body;
1235 locale destroy (*_C_body);
#define _RWSTD_ATOMIC_PREINCREMENT(x, ignore)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_ATOMIC_PREDECREMENT(x, ignore)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_CONST_CAST(T, x)
#define _RWSTD_MT_STATIC_GUARD(name)
const struct @19 locales[]