From 95e7ec1ab5c1de11719be901a8b8451a49fa6c7b Mon Sep 17 00:00:00 2001 From: pommicket Date: Tue, 15 Feb 2022 16:48:18 -0500 Subject: locale.h --- 05/locale.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 05/main.c | 9 ++++----- 2 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 05/locale.h 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 + +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 #include #include - -typedef struct { - int x; - long y; -} S; +#include int main(int argc, char **argv) { + setlocale(LC_ALL, "C"); + struct lconv *c = localeconv(); + printf("%s\n",c->negative_sign); return 0; } -- cgit v1.2.3