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