summary refs log tree commit diff
path: root/locale/programs/locfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/programs/locfile.c')
-rw-r--r--locale/programs/locfile.c111
1 files changed, 109 insertions, 2 deletions
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
index ad7e9d5fb4..5a3fc25e3d 100644
--- a/locale/programs/locfile.c
+++ b/locale/programs/locfile.c
@@ -58,6 +58,7 @@ char *xstrdup (const char *__str);
 struct localedef_t *
 locfile_read (const char *filename, struct charset_t *charset)
 {
+  struct repertoire_t *repertoire = NULL;
   struct linereader *ldfile;
   struct localedef_t *result;
   int state;
@@ -80,7 +81,8 @@ locfile_read (const char *filename, struct charset_t *charset)
 	  char *i18npath = __secure_getenv ("I18NPATH");
 	  if (i18npath != NULL && *i18npath != '\0')
 	    {
-	      char path[strlen (filename) + 1 + strlen (i18npath) + 1];
+	      char path[strlen (filename) + 1 + strlen (i18npath)
+		        + sizeof ("/locales/") - 1];
 	      char *next;
 	      i18npath = strdupa (i18npath);
 
@@ -88,7 +90,7 @@ locfile_read (const char *filename, struct charset_t *charset)
 	      while (ldfile == NULL
 		     && (next = strsep (&i18npath, ":")) != NULL)
 		{
-		  stpcpy (stpcpy (stpcpy (path, next), "/"), filename);
+		  stpcpy (stpcpy (stpcpy (path, next), "/locales/"), filename);
 
 		  ldfile = lr_open (path, locfile_hash);
 		}
@@ -249,27 +251,132 @@ argument to `%s' must be a single character"),
 		ldfile->comment_char = *arg->val.str.start;
 	      break;
 
+	    case tok_repertoiremap:
+	      /* We need an argument.  */
+	      arg = lr_token (ldfile, charset);
+
+	      if (arg->tok != tok_ident)
+		{
+		  SYNTAX_ERROR (_("bad argument"));
+		  continue;
+		}
+
+	      if (repertoiremap == NULL)
+		{
+		  repertoiremap = memcpy (xmalloc (arg->val.str.len + 1),
+					  arg->val.str.start,
+					  arg->val.str.len);
+		  ((char *) repertoiremap)[arg->val.str.len] = '\0';
+		}
+
+	      lr_ignore_rest (ldfile, 1);
+	      continue;
+
 	    case tok_lc_ctype:
+	      if (repertoire == NULL)
+		{
+		  /* Read the repertoire map now.  */
+		  if (repertoiremap == NULL)
+		    /* This is fatal.  */
+		    error (4, 0,
+			   _("no repertoire map specified: cannot proceed"));
+
+		  repertoire = repertoire_read (repertoiremap);
+		  if (repertoire == NULL)
+		    /* This is also fatal.  */
+		    error (4, errno, _("cannot read repertoire map `%s'"),
+			   repertoiremap);
+		}
 	      state = 2;
 	      break;
 
 	    case tok_lc_collate:
+	      if (repertoire == NULL)
+		{
+		  /* Read the repertoire map now.  */
+		  if (repertoiremap == NULL)
+		    /* This is fatal.  */
+		    error (4, 0,
+			   _("no repertoire map specified: cannot proceed"));
+
+		  repertoire = repertoire_read (repertoiremap);
+		  if (repertoire == NULL)
+		    /* This is also fatal.  */
+		    error (4, errno, _("cannot read repertoire map `%s'"),
+			   repertoiremap);
+		}
 	      state = 10;
 	      break;
 
 	    case tok_lc_monetary:
+	      if (repertoire == NULL)
+		{
+		  /* Read the repertoire map now.  */
+		  if (repertoiremap == NULL)
+		    /* This is fatal.  */
+		    error (4, 0,
+			   _("no repertoire map specified: cannot proceed"));
+
+		  repertoire = repertoire_read (repertoiremap);
+		  if (repertoire == NULL)
+		    /* This is also fatal.  */
+		    error (4, errno, _("cannot read repertoire map `%s'"),
+			   repertoiremap);
+		}
 	      state = 20;
 	      break;
 
 	    case tok_lc_numeric:
+	      if (repertoire == NULL)
+		{
+		  /* Read the repertoire map now.  */
+		  if (repertoiremap == NULL)
+		    /* This is fatal.  */
+		    error (4, 0,
+			   _("no repertoire map specified: cannot proceed"));
+
+		  repertoire = repertoire_read (repertoiremap);
+		  if (repertoire == NULL)
+		    /* This is also fatal.  */
+		    error (4, errno, _("cannot read repertoire map `%s'"),
+			   repertoiremap);
+		}
 	      state = 30;
 	      break;
 
 	    case tok_lc_time:
+	      if (repertoire == NULL)
+		{
+		  /* Read the repertoire map now.  */
+		  if (repertoiremap == NULL)
+		    /* This is fatal.  */
+		    error (4, 0,
+			   _("no repertoire map specified: cannot proceed"));
+
+		  repertoire = repertoire_read (repertoiremap);
+		  if (repertoire == NULL)
+		    /* This is also fatal.  */
+		    error (4, errno, _("cannot read repertoire map `%s'"),
+			   repertoiremap);
+		}
 	      state = 40;
 	      break;
 
 	    case tok_lc_messages:
+	      if (repertoire == NULL)
+		{
+		  /* Read the repertoire map now.  */
+		  if (repertoiremap == NULL)
+		    /* This is fatal.  */
+		    error (4, 0,
+			   _("no repertoire map specified: cannot proceed"));
+
+		  repertoire = repertoire_read (repertoiremap);
+		  if (repertoire == NULL)
+		    /* This is also fatal.  */
+		    error (4, errno, _("cannot read repertoire map `%s'"),
+			   repertoiremap);
+		}
 	      state = 50;
 	      break;