xref: /plan9/sys/src/ape/lib/ap/posix/locale.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
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