X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flocalcharset.c;h=932473c5b342ed4ddfc1a80eacd68ecc7ace0e3f;hb=c4ce48ac70176ce110a9d568975972096ffed88d;hp=461320823d8a827489b2d5c753a297c9c028523f;hpb=fac1a01e39ca1cddd2dd5d5d672136e3d78c766b;p=gnulib.git diff --git a/lib/localcharset.c b/lib/localcharset.c index 461320823..932473c5b 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -45,8 +45,13 @@ # endif #endif -char *xmalloc (); -char *xrealloc (); +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif /* The following static variable is declared 'volatile' to avoid a possible multithread problem in the function get_charset_aliases. If we @@ -69,10 +74,27 @@ get_charset_aliases () if (cp == NULL) { FILE *fp; + const char *dir = LIBDIR; + const char *base = "charset.alias"; + char *file_name; + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } - fp = fopen (LIBDIR "/" "charset.alias", "r"); - if (fp == NULL) - /* File not found, treat it as empty. */ + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ cp = ""; else { @@ -109,12 +131,18 @@ get_charset_aliases () if (res_size == 0) { res_size = l1 + 1 + l2 + 1; - res_ptr = xmalloc (res_size + 1); + res_ptr = malloc (res_size + 1); } else { res_size += l1 + 1 + l2 + 1; - res_ptr = xrealloc (res_ptr, res_size + 1); + res_ptr = realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + break; } strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); strcpy (res_ptr + res_size - (l2 + 1), buf2); @@ -130,6 +158,8 @@ get_charset_aliases () } charset_aliases = cp; + if (file_name != NULL) + free (file_name); } return cp; @@ -163,13 +193,13 @@ locale_charset () # if HAVE_SETLOCALE locale = setlocale (LC_CTYPE, NULL); # endif - if (locale == NULL) + if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); - if (locale == NULL) + if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); - if (locale == NULL) + if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } } @@ -181,7 +211,7 @@ locale_charset () #endif - if (codeset != NULL) + if (codeset != NULL && codeset[0] != '\0') { /* Resolve alias. */ for (aliases = get_charset_aliases ();