28#if defined (__PURE_CNAME)
51#define MAX_LOCALE_NAME_LEN 1024
58extern "C" char* setlocale (
int,
const char *
name)
60 static char cname[] =
"C";
65 if (
'C' !=
name [0] ||
'\0' !=
name [1])
81 for (; *
s && *
s !=
c; ++
s);
83 return *
s ==
c ? (
char*)
s : 0;
89 for (; *seps; ++seps) {
108 const char *
s1 =
str;
132#if !defined (_WIN32) || defined (__CYGWIN__)
148 int setlocale_environ = 0;
149 int loc_name_use_cat = 0;
150 int loc_name_prepend_sep = 0;
151 int loc_name_condense = 0;
152 char loc_name_cat_sep =
'\0';
153 char loc_name_cat_eq =
'\0';
162 const char *locname = setlocale (
LC_ALL,
"C");
166 if (
'C' == sep [-1] && 1 == sep - locname)
167 loc_name_cat_sep = *sep;
169 loc_name_condense = 1;
174 loc_name_condense = 1;
179 if ((locname = setlocale (
LC_ALL,
"")))
180 strcpy (namebuf, locname);
188#if defined (_MSC_VER) && _MSC_VER <= 1200
196 locname = setlocale (
LC_ALL, locname);
197 if (locname && strcmp (namebuf, locname))
202 locname = strcpy (namebuf, locname);
211 def_locale [0] =
'\0';
213 const char *tmpname = setlocale (
LC_ALL,
"");
215 strcpy (def_locale, tmpname);
218 strcpy (
buf,
"LC_COLLATE=");
219 strcat (
buf, locname);
222 tmpname = setlocale (
LC_ALL,
"");
223 setlocale_environ = tmpname ? strcmp (def_locale, tmpname) : 1;
230 loc_name_prepend_sep,
238 loc_name_prepend_sep,
253 { -1,
LC_COLLATE,
"LC_COLLATE=C",
"collate" },
254 { -1,
LC_CTYPE,
"LC_CTYPE=C",
"ctype" },
256 { -1,
LC_NUMERIC,
"LC_NUMERIC=C",
"numeric" },
257 { -1,
LC_TIME,
"LC_TIME=C",
"time" },
259#if defined (LC_MESSAGES)
264 { -1, LC_NAME,
"LC_NAME=C",
"name" },
267#if defined (LC_PAPER)
268 { -1, LC_PAPER,
"LC_PAPER=C",
"paper" },
271#if defined (LC_IDENTIFICATION)
272 { -1, LC_IDENTIFICATION,
"LC_IDENTIFICATION=C",
"ident" },
275#if defined (LC_ADDRESS)
276 { -1, LC_ADDRESS,
"LC_ADDRESS=C",
"address" },
279#if defined (LC_TELEPHONE)
280 { -1, LC_TELEPHONE,
"LC_TELEPHONE=C",
"telephone" },
283#if defined (LC_MEASUREMENT)
284 { -1, LC_MEASUREMENT,
"LC_MEASUREMENT=C",
"measurement" },
287 { -1,
LC_ALL,
"LC_ALL", 0 },
297 -1, -1, -1, -1, -1, -1
298#elif defined (__FreeBSD__) || defined (__NetBSD__)
300 -1, -1, -1, -1, -1, -1
301#elif defined (__hpux)
303 -1, -1, -1, -1, -1, -1
304#elif defined (__GLIBC__)
307# if defined (LC_PAPER)
308 LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT,
311 -1, -1, -1, -1, -1, -1
313#elif defined (__osf__)
315 -1, -1, -1, -1, -1, -1
318 -1, -1, -1, -1, -1, -1
319#elif (defined (__sun__) || defined (__sun) || defined (sun)) \
320 && defined (__svr4__)
322 -1, -1, -1, -1, -1, -1
323#elif defined (_WIN32)
325 -1, -1, -1, -1, -1, -1,
326#elif defined (__CYGWIN__)
330 -1, -1, -1, -1, -1, -1,
332 -1, -1, -1, -1, -1, -1,
333 -1, -1, -1, -1, -1, -1
344 unsigned lc_max_inx = 0;
345 unsigned lc_min_inx = 0;
349 for (
unsigned i = 0; *lc_vars [
i].name; ++
i) {
354 printf (
"#define _RWSTD_%-20s %2d\n",
355 lc_vars [
i].
name, lc_vars [
i].cat);
357 if (lc_vars [
i].cat > lc_vars [lc_max_inx].cat)
360 if (lc_vars [
i].cat < lc_vars [lc_min_inx].cat)
371 printf (
"#define %-27s _RWSTD_%s\n",
372 "_RWSTD_LC_MAX", lc_vars [lc_max_inx].
name);
381 printf (
"#define %-27s _RWSTD_%s\n",
382 "_RWSTD_LC_MIN", lc_vars [lc_min_inx].
name);
393 int setlocale_environ,
394 int &loc_name_use_cat,
395 int &loc_name_prepend_sep,
396 int loc_name_condense,
397 char &loc_name_cat_sep,
398 char &loc_name_cat_eq)
403 char lc_all[] =
"LC_ALL=";
410 for (
i = 0; lc_vars [
i].cat !=
LC_ALL; ++
i)
413 for (
i = 0; locname && lc_vars [
i].cat !=
LC_ALL; ++
i) {
415 if (setlocale_environ) {
421 setlocale (lc_vars [
i - 1].cat,
"C");
435 if (setlocale_environ) {
437 combined = setlocale (
LC_ALL,
"");
442 setlocale (lc_vars [
i].cat, locname);
443 combined = setlocale (
LC_ALL, 0);
457 loc_name_use_cat = 1;
461 if (!loc_name_cat_eq)
462 loc_name_cat_eq = where [strlen (lc_vars [
i].
name)];
467 char* first =
rw_strstr (combined, locname);
469 for (
const char *
s = combined; *
s &&
s != first; ++
j)
476 if (where != combined && !loc_name_cat_sep) {
477 loc_name_cat_sep = where [-1];
484 loc_name_prepend_sep = 1;
487 loc_name_cat_sep = *sep;
489 int j = -loc_name_prepend_sep;
492 char *first =
rw_strstr (combined, locname);
493 for (
const char *
s = combined; *
s &&
s != first; ++
j) {
513 if (combined && *combined == loc_name_cat_sep)
514 loc_name_prepend_sep = 1;
517 for (
i = 0; lc_vars [
i].cat !=
LC_ALL; ++
i) {
523 const char *comment = 0;
526 for (
int j = 0; *lc_vars [
j].name; ++
j) {
527 if (lc_vars [
i].ord ==
j) {
534 comment =
" // assumed";
540 printf (
"#define _RWSTD_CAT_%d(pfx) "
541 "{ %d, \"%s\", pfx::_C_%s }%s\n",
543 lc_vars [
i].
lower, comment ? comment :
"");
552 int setlocale_environ,
553 int loc_name_use_cat,
554 int loc_name_prepend_sep,
555 int loc_name_condense,
556 char loc_name_cat_sep,
557 char loc_name_cat_eq)
559 const char* os_name = 0;
565 setlocale_environ = 1;
566 loc_name_use_cat = 0;
567 loc_name_prepend_sep = 0;
568 loc_name_condense = 0;
569 loc_name_cat_sep =
' ';
570 loc_name_cat_eq =
'\0';
573#elif defined (__FreeBSD__)
575 setlocale_environ = 1;
576 loc_name_use_cat = 0;
577 loc_name_prepend_sep = 0;
578 loc_name_condense = 1;
579 loc_name_cat_sep =
'/';
580 loc_name_cat_eq =
'\0';
583#elif defined (__hpux)
585 setlocale_environ = 1;
586 loc_name_use_cat = 0;
587 loc_name_prepend_sep = 0;
588 loc_name_condense = 0;
589 loc_name_cat_sep =
' ';
590 loc_name_cat_eq =
'\0';
593#elif defined (__GLIBC__)
595 setlocale_environ = 1;
596 loc_name_use_cat = 1;
597 loc_name_prepend_sep = 0;
598 loc_name_condense = 0;
599 loc_name_cat_sep =
';';
600 loc_name_cat_eq =
'=';
601 os_name =
"GNU libc";
603#elif defined (__NetBSD__)
605 setlocale_environ = 0;
606 loc_name_use_cat = 0;
607 loc_name_prepend_sep = 0;
608 loc_name_condense = 1;
609 loc_name_cat_sep =
'\0';
610 loc_name_cat_eq =
'\0';
613#elif defined (__osf__)
615 setlocale_environ = 1;
616 loc_name_use_cat = 0;
617 loc_name_prepend_sep = 0;
618 loc_name_condense = 0;
619 loc_name_cat_sep =
' ';
620 loc_name_cat_eq =
'\0';
621 os_name =
"Tru64 UNIX";
625 setlocale_environ = 1;
626 loc_name_use_cat = 0;
627 loc_name_prepend_sep = 1;
628 loc_name_condense = 1;
629 loc_name_cat_sep =
'/';
630 loc_name_cat_eq =
'\0';
631 os_name =
"SGI IRIX";
633#elif (defined (__sun__) || defined (__sun) || defined (sun)) \
634 && defined (__svr4__)
636 setlocale_environ = 1;
637 loc_name_use_cat = 0;
638 loc_name_prepend_sep = 1;
639 loc_name_condense = 1;
640 loc_name_cat_sep =
'/';
641 loc_name_cat_eq =
'\0';
644#elif defined (_WIN32)
646 setlocale_environ = 0;
647 loc_name_use_cat = 1;
648 loc_name_prepend_sep = 0;
649 loc_name_condense = 1;
650 loc_name_cat_sep =
';';
651 loc_name_cat_eq =
'=';
654#elif defined (__CYGWIN__)
657 setlocale_environ = 0;
658 loc_name_use_cat = 1;
659 loc_name_prepend_sep = 0;
660 loc_name_condense = 1;
661 loc_name_cat_sep =
';';
662 loc_name_cat_eq =
'=';
669 printf (
"// no locales found, unknown system\n");
677 printf (
"// no locales found, using %s format\n", os_name);
679 if (setlocale_environ)
680 printf (
"// #define _RWSTD_NO_SETLOCALE_ENVIRONMENT\n");
682 printf (
"#define _RWSTD_NO_SETLOCALE_ENVIRONMENT\n");
684 if (loc_name_use_cat)
685 printf (
"// #define _RWSTD_NO_CAT_NAMES\n");
687 printf (
"#define _RWSTD_NO_CAT_NAMES\n");
689 if (loc_name_cat_sep)
690 printf (
"#define _RWSTD_CAT_SEP \"%c\"\n", loc_name_cat_sep);
692 printf (
"#define _RWSTD_NO_CAT_SEP\n");
695 printf (
"#define _RWSTD_CAT_EQ \"%c\"\n", loc_name_cat_eq);
697 printf (
"#define _RWSTD_NO_CAT_EQ\n");
699 if (loc_name_prepend_sep)
700 printf (
"// #define _RWSTD_NO_INITIAL_CAT_SEP\n");
702 printf (
"#define _RWSTD_NO_INITIAL_CAT_SEP\n");
704 if (loc_name_condense)
705 printf (
"// #define _RWSTD_NO_CONDENSED_NAME\n");
707 printf (
"#define _RWSTD_NO_CONDENSED_NAME\n");
IMPORT_C SInt32 printf(const Char *,...)
char * rw_strchr(const char *s, char c)
const char *const test_locale_names[]
char * rw_strpbrk(const char *s, const char *seps)
int print_categories(const char *, int, int &, int &, int, char &, char &)
#define MAX_LOCALE_NAME_LEN
char * rw_strstr(const char *str, const char *s)
int print_locale_name_format(int, int, int, int, int, char, char)