1251875Speter/* Fake setlocale - platform independent, for testing purposes.
2251875Speter   Copyright (C) 2001-2002 Free Software Foundation, Inc.
3251875Speter
4251875Speter   This program is free software; you can redistribute it and/or modify
5251875Speter   it under the terms of the GNU General Public License as published by
6251875Speter   the Free Software Foundation; either version 2, or (at your option)
7251875Speter   any later version.
8251875Speter
9251875Speter   This program is distributed in the hope that it will be useful,
10251875Speter   but WITHOUT ANY WARRANTY; without even the implied warranty of
11251875Speter   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12251875Speter   GNU General Public License for more details.
13251875Speter
14251875Speter   You should have received a copy of the GNU General Public License
15251875Speter   along with this program; if not, write to the Free Software Foundation,
16251875Speter   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17251875Speter
18251875Speter#ifdef HAVE_CONFIG_H
19251875Speter# include <config.h>
20251875Speter#endif
21251875Speter
22251875Speter#include <stdlib.h>
23251875Speter#include <locale.h>
24251875Speter#include <string.h>
25251875Speter
26251875Speter/* Return string representation of locale CATEGORY.  */
27251875Speterstatic const char *
28251875Spetercategory_to_name (int category)
29251875Speter{
30251875Speter  const char *retval;
31251875Speter
32251875Speter  switch (category)
33251875Speter  {
34251875Speter#ifdef LC_COLLATE
35251875Speter  case LC_COLLATE:
36251875Speter    retval = "LC_COLLATE";
37251875Speter    break;
38251875Speter#endif
39251875Speter#ifdef LC_CTYPE
40251875Speter  case LC_CTYPE:
41251875Speter    retval = "LC_CTYPE";
42251875Speter    break;
43251875Speter#endif
44251875Speter#ifdef LC_MONETARY
45251875Speter  case LC_MONETARY:
46251875Speter    retval = "LC_MONETARY";
47251875Speter    break;
48251875Speter#endif
49251875Speter#ifdef LC_NUMERIC
50251875Speter  case LC_NUMERIC:
51251875Speter    retval = "LC_NUMERIC";
52251875Speter    break;
53251875Speter#endif
54251875Speter#ifdef LC_TIME
55251875Speter  case LC_TIME:
56251875Speter    retval = "LC_TIME";
57251875Speter    break;
58251875Speter#endif
59251875Speter#ifdef LC_MESSAGES
60251875Speter  case LC_MESSAGES:
61251875Speter    retval = "LC_MESSAGES";
62251875Speter    break;
63251875Speter#endif
64251875Speter#ifdef LC_RESPONSE
65251875Speter  case LC_RESPONSE:
66251875Speter    retval = "LC_RESPONSE";
67251875Speter    break;
68251875Speter#endif
69251875Speter#ifdef LC_ALL
70251875Speter  case LC_ALL:
71251875Speter    /* This might not make sense but is perhaps better than any other
72251875Speter       value.  */
73251875Speter    retval = "LC_ALL";
74251875Speter    break;
75251875Speter#endif
76251875Speter  default:
77251875Speter    /* If you have a better idea for a default value let me know.  */
78251875Speter    retval = "LC_XXX";
79251875Speter  }
80251875Speter
81251875Speter  return retval;
82251875Speter}
83251875Speter
84251875Speter/* An implementation of setlocale that always succeeds, but doesn't
85251875Speter   actually change the behaviour of locale dependent functions.
86251875Speter   Assumes setenv()/putenv() is not called.  */
87251875Speterchar *
88251875Spetersetlocale (int category, SETLOCALE_CONST char *locale)
89251875Speter{
90251875Speter  static char C_string[] = "C";
91251875Speter  static char *current_locale = C_string;
92251875Speter  struct list
93251875Speter  {
94251875Speter    int category;
95251875Speter    char *current_locale;
96251875Speter    struct list *next;
97251875Speter  };
98251875Speter  static struct list *facets = NULL;
99251875Speter  struct list *facetp;
100251875Speter  char *retval;
101251875Speter
102251875Speter  if (locale != NULL)
103251875Speter    {
104251875Speter      char *copy;
105251875Speter
106251875Speter      copy = (char *) malloc (strlen (locale) + 1);
107251875Speter      strcpy (copy, locale);
108251875Speter
109251875Speter      if (category == LC_ALL)
110251875Speter	{
111251875Speter	  while ((facetp = facets) != NULL)
112251875Speter	    {
113251875Speter	      facets = facetp->next;
114251875Speter	      free (facetp->current_locale);
115251875Speter	      free (facetp);
116251875Speter	    }
117251875Speter	  if (current_locale != C_string)
118251875Speter	    free (current_locale);
119251875Speter	  current_locale = copy;
120251875Speter	}
121251875Speter      else
122251875Speter	{
123251875Speter	  for (facetp = facets; facetp != NULL; facetp = facetp->next)
124251875Speter	    if (category == facetp->category)
125251875Speter	      {
126251875Speter		free (facetp->current_locale);
127251875Speter		facetp->current_locale = copy;
128251875Speter		break;
129251875Speter	      }
130251875Speter	  if (facetp == NULL)
131251875Speter	    {
132251875Speter	      facetp = (struct list *) malloc (sizeof (struct list));
133251875Speter	      facetp->category = category;
134251875Speter	      facetp->current_locale = copy;
135251875Speter	      facetp->next = facets;
136251875Speter	      facets = facetp;
137251875Speter	    }
138251875Speter	}
139251875Speter    }
140251875Speter
141251875Speter  retval = current_locale;
142251875Speter  for (facetp = facets; facetp != NULL; facetp = facetp->next)
143251875Speter    if (category == facetp->category)
144269847Speter      {
145251875Speter	retval = facetp->current_locale;
146251875Speter	break;
147251875Speter      }
148251875Speter
149251875Speter  if (retval[0] == '\0')
150251875Speter    {
151251875Speter      retval = getenv ("LC_ALL");
152251875Speter      if (retval == NULL || retval[0] == '\0')
153251875Speter	{
154251875Speter	  retval = getenv (category_to_name (category));
155251875Speter	  if (retval == NULL || retval[0] == '\0')
156251875Speter	    {
157251875Speter	      retval = getenv ("LANG");
158251875Speter	      if (retval == NULL || retval[0] == '\0')
159251875Speter		retval = "C";
160251875Speter	    }
161251875Speter	}
162251875Speter    }
163251875Speter  return retval;
164251875Speter}
165251875Speter