From 667ab245fe0326972b7da52a95da97125d61c8cf Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Thu, 18 Feb 2021 17:06:06 -0800 Subject: [PATCH] Implement setlocale() stub (#43) --- libc/sysv/consts.sh | 15 ----------- libc/sysv/consts/LC_ALL.S | 2 -- libc/sysv/consts/LC_ALL_MASK.S | 2 -- libc/sysv/consts/LC_COLLATE.S | 2 -- libc/sysv/consts/LC_COLLATE_MASK.S | 2 -- libc/sysv/consts/LC_CTYPE.S | 2 -- libc/sysv/consts/LC_CTYPE_MASK.S | 2 -- libc/sysv/consts/LC_MESSAGES.S | 2 -- libc/sysv/consts/LC_MESSAGES_MASK.S | 2 -- libc/sysv/consts/LC_MONETARY.S | 2 -- libc/sysv/consts/LC_MONETARY_MASK.S | 2 -- libc/sysv/consts/LC_NUMERIC.S | 2 -- libc/sysv/consts/LC_NUMERIC_MASK.S | 2 -- libc/sysv/consts/LC_TIME.S | 2 -- libc/sysv/consts/LC_TIME_MASK.S | 2 -- libc/sysv/consts/lc.h | 40 ----------------------------- libc/{str => unicode}/iconv.c | 2 +- libc/unicode/locale.h | 26 +++++++++++++++++++ libc/unicode/setlocale.c | 29 +++++++++++++++++++++ 19 files changed, 56 insertions(+), 84 deletions(-) delete mode 100644 libc/sysv/consts/LC_ALL.S delete mode 100644 libc/sysv/consts/LC_ALL_MASK.S delete mode 100644 libc/sysv/consts/LC_COLLATE.S delete mode 100644 libc/sysv/consts/LC_COLLATE_MASK.S delete mode 100644 libc/sysv/consts/LC_CTYPE.S delete mode 100644 libc/sysv/consts/LC_CTYPE_MASK.S delete mode 100644 libc/sysv/consts/LC_MESSAGES.S delete mode 100644 libc/sysv/consts/LC_MESSAGES_MASK.S delete mode 100644 libc/sysv/consts/LC_MONETARY.S delete mode 100644 libc/sysv/consts/LC_MONETARY_MASK.S delete mode 100644 libc/sysv/consts/LC_NUMERIC.S delete mode 100644 libc/sysv/consts/LC_NUMERIC_MASK.S delete mode 100644 libc/sysv/consts/LC_TIME.S delete mode 100644 libc/sysv/consts/LC_TIME_MASK.S delete mode 100644 libc/sysv/consts/lc.h rename libc/{str => unicode}/iconv.c (98%) create mode 100644 libc/unicode/locale.h create mode 100644 libc/unicode/setlocale.c diff --git a/libc/sysv/consts.sh b/libc/sysv/consts.sh index 885f43c99..bdeea030b 100755 --- a/libc/sysv/consts.sh +++ b/libc/sysv/consts.sh @@ -1890,21 +1890,6 @@ syscon misc ILL_ILLOPN 2 4 2 2 2 0 syscon misc ILL_ILLTRP 4 2 4 4 4 0 syscon misc ILL_PRVOPC 5 3 5 5 5 0 -syscon misc LC_CTYPE 0 2 2 2 2 0 # bsd consensus -syscon misc LC_NUMERIC 1 4 4 4 4 0 # bsd consensus -syscon misc LC_CTYPE_MASK 1 0 2 4 4 0 -syscon misc LC_TIME 2 5 5 5 5 0 # bsd consensus -syscon misc LC_NUMERIC_MASK 2 0 8 0x10 0x10 0 -syscon misc LC_COLLATE 3 1 1 1 1 0 # bsd consensus -syscon misc LC_MONETARY 4 3 3 3 3 0 # bsd consensus -syscon misc LC_TIME_MASK 4 0 0x10 0x20 0x20 0 -syscon misc LC_MESSAGES 5 6 6 6 6 0 # bsd consensus -syscon misc LC_ALL 6 0 0 0 0 0 -syscon misc LC_COLLATE_MASK 8 0 1 2 2 0 -syscon misc LC_MONETARY_MASK 0x10 0 4 8 8 0 -syscon misc LC_MESSAGES_MASK 0x20 0 0x20 0x40 0x40 0 -syscon misc LC_ALL_MASK 0x1fbf 0 63 126 126 0 - syscon lock LOCK_UNLOCK_CACHE 54 0 0 0 0 0 # wut syscon misc ARPHRD_ETHER 1 1 1 1 1 0 # unix consensus diff --git a/libc/sysv/consts/LC_ALL.S b/libc/sysv/consts/LC_ALL.S deleted file mode 100644 index 804edb202..000000000 --- a/libc/sysv/consts/LC_ALL.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_ALL,6,0,0,0,0,0 diff --git a/libc/sysv/consts/LC_ALL_MASK.S b/libc/sysv/consts/LC_ALL_MASK.S deleted file mode 100644 index 1b3c8ab60..000000000 --- a/libc/sysv/consts/LC_ALL_MASK.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_ALL_MASK,0x1fbf,0,63,126,126,0 diff --git a/libc/sysv/consts/LC_COLLATE.S b/libc/sysv/consts/LC_COLLATE.S deleted file mode 100644 index f6d5d5b04..000000000 --- a/libc/sysv/consts/LC_COLLATE.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_COLLATE,3,1,1,1,1,0 diff --git a/libc/sysv/consts/LC_COLLATE_MASK.S b/libc/sysv/consts/LC_COLLATE_MASK.S deleted file mode 100644 index efd3567a1..000000000 --- a/libc/sysv/consts/LC_COLLATE_MASK.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_COLLATE_MASK,8,0,1,2,2,0 diff --git a/libc/sysv/consts/LC_CTYPE.S b/libc/sysv/consts/LC_CTYPE.S deleted file mode 100644 index dbfba4315..000000000 --- a/libc/sysv/consts/LC_CTYPE.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_CTYPE,0,2,2,2,2,0 diff --git a/libc/sysv/consts/LC_CTYPE_MASK.S b/libc/sysv/consts/LC_CTYPE_MASK.S deleted file mode 100644 index 103e9dc84..000000000 --- a/libc/sysv/consts/LC_CTYPE_MASK.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_CTYPE_MASK,1,0,2,4,4,0 diff --git a/libc/sysv/consts/LC_MESSAGES.S b/libc/sysv/consts/LC_MESSAGES.S deleted file mode 100644 index 63589de40..000000000 --- a/libc/sysv/consts/LC_MESSAGES.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_MESSAGES,5,6,6,6,6,0 diff --git a/libc/sysv/consts/LC_MESSAGES_MASK.S b/libc/sysv/consts/LC_MESSAGES_MASK.S deleted file mode 100644 index 7c05dde2a..000000000 --- a/libc/sysv/consts/LC_MESSAGES_MASK.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_MESSAGES_MASK,0x20,0,0x20,0x40,0x40,0 diff --git a/libc/sysv/consts/LC_MONETARY.S b/libc/sysv/consts/LC_MONETARY.S deleted file mode 100644 index 9caafd5c5..000000000 --- a/libc/sysv/consts/LC_MONETARY.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_MONETARY,4,3,3,3,3,0 diff --git a/libc/sysv/consts/LC_MONETARY_MASK.S b/libc/sysv/consts/LC_MONETARY_MASK.S deleted file mode 100644 index fe5538871..000000000 --- a/libc/sysv/consts/LC_MONETARY_MASK.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_MONETARY_MASK,0x10,0,4,8,8,0 diff --git a/libc/sysv/consts/LC_NUMERIC.S b/libc/sysv/consts/LC_NUMERIC.S deleted file mode 100644 index 2fee61577..000000000 --- a/libc/sysv/consts/LC_NUMERIC.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_NUMERIC,1,4,4,4,4,0 diff --git a/libc/sysv/consts/LC_NUMERIC_MASK.S b/libc/sysv/consts/LC_NUMERIC_MASK.S deleted file mode 100644 index 581d79f6f..000000000 --- a/libc/sysv/consts/LC_NUMERIC_MASK.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_NUMERIC_MASK,2,0,8,0x10,0x10,0 diff --git a/libc/sysv/consts/LC_TIME.S b/libc/sysv/consts/LC_TIME.S deleted file mode 100644 index 35fd37859..000000000 --- a/libc/sysv/consts/LC_TIME.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_TIME,2,5,5,5,5,0 diff --git a/libc/sysv/consts/LC_TIME_MASK.S b/libc/sysv/consts/LC_TIME_MASK.S deleted file mode 100644 index 79ae691b3..000000000 --- a/libc/sysv/consts/LC_TIME_MASK.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,LC_TIME_MASK,4,0,0x10,0x20,0x20,0 diff --git a/libc/sysv/consts/lc.h b/libc/sysv/consts/lc.h deleted file mode 100644 index 414db93d5..000000000 --- a/libc/sysv/consts/lc.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_LC_H_ -#define COSMOPOLITAN_LIBC_SYSV_CONSTS_LC_H_ -#include "libc/runtime/symbolic.h" - -#define LC_ALL SYMBOLIC(LC_ALL) -#define LC_ALL_MASK SYMBOLIC(LC_ALL_MASK) -#define LC_COLLATE SYMBOLIC(LC_COLLATE) -#define LC_COLLATE_MASK SYMBOLIC(LC_COLLATE_MASK) -#define LC_CTYPE SYMBOLIC(LC_CTYPE) -#define LC_CTYPE_MASK SYMBOLIC(LC_CTYPE_MASK) -#define LC_MESSAGES SYMBOLIC(LC_MESSAGES) -#define LC_MESSAGES_MASK SYMBOLIC(LC_MESSAGES_MASK) -#define LC_MONETARY SYMBOLIC(LC_MONETARY) -#define LC_MONETARY_MASK SYMBOLIC(LC_MONETARY_MASK) -#define LC_NUMERIC SYMBOLIC(LC_NUMERIC) -#define LC_NUMERIC_MASK SYMBOLIC(LC_NUMERIC_MASK) -#define LC_TIME SYMBOLIC(LC_TIME) -#define LC_TIME_MASK SYMBOLIC(LC_TIME_MASK) - -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -extern const long LC_ALL; -extern const long LC_ALL_MASK; -extern const long LC_COLLATE; -extern const long LC_COLLATE_MASK; -extern const long LC_CTYPE; -extern const long LC_CTYPE_MASK; -extern const long LC_MESSAGES; -extern const long LC_MESSAGES_MASK; -extern const long LC_MONETARY; -extern const long LC_MONETARY_MASK; -extern const long LC_NUMERIC; -extern const long LC_NUMERIC_MASK; -extern const long LC_TIME; -extern const long LC_TIME_MASK; - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_LC_H_ */ diff --git a/libc/str/iconv.c b/libc/unicode/iconv.c similarity index 98% rename from libc/str/iconv.c rename to libc/unicode/iconv.c index f490fd365..0f2532bf6 100644 --- a/libc/str/iconv.c +++ b/libc/unicode/iconv.c @@ -16,7 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/str.h" +#include "libc/unicode/locale.h" typedef void *iconv_t; diff --git a/libc/unicode/locale.h b/libc/unicode/locale.h new file mode 100644 index 000000000..d8f082fbb --- /dev/null +++ b/libc/unicode/locale.h @@ -0,0 +1,26 @@ +#ifndef COSMOPOLITAN_LIBC_UNICODE_LOCALE_H_ +#define COSMOPOLITAN_LIBC_UNICODE_LOCALE_H_ + +#define LC_CTYPE 0 +#define LC_NUMERIC 1 +#define LC_CTYPE_MASK 1 +#define LC_TIME 2 +#define LC_NUMERIC_MASK 2 +#define LC_COLLATE 3 +#define LC_MONETARY 4 +#define LC_TIME_MASK 4 +#define LC_MESSAGES 5 +#define LC_ALL 6 +#define LC_COLLATE_MASK 8 +#define LC_MONETARY_MASK 16 +#define LC_MESSAGES_MASK 32 +#define LC_ALL_MASK 0x1fbf + +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +char *setlocale(int, const char *); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_UNICODE_LOCALE_H_ */ diff --git a/libc/unicode/setlocale.c b/libc/unicode/setlocale.c new file mode 100644 index 000000000..14303ef79 --- /dev/null +++ b/libc/unicode/setlocale.c @@ -0,0 +1,29 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/bits/safemacros.h" +#include "libc/unicode/locale.h" + +/** + * Sets program locale. + * + * Cosmopolitan only supports the C or POSIX locale. + */ +char *setlocale(int category, const char *locale) { + return firstnonnull(locale, "C"); +}