summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2024-05-29 16:58:29 -0400
committerJakob Kaivo <jkk@ung.org>2024-05-29 16:58:29 -0400
commitca806410c73085644116fa2979eaf3d5f3cbd35f (patch)
treef030f3df77e993d0654244315c6037c210bc7c02
parent3d00af92d2993e5fbf237e2c81b499058c21a650 (diff)
support read-only return value
-rw-r--r--src/locale/setlocale.c75
1 files changed, 50 insertions, 25 deletions
diff --git a/src/locale/setlocale.c b/src/locale/setlocale.c
index 43a69787..86c44a5f 100644
--- a/src/locale/setlocale.c
+++ b/src/locale/setlocale.c
@@ -12,44 +12,69 @@ char * setlocale(int category, const char *locale)
static char *retname = NULL;
struct __locale_t *l = __get_locale();
int mask = 0;
+ char *name_to_return = NULL;
SIGNAL_SAFE(0);
+ if (retname == NULL) {
+ retname = __readonly(RO_ALLOC, "setlocale");
+ }
+
if (locale == NULL) {
switch (category) {
- case LC_ALL: return l->all;
- case LC_COLLATE: return l->collate;
- case LC_CTYPE: return l->ctype;
- case LC_MONETARY: return l->monetary;
- case LC_NUMERIC: return l->numeric;
- case LC_TIME: return l->time;
+ case LC_ALL:
+ name_to_return = l->all;
+ break;
+
+ case LC_COLLATE:
+ name_to_return = l->collate;
+ break;
+
+ case LC_CTYPE:
+ name_to_return = l->ctype;
+ break;
+
+ case LC_MONETARY:
+ name_to_return = l->monetary;
+ break;
+
+ case LC_NUMERIC:
+ name_to_return = l->numeric;
+ break;
+
+ case LC_TIME:
+ name_to_return = l->time;
+ break;
+
#ifdef LC_MESSAGES
- case LC_MESSAGES: return l->messages;
+ case LC_MESSAGES:
+ name_to_return = l->messages;
+ break;
+ #endif
+
+ default:
+ return NULL;
+ }
+ } else {
+ switch (category) {
+ case LC_ALL: mask = LC_ALL_MASK; break;
+ case LC_COLLATE: mask = LC_COLLATE_MASK; break;
+ case LC_CTYPE: mask = LC_CTYPE_MASK; break;
+ case LC_MONETARY: mask = LC_MONETARY_MASK; break;
+ case LC_NUMERIC: mask = LC_NUMERIC_MASK; break;
+ case LC_TIME: mask = LC_TIME_MASK; break;
+ #ifdef LC_MESSAGES
+ case LC_MESSAGES: mask = LC_MESSAGES_MASK; break;
#endif
default: return NULL;
}
- }
- switch (category) {
- case LC_ALL: mask = LC_ALL_MASK; break;
- case LC_COLLATE: mask = LC_COLLATE_MASK; break;
- case LC_CTYPE: mask = LC_CTYPE_MASK; break;
- case LC_MONETARY: mask = LC_MONETARY_MASK; break;
- case LC_NUMERIC: mask = LC_NUMERIC_MASK; break;
- case LC_TIME: mask = LC_TIME_MASK; break;
- #ifdef LC_MESSAGES
- case LC_MESSAGES: mask = LC_MESSAGES_MASK; break;
- #endif
- default: return NULL;
+ name_to_return = __load_locale(l, mask, locale);
}
- /* TODO: mark return value read-only */
- if (retname == NULL) {
- retname = __readonly(RO_ALLOC, "setlocale");
- }
__readonly(RO_UNLOCK, retname);
- strcpy(retname, __load_locale(l, mask, locale));
- //__readonly(RO_LOCK, retname);
+ strcpy(retname, name_to_return);
+ __readonly(RO_LOCK, retname);
return retname;
}