42#if !defined (_RWSTD_NO_NL_TYPES_H) && !defined (_RWSTD_NO_CATOPEN_CATGETS)
49#define _RWSTD_BAD_CATD ((nl_catd)-1)
64struct __rw_open_cat_data
69 char _C_data [
sizeof (_STD::locale)];
73struct __rw_open_cat_page
75 static const size_t _C_size = 8;
77 __rw_open_cat_page* _C_next;
78 __rw_open_cat_data _C_data [_C_size];
98static __rw_open_cat_data*
99__rw_manage_cat_data (
int &cat, __rw_open_cat_data *pcat_data)
102 static __rw_open_cat_data* catalog_buf [__rw_open_cat_page::_C_size];
103 static __rw_open_cat_data** catalogs = 0;
106 static __rw_open_cat_page catalog_page;
108 static size_t n_catalogs = 0;
109 static size_t catalog_bufsize =
sizeof catalog_buf /
sizeof *catalog_buf;
110 static size_t largest_cat = 0;
114 for (
size_t i = 0;
i < catalog_bufsize; ++
i) {
116 catalog_buf [
i] = &catalog_page._C_data [
i];
119 catalogs = catalog_buf;
128 if (n_catalogs == catalog_bufsize) {
131 __rw_open_cat_page*
const page =
132 new __rw_open_cat_page;
135 page->_C_next = catalog_page._C_next;
136 catalog_page._C_next = page;
139 for (
size_t i = 0;
i < __rw_open_cat_page::_C_size; ++
i) {
144 __rw_open_cat_data**
const data =
145 new __rw_open_cat_data* [n_catalogs + __rw_open_cat_page::_C_size];
147 memcpy (
data, catalogs, n_catalogs *
sizeof *
data);
149 if (catalogs != catalog_buf)
153 catalog_bufsize += __rw_open_cat_page::_C_size;
155 for (
size_t i = 0;
i < __rw_open_cat_page::_C_size; ++
i) {
156 catalogs [n_catalogs +
i] = &page->_C_data [
i];
159 cat = int (n_catalogs);
161 catalogs [cat]->catd = pcat_data->catd;
162 memcpy (&catalogs [cat]->
loc, &pcat_data->loc,
163 sizeof (_STD::locale));
165 if (
size_t (cat) > largest_cat)
166 largest_cat = size_t (cat);
177 catalogs [cat]->catd = pcat_data->catd;
178 memcpy (&catalogs [cat]->
loc, &pcat_data->loc,
179 sizeof (_STD::locale));
181 if (
size_t (cat) > largest_cat)
182 largest_cat = size_t (cat);
190 if (0 == pcat_data) {
192 if (
size_t (cat) < catalog_bufsize)
193 return catalogs [cat];
202 if (
size_t (cat) == largest_cat) {
207 for (
int i = cat;
i >= 0; --
i) {
209 largest_cat = size_t (
i);
214 static const size_t bufsize =
215 sizeof catalog_buf /
sizeof *catalog_buf;
217 if ((largest_cat < bufsize / 2) && (catalogs != catalog_buf)) {
222 catalog_bufsize = bufsize;
224 memcpy (catalog_buf, catalogs,
225 catalog_bufsize *
sizeof (*catalogs));
229 catalogs = catalog_buf;
232 while (catalog_page._C_next)
235 __rw_open_cat_page* page = catalog_page._C_next;
236 catalog_page._C_next = page->_C_next;
252int __rw_cat_open (
const _STD::string &cat_name,
const _STD::locale &
loc)
260 __rw_open_cat_data cat_data;
261 cat_data.catd = catd;
262 new (&cat_data.loc) _STD::locale (
loc);
265 __rw_manage_cat_data (cat, &cat_data);
274const char* __rw_get_message (
int cat,
int set_num,
int msg_num)
281 __rw_open_cat_data *
const pcat_data = __rw_manage_cat_data (cat, 0);
286 const char dflt[] =
"";
288 const nl_catd catd = pcat_data->catd;
290 const char*
const text =
catgets (catd, set_num, msg_num, dflt);
301const _STD::locale& __rw_get_locale (
int cat)
306 __rw_open_cat_data*
const pcat_data = __rw_manage_cat_data (cat, 0);
315void __rw_cat_close (
int cat)
317 bool cat_closed =
false;
324 __rw_open_cat_data*
const pcat_data =
325 cat < 0 ? 0 : __rw_manage_cat_data (cat, 0);
332 _STD::locale*
const ploc =
337 __rw_manage_cat_data (cat, pcat_data);
#define _RWSTD_REQUIRES(pred, args)
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_FUNC(ignore)
#define _RWSTD_MT_CLASS_GUARD(type)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_ERROR_INVALID_ARGUMENT
nl_catd catopen(const char *, int)
const char * catgets(nl_catd, int, int, const char *)