1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #include <locale.h>
- #include <limits.h>
- #include <string.h>
- static struct lconv Clocale = {
- ".", /* decimal_point */
- "", /* thousands_sep */
- "", /* grouping */
- "", /* int_curr_symbol */
- "", /* currency_symbol */
- "", /* mon_decimal_point */
- "", /* mon_thousands_sep */
- "", /* mon_grouping */
- "", /* positive_sign */
- "", /* negative_sign */
- CHAR_MAX, /* int_frac_digits */
- CHAR_MAX, /* frac_digits */
- CHAR_MAX, /* p_cs_precedes */
- CHAR_MAX, /* p_sep_by_space */
- CHAR_MAX, /* n_cs_precedes */
- CHAR_MAX, /* n_sep_by_space */
- CHAR_MAX, /* p_sign_posn */
- CHAR_MAX, /* n_sign_posn */
- };
- static char *localename[2] = {"C", ""};
- static short catlocale[6] = {0, 0, 0, 0, 0, 0};
- /* indices into localename for categories LC_ALL, LC_COLLATE, etc. */
- #define ASIZE(a) (sizeof(a)/sizeof(a[0]))
- char *
- setlocale(int category, const char *locale)
- {
- int c, i;
- if(category < 0 || category >= ASIZE(catlocale))
- return 0;
- if(!locale)
- return localename[catlocale[category]];
- for(c=0; c<ASIZE(localename); c++)
- if(strcmp(locale, localename[c]) == 0)
- break;
- if(c >= ASIZE(localename))
- return 0;
- catlocale[category] = c;
- if(category == LC_ALL)
- for(i=0; i<ASIZE(catlocale); i++)
- catlocale[i] = c;
- return localename[c];
- }
- struct lconv *
- localeconv(void)
- {
- /* BUG: posix says look at environment variables
- * to set locale "", but we just make it the same
- * as C, always.
- */
- return &Clocale;
- }
|