summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2022-02-15 16:48:18 -0500
committerpommicket <pommicket@gmail.com>2022-02-15 16:48:18 -0500
commit95e7ec1ab5c1de11719be901a8b8451a49fa6c7b (patch)
tree28d8a1059cade518255ae41fd26d06d263184f02
parent23198d16f445e3596e6d309a5d36b144fb32e058 (diff)
locale.h
-rw-r--r--05/locale.h60
-rw-r--r--05/main.c9
2 files changed, 64 insertions, 5 deletions
diff --git a/05/locale.h b/05/locale.h
new file mode 100644
index 0000000..af90729
--- /dev/null
+++ b/05/locale.h
@@ -0,0 +1,60 @@
+#ifndef _LOCALE_H
+#define _LOCALE_H
+
+#include <stdc_common.h>
+
+struct lconv {
+ char *decimal_point; /* "." */
+ char *thousands_sep; /* "" */
+ char *grouping; /* "" */
+ char *int_curr_symbol; /* "" */
+ char *currency_symbol; /* "" */
+ char *mon_decimal_point; /* "" */
+ char *mon_thousands_sep; /* "" */
+ char *mon_grouping; /* "" */
+ char *positive_sign; /* "" */
+ char *negative_sign; /* "" */
+ char int_frac_digits; /* CHAR_MAX */
+ char frac_digits; /* CHAR_MAX */
+ char p_cs_precedes; /* CHAR_MAX */
+ char p_sep_by_space; /* CHAR_MAX */
+ char n_cs_precedes; /* CHAR_MAX */
+ char n_sep_by_space; /* CHAR_MAX */
+ char p_sign_posn; /* CHAR_MAX */
+ char n_sign_posn; /* CHAR_MAX */
+};
+
+// these are GCC's constants, but it doesn't really matter which constants we use.
+#define LC_ALL 6
+#define LC_COLLATE 3
+#define LC_CTYPE 0
+#define LC_MONETARY 4
+#define LC_NUMERIC 1
+#define LC_TIME 2
+
+char *setlocale(int category, char *locale) {
+ if (!locale) return "C";
+ if (*locale == 'C' && !locale[1]) {
+ // yep
+ return "C";
+ }
+
+ // we only support the C locale
+ return NULL;
+
+}
+
+struct lconv *localeconv(void) {
+ static struct lconv conv = {
+ ".",
+ "", "", "",
+ "", "", "",
+ "", "", "",
+ CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX
+ };
+ return &conv;
+}
+
+#endif // _LOCALE_H
diff --git a/05/main.c b/05/main.c
index b02f95f..a77ccf2 100644
--- a/05/main.c
+++ b/05/main.c
@@ -4,13 +4,12 @@
#include <stdlib.h>
#include <stddef.h>
#include <ctype.h>
-
-typedef struct {
- int x;
- long y;
-} S;
+#include <locale.h>
int main(int argc, char **argv) {
+ setlocale(LC_ALL, "C");
+ struct lconv *c = localeconv();
+ printf("%s\n",c->negative_sign);
return 0;
}