#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdlib.h>
#include <locale.h>
#include <string.h>
static const char *
category_to_name (int category)
{
const char *retval;
switch (category)
{
#ifdef LC_COLLATE
case LC_COLLATE:
retval = "LC_COLLATE";
break;
#endif
#ifdef LC_CTYPE
case LC_CTYPE:
retval = "LC_CTYPE";
break;
#endif
#ifdef LC_MONETARY
case LC_MONETARY:
retval = "LC_MONETARY";
break;
#endif
#ifdef LC_NUMERIC
case LC_NUMERIC:
retval = "LC_NUMERIC";
break;
#endif
#ifdef LC_TIME
case LC_TIME:
retval = "LC_TIME";
break;
#endif
#ifdef LC_MESSAGES
case LC_MESSAGES:
retval = "LC_MESSAGES";
break;
#endif
#ifdef LC_RESPONSE
case LC_RESPONSE:
retval = "LC_RESPONSE";
break;
#endif
#ifdef LC_ALL
case LC_ALL:
retval = "LC_ALL";
break;
#endif
default:
retval = "LC_XXX";
}
return retval;
}
char *
setlocale (int category, SETLOCALE_CONST char *locale)
{
static char C_string[] = "C";
static char *current_locale = C_string;
struct list
{
int category;
char *current_locale;
struct list *next;
};
static struct list *facets = NULL;
struct list *facetp;
char *retval;
if (locale != NULL)
{
char *copy;
copy = (char *) malloc (strlen (locale) + 1);
strcpy (copy, locale);
if (category == LC_ALL)
{
while ((facetp = facets) != NULL)
{
facets = facetp->next;
free (facetp->current_locale);
free (facetp);
}
if (current_locale != C_string)
free (current_locale);
current_locale = copy;
}
else
{
for (facetp = facets; facetp != NULL; facetp = facetp->next)
if (category == facetp->category)
{
free (facetp->current_locale);
facetp->current_locale = copy;
break;
}
if (facetp == NULL)
{
facetp = (struct list *) malloc (sizeof (struct list));
facetp->category = category;
facetp->current_locale = copy;
facetp->next = facets;
facets = facetp;
}
}
}
retval = current_locale;
for (facetp = facets; facetp != NULL; facetp = facetp->next)
if (category == facetp->category)
{
retval = facetp->current_locale;
break;
}
if (retval[0] == '\0')
{
retval = getenv ("LC_ALL");
if (retval == NULL || retval[0] == '\0')
{
retval = getenv (category_to_name (category));
if (retval == NULL || retval[0] == '\0')
{
retval = getenv ("LANG");
if (retval == NULL || retval[0] == '\0')
retval = "C";
}
}
}
return retval;
}