Add normalize_codeset function. We don't want to use the
[kopensolaris-gnu/glibc.git] / locale / programs / localedef.c
index 96ff12e..34c7394 100644 (file)
@@ -36,7 +36,6 @@
 #include "error.h"
 #include "charset.h"
 #include "locfile.h"
-#include "../intl/loadinfo.h"
 
 /* Undefine the following line in the production version.  */
 /* #define NDEBUG 1 */
@@ -138,6 +137,7 @@ void *xmalloc (size_t __n);
 /* Prototypes for local functions.  */
 static void error_print (void);
 static const char *construct_output_path (char *path);
+static const char *normalize_codeset (const char *codeset, size_t name_len);
 
 
 int
@@ -240,21 +240,23 @@ main (int argc, char *argv[])
 
          if (! avail)
            {
-             const char *locale_names[] = { "LC_COLLATE", "LC_CTYPE",
-                                            "LC_MONETARY", "LC_NUMERIC",
-                                            "LC_TIME", "LC_MESSAGES" };
+             static const char *locale_names[] =
+             {
+               "LC_COLLATE", "LC_CTYPE", "LC_MONETARY",
+               "LC_NUMERIC", "LC_TIME", "LC_MESSAGES"
+             };
              char *fname;
              int fd;
              struct stat st;
 
-             asprintf (&fname, LOCALE_PATH "/%s/%s", act_add_locdef->name,
+             asprintf (&fname, LOCALEDIR "/%s/%s", act_add_locdef->name,
                        locale_names[cat]);
              fd = open (fname, O_RDONLY);
              if (fd == -1)
                {
                  free (fname);
 
-                 asprintf (&fname, LOCALE_PATH "/%s/%s/SYS_%s",
+                 asprintf (&fname, LOCALEDIR "/%s/%s/SYS_%s",
                            act_add_locdef->name, locale_names[cat],
                            locale_names[cat]);
 
@@ -473,7 +475,7 @@ construct_output_path (char *path)
            ++endp;
 
          if (endp > startp)
-           normal = _nl_normalize_codeset (startp, endp - startp);
+           normal = normalize_codeset (startp, endp - startp);
        }
       else
        /* This is to keep gcc quiet.  */
@@ -510,3 +512,47 @@ construct_output_path (char *path)
 
   return result;
 }
+
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  */
+static const char *
+normalize_codeset (codeset, name_len)
+     const char *codeset;
+     size_t name_len;
+{
+  int len = 0;
+  int only_digit = 1;
+  char *retval;
+  char *wp;
+  size_t cnt;
+
+  for (cnt = 0; cnt < name_len; ++cnt)
+    if (isalnum (codeset[cnt]))
+      {
+       ++len;
+
+       if (isalpha (codeset[cnt]))
+         only_digit = 0;
+      }
+
+  retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+  if (retval != NULL)
+    {
+      if (only_digit)
+       wp = stpcpy (retval, "iso");
+      else
+       wp = retval;
+
+      for (cnt = 0; cnt < name_len; ++cnt)
+       if (isalpha (codeset[cnt]))
+         *wp++ = tolower (codeset[cnt]);
+       else if (isdigit (codeset[cnt]))
+         *wp++ = codeset[cnt];
+
+      *wp = '\0';
+    }
+
+  return (const char *) retval;
+}