36#if defined (__linux__) && !defined (_XOPEN_SOURCE)
54# if defined (__INTERIX) && !defined (NAME_MAX)
66# define PATH_MAX MAX_PATH
76__rw_mutex __rw_setlocale_mutex;
80__rw_setlocale::__rw_setlocale (
const char *locname,
int cat,
int nothrow)
81 : _C_name (0), _C_guard (1), _C_cat (cat)
84 __rw_setlocale_mutex._C_acquire ();
87 const char*
const curname = ::setlocale (cat, 0);
93 if (locname && !
nothrow && !::strcmp (locname, curname))
99 const _RWSTD_SIZE_T
size = ::strlen (curname) + 1;
100 _C_name =
size <=
sizeof _C_namebuf ? _C_namebuf :
new char [
size];
102 ::memcpy (_C_name, curname,
size);
104 if (::setlocale (cat, locname)) {
111 __rw_setlocale_mutex._C_release ();
117 if (_C_name != _C_namebuf)
125 __rw_setlocale_mutex._C_release ();
136__rw_setlocale::~__rw_setlocale ()
142 ::setlocale (_C_cat, _C_name);
145 __rw_setlocale_mutex._C_release ();
148 if (_C_name != _C_namebuf)
153char* __rw_locale_name (
int cat,
const char *locname, __rw_chararray &namebuf)
161#ifndef _RWSTD_LOCALE_ROOT_ENVVAR
162# define _RWSTD_LOCALE_ROOT_ENVVAR "RWSTD_LOCALE_ROOT"
167 if (envvar && strlen (envvar) <
sizeof locale_root)
175 _RWSTD_SIZE_T namelen = strlen (locname);
177 _RWSTD_SIZE_T pathlen = 0;
181 if (namelen + strlen (
locale_root) + 1 <
sizeof locpath) {
184 pathlen = strlen (locpath);
187 locpath [pathlen] =
'\0';
191 if (strlen (locpath) + namelen <
sizeof locpath) {
193 strcpy (locpath + pathlen, locname);
197 if (0 == stat (locpath, &
sb) &&
sb.st_mode & S_IFDIR) {
199 namebuf.assign (locname);
201 return namebuf.data ();
207 const __rw_setlocale
tmp (locname, cat, 1 );
213 const char*
const fullname = setlocale (cat, locname);
217 namebuf.assign (fullname);
219 return namebuf.data ();
#define _RWSTD_REQUIRES(pred, args)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_FUNC(ignore)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_ERROR_LOCALE_BAD_NAME
#define _RWSTD_LOCALE_ROOT_ENVVAR