about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--BUGS15
-rw-r--r--ChangeLog7
-rw-r--r--locale/programs/ld-ctype.c197
-rw-r--r--locale/programs/locfile-kw.gperf1
-rw-r--r--locale/programs/locfile-kw.h451
-rw-r--r--locale/programs/locfile-token.h1
6 files changed, 442 insertions, 230 deletions
diff --git a/BUGS b/BUGS
index f62ceae93d..8149ae5114 100644
--- a/BUGS
+++ b/BUGS
@@ -1,7 +1,7 @@
 	    List of known bugs (certainly very incomplete)
 	    ----------------------------------------------
 
-Time-stamp: <1999-09-13T02:02:34-0700 drepper>
+Time-stamp: <1999-12-31T14:42:14-0800 drepper>
 
 This following list contains those bugs which I'm aware of.  Please
 make sure that bugs you report are not listed here.  If you can fix one
@@ -24,8 +24,7 @@ situations.
 
 Severity: [  *] to [***]
 
-
-[** ]  Closing shared objects in statically linked binaries most of the
+[ **]  Closing shared objects in statically linked binaries most of the
        times leads to crashes during the dlopen().  Hard to fix.
 
 [ **]  There are problems with signal handling when using LinuxThreads.
@@ -48,6 +47,16 @@ Severity: [  *] to [***]
 [  *]  The libm-ieee `scalb' function gives wrong results for
        non-integral second parameters.
 
+[  *]  Collation symbol and equivalence class handling in regex are not
+       yet 100% correct.
+       - [. .] at end of a range does not work
+       - [. .] and [= =] do not handle collating symbols (where a symbol
+         stands for multiple character) and multibyte character in
+         general not correctly.
+
+       This is *extremely* hard to fix since regex has to be rewritten
+       completely.
+
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Ulrich Drepper
 drepper@cygnus.com
diff --git a/ChangeLog b/ChangeLog
index 0192430ee2..909ae5746f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2000-01-01  Ulrich Drepper  <drepper@cygnus.com>
+
+	* locale/programs/ld-ctype.c: Implement rest of transliteration
+	definition parsing.
+	* locale/programs/locfile-kw.gperf: New keyword translit_ignore.
+	* locale/programs/locfile-token.h: Add tok_translit_ignore.
+
 1999-12-31  Ulrich Drepper  <drepper@cygnus.com>
 
 	* locale/programs/ld-collate.c (collate_output): Emit correct
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index bfaf6c7d09..231df137ea 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -85,11 +85,25 @@ struct translit_t
 {
   uint32_t *from;
 
+  const char *fname;
+  size_t lineno;
+
   struct translit_to_t *to;
 
   struct translit_t *next;
 };
 
+struct translit_ignore_t
+{
+  uint32_t from;
+  uint32_t to;
+
+  const char *fname;
+  size_t lineno;
+
+  struct translit_ignore_t *next;
+};
+
 
 /* The real definition of the struct for the LC_CTYPE locale.  */
 struct locale_ctype_t
@@ -138,6 +152,11 @@ struct locale_ctype_t
   const char *translit_copy_locale;
   const char *translit_copy_repertoire;
   struct translit_t *translit;
+  struct translit_ignore_t *translit_ignore;
+
+  uint32_t *default_missing;
+  const char *default_missing_file;
+  size_t default_missing_lineno;
 
   /* The arrays for the binary representation.  */
   uint32_t plane_size;
@@ -162,7 +181,7 @@ struct locale_ctype_t
   size_t translit_from_tbl_size;
   size_t translit_to_tbl_size;
 
-  struct obstack mem_pool;
+  struct obstack mempool;
 };
 
 
@@ -282,7 +301,7 @@ ctype_startup (struct linereader *lr, struct localedef_t *locale,
 	  ctype->map256_collection[1][cnt] = cnt;
 	}
 
-      obstack_init (&ctype->mem_pool);
+      obstack_init (&ctype->mempool);
     }
 }
 
@@ -1537,7 +1556,7 @@ read_widestring (struct linereader *ldfile, struct token *now,
   else if (now->tok == tok_bsymbol)
     {
       /* Get the value from the repertoire.  */
-      wstr = xmalloc (2 * sizeof (uint32_t));
+      wstr = (uint32_t *) xmalloc (2 * sizeof (uint32_t));
       wstr[0] = repertoire_find_value (repertoire, now->val.str.startmb,
 				       now->val.str.lenmb);
       if (wstr[0] == ILLEGAL_CHAR_VALUE)
@@ -1548,7 +1567,7 @@ read_widestring (struct linereader *ldfile, struct token *now,
     }
   else if (now->tok == tok_ucs4)
     {
-      wstr = xmalloc (2 * sizeof (uint32_t));
+      wstr = (uint32_t *) xmalloc (2 * sizeof (uint32_t));
       wstr[0] = now->val.ucs4;
       wstr[1] = 0;
     }
@@ -1570,14 +1589,14 @@ read_widestring (struct linereader *ldfile, struct token *now,
 	/* We cannot proceed, we don't know the UCS4 value.  */
 	return NULL;
 
-      wstr = xmalloc (2 * sizeof (uint32_t));
+      wstr = (uint32_t *) xmalloc (2 * sizeof (uint32_t));
       wstr[0] = seq->ucs4;
       wstr[1] = 0;
     }
   else if (now->tok == tok_string)
     {
       wstr = now->val.str.startwc;
-      if (wstr[0] == 0)
+      if (wstr == NULL || wstr[0] == 0)
 	return NULL;
     }
   else
@@ -1600,7 +1619,7 @@ read_translit_entry (struct linereader *ldfile, struct locale_ctype_t *ctype,
   uint32_t *from_wstr = read_widestring (ldfile, now, charmap, repertoire);
   struct translit_t *result;
   struct translit_to_t **top;
-  struct obstack *ob = &ctype->mem_pool;
+  struct obstack *ob = &ctype->mempool;
   int first;
   int ignore;
 
@@ -1611,6 +1630,8 @@ read_translit_entry (struct linereader *ldfile, struct locale_ctype_t *ctype,
   result = (struct translit_t *) obstack_alloc (ob,
 						sizeof (struct translit_t));
   result->from = from_wstr;
+  result->fname = ldfile->fname;
+  result->lineno = ldfile->lineno;
   result->next = NULL;
   result->to = NULL;
   top = &result->to;
@@ -1673,6 +1694,129 @@ read_translit_entry (struct linereader *ldfile, struct locale_ctype_t *ctype,
 }
 
 
+static void
+read_translit_ignore_entry (struct linereader *ldfile,
+			    struct locale_ctype_t *ctype,
+			    struct charmap_t *charmap,
+			    struct repertoire_t *repertoire)
+{
+  /* We expect a semicolon-separated list of characters we ignore.  We are
+     only interested in the wide character definitions.  These must be
+     single characters, possibly defining a range when an ellipsis is used.  */
+  while (1)
+    {
+      struct token *now = lr_token (ldfile, charmap, repertoire);
+      struct translit_ignore_t *newp;
+      uint32_t from;
+
+      if (now->tok == tok_eol || now->tok == tok_eof)
+	{
+	  lr_error (ldfile,
+		    _("premature end of `translit_ignore' definition"));
+	  return;
+	}
+
+      if (now->tok != tok_bsymbol && now->tok != tok_ucs4)
+	{
+	  lr_error (ldfile, _("syntax error"));
+	  lr_ignore_rest (ldfile, 0);
+	  return;
+	}
+
+      if (now->tok == tok_ucs4)
+	from = now->val.ucs4;
+      else
+	{
+	  /* Try to get the value.  */
+	  from = repertoire_find_value (repertoire, now->val.str.startmb,
+					now->val.str.lenmb);
+	}
+
+      if (from == ILLEGAL_CHAR_VALUE)
+	{
+	  lr_error (ldfile, "invalid character name");
+	  newp = NULL;
+	}
+      else
+	{
+	  newp = (struct translit_ignore_t *)
+	    obstack_alloc (&ctype->mempool, sizeof (struct translit_ignore_t));
+	  newp->from = from;
+	  newp->to = from;
+
+	  newp->next = ctype->translit_ignore;
+	  ctype->translit_ignore = newp;
+	}
+
+      /* Now we expect either a semicolon, an ellipsis, or the end of the
+	 line.  */
+      now = lr_token (ldfile, charmap, repertoire);
+
+      if (now->tok == tok_ellipsis2)
+	{
+	  /* XXX Should we bother implementing `....'?  `...' certainly
+	     will not be implemented.  */
+	  uint32_t to;
+
+	  now = lr_token (ldfile, charmap, repertoire);
+
+	  if (now->tok == tok_eol || now->tok == tok_eof)
+	    {
+	      lr_error (ldfile,
+			_("premature end of `translit_ignore' definition"));
+	      return;
+	    }
+
+	  if (now->tok != tok_bsymbol && now->tok != tok_ucs4)
+	    {
+	      lr_error (ldfile, _("syntax error"));
+	      lr_ignore_rest (ldfile, 0);
+	      return;
+	    }
+
+	  if (now->tok == tok_ucs4)
+	    to = now->val.ucs4;
+	  else
+	    {
+	      /* Try to get the value.  */
+	      to = repertoire_find_value (repertoire, now->val.str.startmb,
+					  now->val.str.lenmb);
+	    }
+
+	  if (to == ILLEGAL_CHAR_VALUE)
+	    lr_error (ldfile, "invalid character name");
+	  else
+	    {
+	      /* Make sure the `to'-value is larger.  */
+	      if (to >= from)
+		newp->to = to;
+	      else
+		lr_error (ldfile, _("\
+to-value <U%0*X> of range is smaller than from-value <U%0*X>"),
+			  (to | from) < 65536 ? 4 : 8, to,
+			  (to | from) < 65536 ? 4 : 8, from);
+	    }
+
+	  /* And the next token.  */
+	  now = lr_token (ldfile, charmap, repertoire);
+	}
+
+      if (now->tok == tok_eol || now->tok == tok_eof)
+	/* We are done.  */
+	return;
+
+      if (now->tok == tok_semicolon)
+	/* Next round.  */
+	continue;
+
+      /* If we come here something is wrong.  */
+      lr_error (ldfile, _("syntax error"));
+      lr_ignore_rest (ldfile, 0);
+      return;
+    }
+}
+
+
 /* The parser for the LC_CTYPE section of the locale definition.  */
 void
 ctype_read (struct linereader *ldfile, struct localedef_t *result,
@@ -2257,6 +2401,45 @@ with character code range values one must use the absolute ellipsis `...'"));
 
 		  /* The rest of the line must be empty.  */
 		  lr_ignore_rest (ldfile, 1);
+
+		  /* Make sure the locale is read.  */
+		  add_to_readlist (LC_CTYPE, ctype->translit_copy_locale,
+				   repertoire_name, 1);
+		  continue;
+		}
+	      else if (now->tok == tok_default_missing)
+		{
+		  uint32_t *wstr;
+
+		  /* We expect a single character or string as the
+		     argument.  */
+		  now = lr_token (ldfile, charmap, NULL);
+		  wstr = read_widestring (ldfile, now, charmap, repertoire);
+
+		  if (wstr != NULL)
+		    {
+		      if (ctype->default_missing != NULL)
+			{
+			  lr_error (ldfile, _("\
+%s: duplicate `default_missing' definition"), "LC_CTYPE");
+			  error_at_line (0, 0, ctype->default_missing_file,
+					 ctype->default_missing_lineno,
+					 _("previous definition was here"));
+			}
+		      else
+			{
+			  ctype->default_missing = wstr;
+			  ctype->default_missing_file = ldfile->fname;
+			  ctype->default_missing_lineno = ldfile->lineno;
+			}
+		    }
+		  lr_ignore_rest (ldfile, 1);
+		  continue;
+		}
+	      else if (now->tok == tok_translit_ignore)
+		{
+		  read_translit_ignore_entry (ldfile, ctype, charmap,
+					      repertoire);
 		  continue;
 		}
 
diff --git a/locale/programs/locfile-kw.gperf b/locale/programs/locfile-kw.gperf
index 91c20891f1..3670548a4c 100644
--- a/locale/programs/locfile-kw.gperf
+++ b/locale/programs/locfile-kw.gperf
@@ -52,6 +52,7 @@ tolower,                tok_tolower,                0
 map,                    tok_map,                    0
 translit_start,         tok_translit_start,         0
 translit_end,           tok_translit_end,           0
+translit_ignore,        tok_translit_ignore,        0
 default_missing,        tok_default_missing,        0
 LC_COLLATE,             tok_lc_collate,             0
 coll_weight_max,        tok_coll_weight_max,        0
diff --git a/locale/programs/locfile-kw.h b/locale/programs/locfile-kw.h
index 811234b25d..a04bc2723c 100644
--- a/locale/programs/locfile-kw.h
+++ b/locale/programs/locfile-kw.h
@@ -24,12 +24,12 @@
 #include "locfile-token.h"
 struct keyword_t ;
 
-#define TOTAL_KEYWORDS 172
+#define TOTAL_KEYWORDS 173
 #define MIN_WORD_LENGTH 3
 #define MAX_WORD_LENGTH 22
 #define MIN_HASH_VALUE 3
-#define MAX_HASH_VALUE 545
-/* maximum key range = 543, duplicates = 0 */
+#define MAX_HASH_VALUE 645
+/* maximum key range = 643, duplicates = 0 */
 
 #ifdef __GNUC__
 __inline
@@ -39,32 +39,32 @@ hash (register const char *str, register unsigned int len)
 {
   static const unsigned short asso_values[] =
     {
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-        5,   0, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546,  20, 546,   0,   0,   0,
-        5,  30,   0,   0, 546, 546,   0, 546,   0,   0,
-      546, 546,  10,   0,   5,  10, 546, 546, 546,   0,
-      546, 546, 546, 546, 546,  30, 546,   0,  10, 125,
-        5,   0, 105,  30,   5,  95, 546,   0, 105, 155,
-      135,  50,  75,   0,   5,  45,   0,  55,   0,  30,
-       25,  25,  10, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-      546, 546, 546, 546, 546, 546
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+       10,   0, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646,  15, 646,   0,   0,   0,
+       10,  20,   0,   0, 646, 646,   0, 646,   0,   5,
+      646, 646,  10,   0,  10,   5, 646, 646, 646,  20,
+      646, 646, 646, 646, 646,  30, 646,   0,  25, 110,
+        5,   0,  25,   0,   5, 105, 646,  20, 125,  85,
+      175,   0,  75,  10,   5, 125,   0, 135,  45,  15,
+       10,  75,   0, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+      646, 646, 646, 646, 646, 646
     };
   register int hval = len;
 
@@ -106,285 +106,296 @@ locfile_hash (register const char *str, register unsigned int len)
       {"LC_ADDRESS",             tok_lc_address,             0},
       {""},
       {"LC_TELEPHONE",           tok_lc_telephone,           0},
-      {"LC_CTYPE",               tok_lc_ctype,               0},
+      {""},
       {"era_t_fmt",              tok_era_t_fmt,              0},
-      {"LC_COLLATE",             tok_lc_collate,             0},
+      {"LC_NUMERIC",             tok_lc_numeric,             0},
       {"height",                 tok_height,                 0},
       {"LC_IDENTIFICATION",      tok_lc_identification,      0},
-      {""},
+      {"LC_CTYPE",               tok_lc_ctype,               0},
       {"era_d_fmt",              tok_era_d_fmt,              0},
-      {"LC_NUMERIC",             tok_lc_numeric,             0},
-      {""}, {""}, {""},
-      {"UNDEFINED",              tok_undefined,              0},
+      {"graph",                  tok_graph,                  0},
+      {"order_start",            tok_order_start,            0},
+      {"LC_NAME",                tok_lc_name,                0},
       {""},
+      {"UNDEFINED",              tok_undefined,              0},
+      {"LC_COLLATE",             tok_lc_collate,             0},
       {"reorder-end",            tok_reorder_end,            0},
-      {"LC_NAME",                tok_lc_name,                0},
+      {"tolower",                tok_tolower,                0},
       {"reorder-after",          tok_reorder_after,          0},
-      {"LC_MEASUREMENT",         tok_lc_measurement,         0},
-      {""},
-      {"LC_MONETARY",            tok_lc_monetary,            0},
+      {"order_end",              tok_order_end,              0},
       {""},
-      {"day",                    tok_day,                    0},
-      {"week",                   tok_week,                   0},
-      {"t_fmt",                  tok_t_fmt,                  0},
-      {"yesstr",                 tok_yesstr,                 0},
+      {"LC_MESSAGES",            tok_lc_messages,            0},
       {""},
       {"LC_PAPER",               tok_lc_paper,               0},
-      {""},
+      {"LC_MEASUREMENT",         tok_lc_measurement,         0},
+      {"t_fmt",                  tok_t_fmt,                  0},
+      {"IGNORE",                 tok_ignore,                 0},
+      {"forward",                tok_forward,                0},
+      {"fax",                    tok_fax,                    0},
+      {"week",                   tok_week,                   0},
       {"d_fmt",                  tok_d_fmt,                  0},
-      {"LC_MESSAGES",            tok_lc_messages,            0},
+      {"tel_dom_fmt",            tok_tel_dom_fmt,            0},
+      {""}, {""}, {""}, {""},
+      {"era_d_t_fmt",            tok_era_d_t_fmt,            0},
+      {""}, {""}, {""}, {""},
+      {"LC_MONETARY",            tok_lc_monetary,            0},
       {""},
-      {"era_year",               tok_era_year,               0},
-      {""}, {""},
-      {"IGNORE",                 tok_ignore,                 0},
-      {""}, {""}, {""},
-      {"graph",                  tok_graph,                  0},
-      {""}, {""},
       {"backward",               tok_backward,               0},
-      {""}, {""}, {""},
-      {"address",                tok_address,                0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""}, {""},
-      {"yesexpr",                tok_yesexpr,                0},
-      {"audience",               tok_audience,               0},
-      {""},
-      {"abday",                  tok_abday,                  0},
-      {""}, {""}, {""}, {""}, {""},
-      {"order_start",            tok_order_start,            0},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {"order_end",              tok_order_end,              0},
-      {"reorder-sections-end",   tok_reorder_sections_end,   0},
+      {"d_t_fmt",                tok_d_t_fmt,                0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""}, {""}, {""}, {""},
+      {"day",                    tok_day,                    0},
       {""},
-      {"reorder-sections-after", tok_reorder_sections_after, 0},
-      {""}, {""},
       {"print",                  tok_print,                  0},
+      {"yesstr",                 tok_yesstr,                 0},
+      {"toupper",                tok_toupper,                0},
+      {"grouping",               tok_grouping,               0},
+      {""}, {""}, {""}, {""},
+      {"era_year",               tok_era_year,               0},
+      {""}, {""}, {""},
+      {"yesexpr",                tok_yesexpr,                0},
+      {""}, {""}, {""}, {""}, {""},
+      {"repertoiremap",          tok_repertoiremap,          0},
       {""}, {""}, {""}, {""}, {""}, {""},
-      {"tolower",                tok_tolower,                0},
-      {""},
-      {"translit_start",         tok_translit_start,         0},
-      {""}, {""},
-      {"translit_end",           tok_translit_end,           0},
-      {""}, {""},
       {"title",                  tok_title,                  0},
       {""}, {""},
-      {"repertoiremap",          tok_repertoiremap,          0},
+      {"timezone",               tok_timezone,               0},
       {""},
       {"digit",                  tok_digit,                  0},
-      {""}, {""},
+      {""},
+      {"contact",                tok_contact,                0},
+      {""},
+      {"from",                   tok_from,                   0},
+      {""},
+      {"country_ab3",            tok_country_ab3,            0},
+      {""}, {""}, {""},
+      {"conversion_rate",        tok_conversion_rate,        0},
+      {"xdigit",                 tok_xdigit,                 0},
+      {"collating-element",      tok_collating_element,      0},
       {"tel",                    tok_tel,                    0},
       {"else",                   tok_else,                   0},
       {"alpha",                  tok_alpha,                  0},
-      {""}, {""},
-      {"timezone",               tok_timezone,               0},
-      {""}, {""}, {""}, {""}, {""}, {""},
-      {"blank",                  tok_blank,                  0},
-      {"tel_dom_fmt",            tok_tel_dom_fmt,            0},
-      {""}, {""}, {""},
-      {"space",                  tok_space,                  0},
-      {"era_d_t_fmt",            tok_era_d_t_fmt,            0},
-      {"duo_valid_to",           tok_duo_valid_to,           0},
+      {"country_ab2",            tok_country_ab2,            0},
       {""}, {""}, {""},
-      {"xdigit",                 tok_xdigit,                 0},
+      {"width",                  tok_width,                  0},
       {""},
-      {"fax",                    tok_fax,                    0},
+      {"address",                tok_address,                0},
+      {""}, {""},
+      {"lower",                  tok_lower,                  0},
+      {"tel_int_fmt",            tok_tel_int_fmt,            0},
       {""},
-      {"punct",                  tok_punct,                  0},
+      {"audience",               tok_audience,               0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""},
-      {"toupper",                tok_toupper,                0},
-      {"symbol-equivalence",     tok_symbol_equivalence,     0},
+      {"elif",                   tok_elif,                   0},
+      {""}, {""}, {""}, {""}, {""},
+      {"reorder-sections-end",   tok_reorder_sections_end,   0},
       {""},
-      {"width",                  tok_width,                  0},
-      {"escape_char",            tok_escape_char,            0},
-      {""}, {""},
+      {"reorder-sections-after", tok_reorder_sections_after, 0},
+      {"map",                    tok_map,                    0},
       {"lang_name",              tok_lang_name,              0},
-      {"upper",                  tok_upper,                  0},
+      {"coll_weight_max",        tok_coll_weight_max,        0},
+      {""}, {""}, {""}, {""},
+      {"postal_fmt",             tok_postal_fmt,             0},
+      {""},
+      {"mon_grouping",           tok_mon_grouping,           0},
+      {""},
+      {"translit_start",         tok_translit_start,         0},
+      {"translit_ignore",        tok_translit_ignore,        0},
+      {""},
+      {"translit_end",           tok_translit_end,           0},
+      {"decimal_point",          tok_decimal_point,          0},
+      {""},
+      {"abday",                  tok_abday,                  0},
+      {""}, {""}, {""}, {""},
+      {"ifdef",                  tok_ifdef,                  0},
       {"define",                 tok_define,                 0},
-      {"d_t_fmt",                tok_d_t_fmt,                0},
-      {"grouping",               tok_grouping,               0},
-      {""}, {""}, {""},
       {"lang_ab",                tok_lang_ab,                0},
       {"lang_lib",               tok_lang_lib,               0},
-      {"territory",              tok_territory,              0},
-      {""}, {""},
-      {"abbreviation",           tok_abbreviation,           0},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {"alt_digits",             tok_alt_digits,             0},
+      {"copy",                   tok_copy,                   0},
+      {"nostr",                  tok_nostr,                  0},
       {""},
-      {"forward",                tok_forward,                0},
-      {"language",               tok_language,               0},
+      {"mon_decimal_point",      tok_mon_decimal_point,      0},
+      {"category",               tok_category,               0},
       {""},
-      {"lower",                  tok_lower,                  0},
+      {"blank",                  tok_blank,                  0},
+      {""},
+      {"country_post",           tok_country_post,           0},
       {""}, {""},
+      {"t_fmt_ampm",             tok_t_fmt_ampm,             0},
+      {""},
+      {"duo_valid_to",           tok_duo_valid_to,           0},
+      {""}, {""},
+      {"space",                  tok_space,                  0},
+      {""}, {""}, {""}, {""}, {""}, {""},
+      {"abbreviation",           tok_abbreviation,           0},
       {"name_fmt",               tok_name_fmt,               0},
-      {""}, {""}, {""},
+      {""},
+      {"punct",                  tok_punct,                  0},
+      {""},
       {"name_mr",                tok_name_mr,                0},
-      {""}, {""}, {""}, {""},
-      {"contact",                tok_contact,                0},
-      {"thousands_sep",          tok_thousands_sep,          0},
+      {"first_weekday",          tok_first_weekday,          0},
       {""}, {""},
-      {"country_ab3",            tok_country_ab3,            0},
+      {"escape_char",            tok_escape_char,            0},
       {""},
-      {"category",               tok_category,               0},
+      {"first_workday",          tok_first_workday,          0},
+      {"p_sep_by_space",         tok_p_sep_by_space,         0},
+      {"upper",                  tok_upper,                  0},
       {""}, {""},
-      {"country_ab2",            tok_country_ab2,            0},
+      {"symbol-equivalence",     tok_symbol_equivalence,     0},
       {""},
-      {"revision",               tok_revision,               0},
+      {"endif",                  tok_endif,                  0},
+      {"measurement",            tok_measurement,            0},
+      {""}, {""}, {""}, {""},
+      {"country_car",            tok_country_car,            0},
+      {"comment_char",           tok_comment_char,           0},
+      {""}, {""},
+      {"default_missing",        tok_default_missing,        0},
+      {"source",                 tok_source,                 0},
       {""}, {""}, {""}, {""}, {""}, {""},
-      {"nostr",                  tok_nostr,                  0},
-      {""}, {""}, {""},
-      {"copy",                   tok_copy,                   0},
-      {""}, {""}, {""},
       {"outdigit",               tok_outdigit,               0},
       {""}, {""},
-      {"tel_int_fmt",            tok_tel_int_fmt,            0},
-      {""}, {""},
-      {"elif",                   tok_elif,                   0},
-      {""}, {""},
-      {"name_ms",                tok_name_ms,                0},
-      {"name_mrs",               tok_name_mrs,               0},
-      {""}, {""},
-      {"measurement",            tok_measurement,            0},
-      {"collating-element",      tok_collating_element,      0},
+      {"collating-symbol",       tok_collating_symbol,       0},
+      {""}, {""}, {""}, {""}, {""}, {""},
+      {"position",               tok_position,               0},
       {""},
-      {"p_sep_by_space",         tok_p_sep_by_space,         0},
+      {"am_pm",                  tok_am_pm,                  0},
+      {"noexpr",                 tok_noexpr,                 0},
+      {""},
+      {"mon",                    tok_mon,                    0},
+      {"territory",              tok_territory,              0},
+      {"alt_digits",             tok_alt_digits,             0},
+      {""}, {""},
+      {"language",               tok_language,               0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {"charconv",               tok_charconv,               0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""},
-      {"source",                 tok_source,                 0},
-      {"duo_p_cs_precedes",      tok_duo_p_cs_precedes,      0},
-      {"duo_p_sep_by_space",     tok_duo_p_sep_by_space,     0},
-      {""}, {""}, {""}, {""},
-      {"map",                    tok_map,                    0},
       {"duo_valid_from",         tok_duo_valid_from,         0},
-      {""}, {""}, {""},
-      {"first_weekday",          tok_first_weekday,          0},
       {""},
-      {"conversion_rate",        tok_conversion_rate,        0},
-      {""}, {""},
-      {"first_workday",          tok_first_workday,          0},
-      {""}, {""}, {""}, {""},
-      {"decimal_point",          tok_decimal_point,          0},
-      {""}, {""}, {""},
-      {"duo_int_p_sep_by_space", tok_duo_int_p_sep_by_space, 0},
-      {""}, {""},
-      {"duo_frac_digits",        tok_duo_frac_digits,        0},
+      {"p_sign_posn",            tok_p_sign_posn,            0},
       {""},
-      {"uno_valid_to",           tok_uno_valid_to,           0},
+      {"positive_sign",          tok_positive_sign,          0},
+      {""}, {""}, {""},
+      {"country_name",           tok_country_name,           0},
       {""}, {""},
-      {"default_missing",        tok_default_missing,        0},
+      {"alnum",                  tok_alnum,                  0},
+      {"frac_digits",            tok_frac_digits,            0},
+      {"mon_thousands_sep",      tok_mon_thousands_sep,      0},
+      {""}, {""}, {""}, {""}, {""},
+      {"duo_p_sep_by_space",     tok_duo_p_sep_by_space,     0},
+      {""}, {""}, {""}, {""},
+      {"revision",               tok_revision,               0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""},
-      {"country_post",           tok_country_post,           0},
-      {"charconv",               tok_charconv,               0},
-      {"name_miss",              tok_name_miss,              0},
-      {""}, {""}, {""},
-      {"position",               tok_position,               0},
-      {"from",                   tok_from,                   0},
-      {"t_fmt_ampm",             tok_t_fmt_ampm,             0},
-      {"noexpr",                 tok_noexpr,                 0},
-      {""}, {""}, {""},
-      {"coll_weight_max",        tok_coll_weight_max,        0},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {"n_sep_by_space",         tok_n_sep_by_space,         0},
-      {"abmon",                  tok_abmon,                  0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {"lang_term",              tok_lang_term,              0},
+      {"duo_frac_digits",        tok_duo_frac_digits,        0},
       {""},
-      {"duo_n_cs_precedes",      tok_duo_n_cs_precedes,      0},
-      {"duo_n_sep_by_space",     tok_duo_n_sep_by_space,     0},
+      {"name_ms",                tok_name_ms,                0},
+      {"name_mrs",               tok_name_mrs,               0},
       {""},
-      {"postal_fmt",             tok_postal_fmt,             0},
-      {"frac_digits",            tok_frac_digits,            0},
-      {"include",                tok_include,                0},
+      {"email",                  tok_email,                  0},
+      {""},
+      {"duo_int_p_sep_by_space", tok_duo_int_p_sep_by_space, 0},
+      {"thousands_sep",          tok_thousands_sep,          0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""},
-      {"duo_int_p_cs_precedes",  tok_duo_int_p_cs_precedes,  0},
+      {"undef",                  tok_undef,                  0},
       {""}, {""}, {""}, {""}, {""}, {""},
-      {"positive_sign",          tok_positive_sign,          0},
-      {"section-symbol",         tok_section_symbol,         0},
+      {"uno_valid_to",           tok_uno_valid_to,           0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {"abmon",                  tok_abmon,                  0},
+      {"country_num",            tok_country_num,            0},
+      {""},
+      {"p_cs_precedes",          tok_p_cs_precedes,          0},
       {""}, {""}, {""},
+      {"duo_p_cs_precedes",      tok_duo_p_cs_precedes,      0},
       {"name_gen",               tok_name_gen,               0},
-      {"duo_currency_symbol",    tok_duo_currency_symbol,    0},
       {""}, {""},
-      {"duo_int_n_sep_by_space", tok_duo_int_n_sep_by_space, 0},
-      {"negative_sign",          tok_negative_sign,          0},
+      {"n_sign_posn",            tok_n_sign_posn,            0},
       {""},
+      {"negative_sign",          tok_negative_sign,          0},
+      {"duo_currency_symbol",    tok_duo_currency_symbol,    0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {"country_isbn",           tok_country_isbn,           0},
+      {""}, {""},
       {"duo_p_sign_posn",        tok_duo_p_sign_posn,        0},
-      {"country_car",            tok_country_car,            0},
-      {"comment_char",           tok_comment_char,           0},
-      {"p_cs_precedes",          tok_p_cs_precedes,          0},
-      {""}, {""}, {""},
-      {"country_name",           tok_country_name,           0},
-      {""},
+      {""}, {""},
+      {"duo_n_sep_by_space",     tok_duo_n_sep_by_space,     0},
+      {""}, {""}, {""}, {""},
+      {"cal_direction",          tok_cal_direction,          0},
       {"duo_int_frac_digits",    tok_duo_int_frac_digits,    0},
-      {"class",                  tok_class,                  0},
-      {"collating-symbol",       tok_collating_symbol,       0},
-      {""}, {""}, {""},
       {"currency_symbol",        tok_currency_symbol,        0},
-      {"p_sign_posn",            tok_p_sign_posn,            0},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {""},
-      {"mon_thousands_sep",      tok_mon_thousands_sep,      0},
-      {"mon",                    tok_mon,                    0},
       {""}, {""}, {""}, {""}, {""}, {""},
-      {"endif",                  tok_endif,                  0},
-      {""},
-      {"mon_grouping",           tok_mon_grouping,           0},
+      {"include",                tok_include,                0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""},
-      {"charclass",              tok_charclass,              0},
+      {"duo_int_n_sep_by_space", tok_duo_int_n_sep_by_space, 0},
+      {""}, {""}, {""}, {""}, {""},
+      {"int_p_sep_by_space",     tok_int_p_sep_by_space,     0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""},
-      {"duo_int_n_cs_precedes",  tok_duo_int_n_cs_precedes,  0},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {"uno_valid_from",         tok_uno_valid_from,         0},
-      {""}, {""}, {""}, {""}, {""},
-      {"email",                  tok_email,                  0},
       {""}, {""}, {""}, {""},
-      {"duo_n_sign_posn",        tok_duo_n_sign_posn,        0},
-      {""}, {""},
-      {"n_cs_precedes",          tok_n_cs_precedes,          0},
-      {""}, {""}, {""},
-      {"mon_decimal_point",      tok_mon_decimal_point,      0},
+      {"name_miss",              tok_name_miss,              0},
       {""},
-      {"duo_int_p_sign_posn",    tok_duo_int_p_sign_posn,    0},
-      {""}, {""}, {""}, {""}, {""}, {""},
-      {"n_sign_posn",            tok_n_sign_posn,            0},
-      {""}, {""}, {""}, {""}, {""},
-      {"int_p_cs_precedes",      tok_int_p_cs_precedes,      0},
-      {"int_p_sep_by_space",     tok_int_p_sep_by_space,     0},
-      {""}, {""}, {""}, {""},
-      {"cal_direction",          tok_cal_direction,          0},
-      {"duo_int_curr_symbol",    tok_duo_int_curr_symbol,    0},
-      {"undef",                  tok_undef,                  0},
+      {"duo_int_p_cs_precedes",  tok_duo_int_p_cs_precedes,  0},
       {""}, {""}, {""}, {""},
-      {"int_select",             tok_int_select,             0},
       {"application",            tok_application,            0},
       {""}, {""}, {""},
-      {"ifdef",                  tok_ifdef,                  0},
-      {""},
-      {"country_isbn",           tok_country_isbn,           0},
-      {""}, {""},
-      {"alnum",                  tok_alnum,                  0},
-      {""}, {""}, {""}, {""},
       {"int_frac_digits",        tok_int_frac_digits,        0},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""}, {""},
       {"int_prefix",             tok_int_prefix,             0},
+      {""}, {""},
+      {"n_cs_precedes",          tok_n_cs_precedes,          0},
+      {"charclass",              tok_charclass,              0},
+      {""}, {""},
+      {"duo_n_cs_precedes",      tok_duo_n_cs_precedes,      0},
+      {""}, {""},
+      {"class",                  tok_class,                  0},
+      {""}, {""}, {""},
+      {"section-symbol",         tok_section_symbol,         0},
+      {""}, {""}, {""}, {""},
+      {"duo_int_curr_symbol",    tok_duo_int_curr_symbol,    0},
+      {""}, {""}, {""}, {""}, {""},
+      {"duo_n_sign_posn",        tok_duo_n_sign_posn,        0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {"duo_int_n_sign_posn",    tok_duo_int_n_sign_posn,    0},
+      {"duo_int_p_sign_posn",    tok_duo_int_p_sign_posn,    0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {"lang_term",              tok_lang_term,              0},
+      {""},
+      {"int_select",             tok_int_select,             0},
+      {""},
+      {"int_p_cs_precedes",      tok_int_p_cs_precedes,      0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""},
+      {"cntrl",                  tok_cntrl,                  0},
+      {""}, {""}, {""}, {""},
+      {"int_p_sign_posn",        tok_int_p_sign_posn,        0},
       {""}, {""},
-      {"int_n_cs_precedes",      tok_int_n_cs_precedes,      0},
       {"int_n_sep_by_space",     tok_int_n_sep_by_space,     0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""},
-      {"am_pm",                  tok_am_pm,                  0},
-      {""}, {""}, {""}, {""},
-      {"cntrl",                  tok_cntrl,                  0},
-      {"country_num",            tok_country_num,            0},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {"int_p_sign_posn",        tok_int_p_sign_posn,        0},
+      {"int_curr_symbol",        tok_int_curr_symbol,        0},
+      {""}, {""}, {""}, {""}, {""},
+      {"duo_int_n_cs_precedes",  tok_duo_int_n_cs_precedes,  0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {""},
-      {"int_curr_symbol",        tok_int_curr_symbol,        0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""},
+      {"duo_int_n_sign_posn",    tok_duo_int_n_sign_posn,    0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""},
+      {"int_n_cs_precedes",      tok_int_n_cs_precedes,      0},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {"int_n_sign_posn",        tok_int_n_sign_posn,        0}
     };
 
diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h
index 97945f8f1a..e1cd5f7a74 100644
--- a/locale/programs/locfile-token.h
+++ b/locale/programs/locfile-token.h
@@ -88,6 +88,7 @@ enum token_t
   tok_map,
   tok_translit_start,
   tok_translit_end,
+  tok_translit_ignore,
   tok_default_missing,
   tok_lc_collate,
   tok_coll_weight_max,