Cleaned up code in locale for safety

This commit is contained in:
NeGate 2022-06-02 16:29:14 -04:00
parent 55d39d289d
commit 843f13b504
1 changed files with 53 additions and 45 deletions

View File

@ -7,55 +7,63 @@
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#define _LC_FIRST 0 #define _LC_FIRST 0
#define _LC_LAST 5 #define _LC_LAST 5
static struct lconv _locale; static struct lconv _locale;
static const char *_locale_str; static char _locale_str[16];
char *setlocale(int category, const char *locale) // Even if the user doesn't enable LIB_EXT1 we still have it existing
{ size_t strnlen_s(const char *s, size_t maxsize);
assert(_LC_FIRST <= category && category <= _LC_LAST);
if(locale == NULL) { char *setlocale(int category, const char *locale) {
return _locale_str; if (_LC_FIRST <= category && category <= _LC_LAST) return NULL;
} if (locale == NULL) return _locale_str;
if(strcmp(locale, "C") == 0) {
if(category == LC_ALL) { // Validate the string a bit
_locale.decimal_point = "."; size_t locale_len = strnlen_s(locale, sizeof(_locale_str));
_locale.thousands_sep = ""; if (locale_len == 0 || locale_len >= sizeof(_locale_str)) return NULL;
_locale.grouping = "";
_locale.mon_decimal_point = ""; if(strcmp(locale, "C") == 0) {
_locale.mon_thousands_sep = ""; switch (category) {
_locale.mon_grouping = ""; case LC_ALL: {
_locale.positive_sign = ""; _locale.decimal_point = ".";
_locale.negative_sign = ""; _locale.thousands_sep = "";
_locale.currency_symbol = ""; _locale.grouping = "";
_locale.frac_digits = CHAR_MAX; _locale.mon_decimal_point = "";
_locale.p_cs_precedes = CHAR_MAX; _locale.mon_thousands_sep = "";
_locale.n_cs_precedes = CHAR_MAX; _locale.mon_grouping = "";
_locale.p_sep_by_space = CHAR_MAX; _locale.positive_sign = "";
_locale.n_sep_by_space = CHAR_MAX; _locale.negative_sign = "";
_locale.p_sign_posn = CHAR_MAX; _locale.currency_symbol = "";
_locale.n_sign_posn = CHAR_MAX; _locale.frac_digits = CHAR_MAX;
_locale.int_curr_symbol = ""; _locale.p_cs_precedes = CHAR_MAX;
_locale.int_frac_digits = CHAR_MAX; _locale.n_cs_precedes = CHAR_MAX;
_locale.int_p_cs_precedes = CHAR_MAX; _locale.p_sep_by_space = CHAR_MAX;
_locale.int_n_cs_precedes = CHAR_MAX; _locale.n_sep_by_space = CHAR_MAX;
_locale.int_p_sep_by_space = CHAR_MAX; _locale.p_sign_posn = CHAR_MAX;
_locale.int_n_sep_by_space = CHAR_MAX; _locale.n_sign_posn = CHAR_MAX;
_locale.int_p_sign_posn = CHAR_MAX; _locale.int_curr_symbol = "";
_locale.int_n_sign_posn = CHAR_MAX; _locale.int_frac_digits = CHAR_MAX;
} _locale.int_p_cs_precedes = CHAR_MAX;
} _locale.int_n_cs_precedes = CHAR_MAX;
else { _locale.int_p_sep_by_space = CHAR_MAX;
return NULL; _locale.int_n_sep_by_space = CHAR_MAX;
} _locale.int_p_sign_posn = CHAR_MAX;
_locale_str = locale; _locale.int_n_sign_posn = CHAR_MAX;
return locale; break;
}
default: return NULL;
}
} else {
return NULL;
}
memcpy(_locale_str, locale, locale_len);
return _locale_str;
} }
struct lconv *localeconv(void) struct lconv *localeconv(void) {
{ return &_locale;
} }