summaryrefslogtreecommitdiff
path: root/lib/localcharset.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2000-05-06 13:47:38 +0000
committerJim Meyering <jim@meyering.net>2000-05-06 13:47:38 +0000
commit6b54234726cb2c12b9c71e58b895dfc2b6841c37 (patch)
tree9d857b9ad480737634c482e93916f0ca1a31cf1b /lib/localcharset.c
parentc141f3a34e6aadd8d8338a530ffcea30629a01bd (diff)
downloadcoreutils-6b54234726cb2c12b9c71e58b895dfc2b6841c37.tar.xz
(get_charset_aliases): Use malloc, realloc and memcpy
instead of xmalloc, xrealloc, path_concat. (locale_charset): Treat empty environment variables as absent. (DIRECTORY_SEPARATOR, ISSLASH): New macros.
Diffstat (limited to 'lib/localcharset.c')
-rw-r--r--lib/localcharset.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/lib/localcharset.c b/lib/localcharset.c
index e80a2c523..932473c5b 100644
--- a/lib/localcharset.c
+++ b/lib/localcharset.c
@@ -45,10 +45,13 @@
# endif
#endif
-#include "path-concat.h"
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
-char *xmalloc ();
-char *xrealloc ();
+#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
@@ -71,7 +74,24 @@ get_charset_aliases ()
if (cp == NULL)
{
FILE *fp;
- char *file_name = path_concat (LIBDIR, "charset.alias", NULL);
+ 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);
+ }
+ }
if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
/* Out of memory or file not found, treat it as empty. */
@@ -111,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);
@@ -167,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");
}
}
@@ -185,7 +211,7 @@ locale_charset ()
#endif
- if (codeset != NULL)
+ if (codeset != NULL && codeset[0] != '\0')
{
/* Resolve alias. */
for (aliases = get_charset_aliases ();