1*3e12c5d1SDavid du Colombier #include <locale.h>
2*3e12c5d1SDavid du Colombier #include <limits.h>
3*3e12c5d1SDavid du Colombier #include <string.h>
4*3e12c5d1SDavid du Colombier
5*3e12c5d1SDavid du Colombier static struct lconv Clocale = {
6*3e12c5d1SDavid du Colombier ".", /* decimal_point */
7*3e12c5d1SDavid du Colombier "", /* thousands_sep */
8*3e12c5d1SDavid du Colombier "", /* grouping */
9*3e12c5d1SDavid du Colombier "", /* int_curr_symbol */
10*3e12c5d1SDavid du Colombier "", /* currency_symbol */
11*3e12c5d1SDavid du Colombier "", /* mon_decimal_point */
12*3e12c5d1SDavid du Colombier "", /* mon_thousands_sep */
13*3e12c5d1SDavid du Colombier "", /* mon_grouping */
14*3e12c5d1SDavid du Colombier "", /* positive_sign */
15*3e12c5d1SDavid du Colombier "", /* negative_sign */
16*3e12c5d1SDavid du Colombier CHAR_MAX, /* int_frac_digits */
17*3e12c5d1SDavid du Colombier CHAR_MAX, /* frac_digits */
18*3e12c5d1SDavid du Colombier CHAR_MAX, /* p_cs_precedes */
19*3e12c5d1SDavid du Colombier CHAR_MAX, /* p_sep_by_space */
20*3e12c5d1SDavid du Colombier CHAR_MAX, /* n_cs_precedes */
21*3e12c5d1SDavid du Colombier CHAR_MAX, /* n_sep_by_space */
22*3e12c5d1SDavid du Colombier CHAR_MAX, /* p_sign_posn */
23*3e12c5d1SDavid du Colombier CHAR_MAX, /* n_sign_posn */
24*3e12c5d1SDavid du Colombier };
25*3e12c5d1SDavid du Colombier
26*3e12c5d1SDavid du Colombier static char *localename[2] = {"C", ""};
27*3e12c5d1SDavid du Colombier static short catlocale[6] = {0, 0, 0, 0, 0, 0};
28*3e12c5d1SDavid du Colombier /* indices into localename for categories LC_ALL, LC_COLLATE, etc. */
29*3e12c5d1SDavid du Colombier
30*3e12c5d1SDavid du Colombier #define ASIZE(a) (sizeof(a)/sizeof(a[0]))
31*3e12c5d1SDavid du Colombier
32*3e12c5d1SDavid du Colombier char *
setlocale(int category,const char * locale)33*3e12c5d1SDavid du Colombier setlocale(int category, const char *locale)
34*3e12c5d1SDavid du Colombier {
35*3e12c5d1SDavid du Colombier int c, i;
36*3e12c5d1SDavid du Colombier
37*3e12c5d1SDavid du Colombier if(category < 0 || category >= ASIZE(catlocale))
38*3e12c5d1SDavid du Colombier return 0;
39*3e12c5d1SDavid du Colombier if(!locale)
40*3e12c5d1SDavid du Colombier return localename[catlocale[category]];
41*3e12c5d1SDavid du Colombier for(c=0; c<ASIZE(localename); c++)
42*3e12c5d1SDavid du Colombier if(strcmp(locale, localename[c]) == 0)
43*3e12c5d1SDavid du Colombier break;
44*3e12c5d1SDavid du Colombier if(c >= ASIZE(localename))
45*3e12c5d1SDavid du Colombier return 0;
46*3e12c5d1SDavid du Colombier catlocale[category] = c;
47*3e12c5d1SDavid du Colombier if(category == LC_ALL)
48*3e12c5d1SDavid du Colombier for(i=0; i<ASIZE(catlocale); i++)
49*3e12c5d1SDavid du Colombier catlocale[i] = c;
50*3e12c5d1SDavid du Colombier return localename[c];
51*3e12c5d1SDavid du Colombier }
52*3e12c5d1SDavid du Colombier
53*3e12c5d1SDavid du Colombier struct lconv *
localeconv(void)54*3e12c5d1SDavid du Colombier localeconv(void)
55*3e12c5d1SDavid du Colombier {
56*3e12c5d1SDavid du Colombier /* BUG: posix says look at environment variables
57*3e12c5d1SDavid du Colombier * to set locale "", but we just make it the same
58*3e12c5d1SDavid du Colombier * as C, always.
59*3e12c5d1SDavid du Colombier */
60*3e12c5d1SDavid du Colombier return &Clocale;
61*3e12c5d1SDavid du Colombier }
62*3e12c5d1SDavid du Colombier
63