Emit codeset information.
[kopensolaris-gnu/glibc.git] / locale / programs / ld-numeric.c
index 3a9d18d..6bf6c25 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -104,15 +104,6 @@ numeric_finish (struct localedef_t *locale, struct charmap_t *charmap)
        }
     }
 
-#define TEST_ELEM(cat, default)                                                      \
-  if (numeric->cat == NULL && ! be_quiet && ! nothing)                       \
-    error (0, 0, _("%s: field `%s' not defined"), "LC_NUMERIC", #cat);       \
-  if (numeric->cat##_wc == L'\0')                                            \
-    numeric->cat##_wc = default
-
-  TEST_ELEM (decimal_point, L'.');
-  TEST_ELEM (thousands_sep, L'\0');
-
   /* The decimal point must not be empty.  This is not said explicitly
      in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
      != "".  */
@@ -129,6 +120,8 @@ numeric_finish (struct localedef_t *locale, struct charmap_t *charmap)
 %s: value for field `%s' must not be the empty string"),
             "LC_NUMERIC", "decimal_point");
     }
+  if (numeric->decimal_point_wc == L'\0')
+    numeric->decimal_point_wc = L'.';
 
   if (numeric->grouping_len == 0 && ! be_quiet && ! nothing)
     error (0, 0, _("%s: field `%s' not defined"), "LC_NUMERIC", "grouping");
@@ -140,7 +133,7 @@ numeric_output (struct localedef_t *locale, struct charmap_t *charmap,
                const char *output_path)
 {
   struct locale_numeric_t *numeric = locale->categories[LC_NUMERIC].numeric;
-  struct iovec iov[2 + _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC)];
+  struct iovec iov[3 + _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC)];
   struct locale_file data;
   uint32_t idx[_NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC)];
   size_t cnt = 0;
@@ -168,21 +161,33 @@ numeric_output (struct localedef_t *locale, struct charmap_t *charmap,
   idx[cnt - 2] = idx[cnt - 3] + iov[cnt - 1].iov_len;
   iov[cnt].iov_base = numeric->grouping;
   iov[cnt].iov_len = numeric->grouping_len;
+  ++cnt;
+
+  idx[cnt - 2] = idx[cnt - 3] + iov[cnt - 1].iov_len;
+
+  /* Align following data */
+  iov[cnt].iov_base = (void *) "\0\0";
+  iov[cnt].iov_len = ((idx[cnt - 2] + 3) & ~3) - idx[cnt - 2];
+  idx[cnt - 2] = (idx[cnt - 2] + 3) & ~3;
+  ++cnt;
 
-  idx[cnt - 2] = iov[0].iov_len + iov[1].iov_len;
   iov[cnt].iov_base = (void *) &numeric->decimal_point_wc;
   iov[cnt].iov_len = sizeof (uint32_t);
   ++cnt;
 
-  idx[cnt - 2] = idx[cnt - 3] + iov[cnt - 1].iov_len;
+  idx[cnt - 3] = idx[cnt - 4] + iov[cnt - 1].iov_len;
   iov[cnt].iov_base = (void *) &numeric->thousands_sep_wc;
-  iov[cnt].iov_len = sizeof (uint32_t);;
+  iov[cnt].iov_len = sizeof (uint32_t);
   ++cnt;
 
-  assert (cnt + 1 == 2 + _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC));
+  idx[cnt - 3] = idx[cnt - 4] + iov[cnt - 1].iov_len;
+  iov[cnt].iov_base = (void *) charmap->code_set_name;
+  iov[cnt].iov_len = strlen (iov[cnt].iov_base) + 1;
+
+  assert (cnt + 1 == 3 + _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC));
 
   write_locale_data (output_path, "LC_NUMERIC",
-                    2 + _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC), iov);
+                    3 + _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC), iov);
 }
 
 
@@ -192,17 +197,22 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
              struct charmap_t *charmap, const char *repertoire_name,
              int ignore_content)
 {
+  struct repertoire_t *repertoire = NULL;
   struct locale_numeric_t *numeric;
   struct token *now;
   enum token_t nowtok;
 
+  /* Get the repertoire we have to use.  */
+  if (repertoire_name != NULL)
+    repertoire = repertoire_read (repertoire_name);
+
   /* The rest of the line containing `LC_NUMERIC' must be free.  */
   lr_ignore_rest (ldfile, 1);
 
 
   do
     {
-      now = lr_token (ldfile, charmap, NULL);
+      now = lr_token (ldfile, charmap, NULL, verbose);
       nowtok = now->tok;
     }
   while (nowtok == tok_eol);
@@ -228,7 +238,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
       /* Ingore empty lines.  */
       if (nowtok == tok_eol)
        {
-         now = lr_token (ldfile, charmap, NULL);
+         now = lr_token (ldfile, charmap, NULL, verbose);
          nowtok = now->tok;
          continue;
        }
@@ -245,8 +255,8 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
              break;                                                          \
            }                                                                 \
                                                                              \
-         lr->return_widestr = 1;                                             \
-         now = lr_token (ldfile, charmap, NULL);                             \
+         ldfile->return_widestr = 1;                                         \
+         now = lr_token (ldfile, charmap, repertoire, verbose);              \
          if (now->tok != tok_string)                                         \
            goto err_label;                                                   \
          if (numeric->cat != NULL)                                           \
@@ -271,7 +281,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
              if (now->val.str.startwc != NULL)                               \
                numeric->cat##_wc = *now->val.str.startwc;                    \
            }                                                                 \
-         lr->return_widestr = 0;                                             \
+         ldfile->return_widestr = 0;                                         \
          break
 
          STR_ELEM (decimal_point);
@@ -286,7 +296,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
              break;
            }
 
-         now = lr_token (ldfile, charmap, NULL);
+         now = lr_token (ldfile, charmap, NULL, verbose);
          if (now->tok != tok_minus1 && now->tok != tok_number)
            goto err_label;
          else
@@ -333,11 +343,11 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
                    grouping[act++] = now->val.num;
 
                  /* Next must be semicolon.  */
-                 now = lr_token (ldfile, charmap, NULL);
+                 now = lr_token (ldfile, charmap, NULL, verbose);
                  if (now->tok != tok_semicolon)
                    break;
 
-                 now = lr_token (ldfile, charmap, NULL);
+                 now = lr_token (ldfile, charmap, NULL, verbose);
                }
              while (now->tok == tok_minus1 || now->tok == tok_number);
 
@@ -356,7 +366,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
 
        case tok_end:
          /* Next we assume `LC_NUMERIC'.  */
-         now = lr_token (ldfile, charmap, NULL);
+         now = lr_token (ldfile, charmap, NULL, verbose);
          if (now->tok == tok_eof)
            break;
          if (now->tok == tok_eol)
@@ -373,7 +383,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
        }
 
       /* Prepare for the next round.  */
-      now = lr_token (ldfile, charmap, NULL);
+      now = lr_token (ldfile, charmap, NULL, verbose);
       nowtok = now->tok;
     }