summaryrefslogtreecommitdiff
path: root/src/nonstd/__load_locale.h
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-02-28 14:16:05 -0500
committerJakob Kaivo <jkk@ung.org>2019-02-28 14:16:05 -0500
commit69315080f1665373a1753c351fee1251af0545a4 (patch)
tree61c6592146afeade2ad57d9e930a341510b571ae /src/nonstd/__load_locale.h
parent80548c779ba2302b2a4256f15d6e5f66b5dcfb18 (diff)
clean up internal namespace
Diffstat (limited to 'src/nonstd/__load_locale.h')
-rw-r--r--src/nonstd/__load_locale.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/nonstd/__load_locale.h b/src/nonstd/__load_locale.h
new file mode 100644
index 00000000..16709870
--- /dev/null
+++ b/src/nonstd/__load_locale.h
@@ -0,0 +1,111 @@
+#include <locale.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "nonstd/locale.h"
+#include "nonstd/ctype.h"
+
+#define LC_COLLATE_MASK (1<<0)
+#define LC_CTYPE_MASK (1<<1)
+#define LC_MONETARY_MASK (1<<2)
+#define LC_NUMERIC_MASK (1<<3)
+#define LC_TIME_MASK (1<<4)
+#define LC_MESSAGES_MASK (1<<5)
+
+#define stringreplace(_old, _new) do { \
+ _old = realloc(_old, strlen(_new) + 1); \
+ if (_old == NULL) { \
+ return NULL; \
+ } \
+ strcpy(_old, _new); \
+} while (0)
+
+char * __load_locale(struct __locale_t *loc, int mask, const char *name)
+{
+ char localepath[FILENAME_MAX] = "/lib/locale/";
+ strcat(localepath, name);
+
+ FILE *localefile = fopen(localepath, "rb");
+ if (localefile == NULL && strcmp(name, "C") && strcmp(name, "POSIX")) {
+ return NULL;
+ }
+
+ if (mask & LC_COLLATE_MASK) {
+ stringreplace(loc->collate, name);
+
+ /* read from file */
+ loc->collation = NULL;
+ }
+
+ if (mask & LC_CTYPE_MASK) {
+ stringreplace(loc->ctype, name);
+
+ if (localefile == NULL) {
+ int i;
+ loc->ctattr = realloc(loc->ctattr, CHAR_MAX);
+
+ for (i = 0; i < 32; i++) {
+ loc->ctattr[i] = CNTRL;
+ }
+ for (i = 'a'; i < 'z'; i++) {
+ loc->ctattr[i] = LOWER;
+ }
+ for (i = 'A'; i < 'Z'; i++) {
+ loc->ctattr[i] = UPPER;
+ }
+ for (i = '0'; i < '9'; i++) {
+ loc->ctattr[i] = DIGIT | XDIGIT;
+ }
+ /* others */
+
+ loc->ctoupper = realloc(loc->ctoupper, CHAR_MAX);
+ for (i = 0; i < CHAR_MAX; i++) {
+ loc->ctoupper[i] = ('a' <= i && i <= 'z') ? i + 32 : i;
+ }
+
+ loc->ctolower = realloc(loc->ctolower, CHAR_MAX);
+ for (i = 0; i < CHAR_MAX; i++) {
+ loc->ctolower[i] = ('A' <= i && i <= 'Z') ? i - 32 : i;
+ }
+ } else {
+ /* read from file */
+ loc->ctattr = NULL;
+ loc->ctoupper = NULL;
+ loc->ctolower = NULL;
+ }
+ }
+
+ if (mask & LC_MONETARY_MASK) {
+ stringreplace(loc->monetary, name);
+
+ /*
+ loc->mn.monetary fields;
+ */
+ }
+
+ if (mask & LC_NUMERIC_MASK) {
+ stringreplace(loc->numeric, name);
+
+ /*
+ loc->mn.numeric fields
+ */
+ }
+
+ if (mask & LC_TIME_MASK) {
+ stringreplace(loc->time, name);
+
+ /* read from file */
+ /* loc->lc_time */
+ }
+
+ if (mask & LC_MESSAGES_MASK) {
+ stringreplace(loc->messages, name);
+
+ /* read */
+ loc->lc_messages.yesexpr = NULL;
+ loc->lc_messages.noexpr = NULL;
+ }
+
+ return name;
+}