diff options
-rw-r--r-- | 05/locale.h | 60 | ||||
-rw-r--r-- | 05/main.c | 9 |
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 @@ -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; } |