summaryrefslogtreecommitdiffstats
path: root/intl/localcharset.c
diff options
context:
space:
mode:
Diffstat (limited to 'intl/localcharset.c')
-rw-r--r--intl/localcharset.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/intl/localcharset.c b/intl/localcharset.c
index 4865f10..1252f3f 100644
--- a/intl/localcharset.c
+++ b/intl/localcharset.c
@@ -1,6 +1,6 @@
/* Determine a canonical name for the current locale's character encoding.
- Copyright (C) 2000-2003 Free Software Foundation, Inc.
+ Copyright (C) 2000-2004 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published
@@ -14,7 +14,7 @@
You should have received a copy of the GNU Library General Public
License along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA. */
/* Written by Bruno Haible <bruno@clisp.org>. */
@@ -73,8 +73,8 @@
# define relocate(pathname) (pathname)
#endif
-#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
- /* Win32, OS/2, DOS */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
#endif
@@ -116,10 +116,16 @@ get_charset_aliases ()
{
#if !(defined VMS || defined WIN32)
FILE *fp;
- const char *dir = relocate (LIBDIR);
+ const char *dir;
const char *base = "charset.alias";
char *file_name;
+ /* Make it possible to override the charset.alias location. This is
+ necessary for running the testsuite before "make install". */
+ dir = getenv ("CHARSETALIASDIR");
+ if (dir == NULL || dir[0] == '\0')
+ dir = relocate (LIBDIR);
+
/* Concatenate dir and base into freshly allocated file_name. */
{
size_t dir_len = strlen (dir);
@@ -141,15 +147,17 @@ get_charset_aliases ()
else
{
/* Parse the file's contents. */
- int c;
- char buf1[50+1];
- char buf2[50+1];
char *res_ptr = NULL;
size_t res_size = 0;
- size_t l1, l2;
for (;;)
{
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ size_t l1, l2;
+ char *old_res_ptr;
+
c = getc (fp);
if (c == EOF)
break;
@@ -170,6 +178,7 @@ get_charset_aliases ()
break;
l1 = strlen (buf1);
l2 = strlen (buf2);
+ old_res_ptr = res_ptr;
if (res_size == 0)
{
res_size = l1 + 1 + l2 + 1;
@@ -184,6 +193,8 @@ get_charset_aliases ()
{
/* Out of memory. */
res_size = 0;
+ if (old_res_ptr != NULL)
+ free (old_res_ptr);
break;
}
strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);