about summary refs log tree commit diff
path: root/locale/programs/charmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/programs/charmap.c')
-rw-r--r--locale/programs/charmap.c85
1 files changed, 48 insertions, 37 deletions
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index 66adcb89db..9f2d8d4bf4 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -47,7 +47,7 @@
 extern void *xmalloc (size_t __n);
 
 /* Prototypes for local functions.  */
-static struct charmap_t *parse_charmap (const char *filename);
+static struct charmap_t *parse_charmap (struct linereader *cmfile);
 static void new_width (struct linereader *cmfile, struct charmap_t *result,
 		       const char *from, const char *to,
 		       unsigned long int width);
@@ -59,26 +59,52 @@ static void charmap_new_char (struct linereader *lr, struct charmap_t *cm,
 struct charmap_t *
 charmap_read (const char *filename)
 {
-  const char *pathnfile;
   struct charmap_t *result = NULL;
 
   if (filename != NULL)
     {
-      if (euidaccess (filename, R_OK) >= 0)
-	pathnfile = filename;
-      else if (filename[0] != '/')
+      struct linereader *cmfile;
+
+      /* First try the name as found in the parameter.  */
+      cmfile = lr_open (filename, charmap_hash);
+      if (cmfile == NULL)
 	{
-	  char *cp = xmalloc (strlen (filename) + sizeof CHARMAP_PATH + 1);
-	  stpcpy (stpcpy (stpcpy (cp, CHARMAP_PATH), "/"), filename);
+	  /* No successful.  So start looking through the directories
+	     in the I18NPATH if this is a simple name.  */
+	  if (strchr (filename, '/') == NULL)
+	    {
+	      char *i18npath = getenv ("I18NPATH");
+	      if (i18npath != NULL && *i18npath != '\0')
+		{
+		  char path[strlen (filename) + 1 + strlen (i18npath)
+			   + sizeof ("/charmaps/") - 1];
+		  char *next;
+		  i18npath = strdupa (i18npath);
+
+
+		  while (cmfile == NULL
+			 && (next = strsep (&i18npath, ":")) != NULL)
+		    {
+		      stpcpy (stpcpy (stpcpy (path, next), "/charmaps/"),
+			      filename);
 
-	  pathnfile = (const char *) cp;
+		      cmfile = lr_open (path, charmap_hash);
+
+		      if (cmfile == NULL)
+			{
+			  /* Try without the "/charmaps" part.  */
+			  stpcpy (stpcpy (path, next), filename);
+
+			  cmfile = lr_open (path, charmap_hash);
+			}
+		    }
+		}
+	    }
 	}
-      else
-	pathnfile = NULL;
 
-      if (pathnfile != NULL)
+      if (cmfile != NULL)
 	{
-	  result = parse_charmap (pathnfile);
+	  result = parse_charmap (cmfile);
 
 	  if (result == NULL && !be_quiet)
 	    error (0, errno, _("character map file `%s' not found"), filename);
@@ -145,7 +171,11 @@ charmap_read (const char *filename)
 
 		    if (name != NULL)
 		      {
-			result = parse_charmap (buf);
+			struct linereader *cmfile;
+
+			cmfile = lr_open (buf, charmap_hash);
+			result = (cmfile == NULL
+				  ? NULL : parse_charmap (cmfile));
 
 			free (buf);
 
@@ -163,9 +193,11 @@ charmap_read (const char *filename)
 
   if (result == NULL)
     {
-      pathnfile = CHARMAP_PATH "/" DEFAULT_CHARMAP;
+      struct linereader *cmfile;
 
-      result = parse_charmap (pathnfile);
+      cmfile = lr_open (CHARMAP_PATH "/" DEFAULT_CHARMAP, charmap_hash);
+
+      result = cmfile == NULL ? NULL : parse_charmap (cmfile);
 
       if (result == NULL)
 	error (4, errno, _("default character map file `%s' not found"),
@@ -177,9 +209,8 @@ charmap_read (const char *filename)
 
 
 static struct charmap_t *
-parse_charmap (const char *filename)
+parse_charmap (struct linereader *cmfile)
 {
-  struct linereader *cmfile;
   struct charmap_t *result;
   int state;
   enum token_t expected_tok = tok_error;
@@ -188,26 +219,6 @@ parse_charmap (const char *filename)
   char *to_name = NULL;
   enum token_t ellipsis = 0;
 
-  /* Determine path.  */
-  cmfile = lr_open (filename, charmap_hash);
-  if (cmfile == NULL)
-    {
-      if (strchr (filename, '/') == NULL)
-	{
-	  /* Look in the systems charmap directory.  */
-	  char *buf = xmalloc (strlen (filename) + 1 + sizeof (CHARMAP_PATH));
-
-	  stpcpy (stpcpy (stpcpy (buf, CHARMAP_PATH), "/"), filename);
-	  cmfile = lr_open (buf, charmap_hash);
-
-	  if (cmfile == NULL)
-	    free (buf);
-	}
-
-      if (cmfile == NULL)
-	return NULL;
-    }
-
   /* We don't want symbolic names in string to be translated.  */
   cmfile->translate_strings = 0;