Write out decimal point and thousands separator info in wide character
authordrepper <drepper>
Sat, 29 Jan 2000 02:49:22 +0000 (02:49 +0000)
committerdrepper <drepper>
Sat, 29 Jan 2000 02:49:22 +0000 (02:49 +0000)
form.

locale/programs/ld-monetary.c
locale/programs/ld-numeric.c

index 6a76558..2b2ac63 100644 (file)
@@ -43,6 +43,8 @@ struct locale_monetary_t
   const char *currency_symbol;
   const char *mon_decimal_point;
   const char *mon_thousands_sep;
+  uint32_t mon_decimal_point_wc;
+  uint32_t mon_thousands_sep_wc;
   char *mon_grouping;
   size_t mon_grouping_len;
   const char *positive_sign;
@@ -150,7 +152,7 @@ monetary_startup (struct linereader *lr, struct localedef_t *locale,
   if (lr != NULL)
     {
       lr->translate_strings = 1;
-      lr->return_widestr = 0;
+      lr->return_widestr = 1;
     }
 }
 
@@ -248,6 +250,8 @@ not correspond to a valid name in ISO 4217"),
 %s: value for field `%s' must not be the empty string"),
             "LC_MONETARY", "mon_decimal_point");
     }
+  if (monetary->mon_decimal_point_wc == L'\0')
+    monetary->mon_decimal_point_wc = L'.';
 
   if (monetary->mon_grouping_len == 0)
     {
@@ -575,6 +579,16 @@ monetary_output (struct localedef_t *locale, struct charmap_t *charmap,
   iov[cnt].iov_len = 8;
   ++cnt;
 
+  idx[cnt - 2] = idx[cnt - 3] + iov[cnt - 1].iov_len;
+  iov[cnt].iov_base = (void *) &monetary->mon_decimal_point_wc;
+  iov[cnt].iov_len = sizeof (uint32_t);
+  ++cnt;
+
+  idx[cnt - 2] = idx[cnt - 3] + iov[cnt - 1].iov_len;
+  iov[cnt].iov_base = (void *) &monetary->mon_thousands_sep_wc;
+  iov[cnt].iov_len = sizeof (uint32_t);
+  ++cnt;
+
   assert (cnt == 2 + _NL_ITEM_INDEX (_NL_NUM_LC_MONETARY));
 
   write_locale_data (output_path, "LC_MONETARY",
@@ -666,13 +680,51 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result,
 
          STR_ELEM (int_curr_symbol);
          STR_ELEM (currency_symbol);
-         STR_ELEM (mon_decimal_point);
-         STR_ELEM (mon_thousands_sep);
          STR_ELEM (positive_sign);
          STR_ELEM (negative_sign);
          STR_ELEM (duo_int_curr_symbol);
          STR_ELEM (duo_currency_symbol);
 
+#define STR_ELEM_WC(cat) \
+       case tok_##cat:                                                       \
+         /* Ignore the rest of the line if we don't need the input of        \
+            this line.  */                                                   \
+         if (ignore_content)                                                 \
+           {                                                                 \
+             lr_ignore_rest (ldfile, 0);                                     \
+             break;                                                          \
+           }                                                                 \
+                                                                             \
+         now = lr_token (ldfile, charmap, NULL);                             \
+         if (now->tok != tok_string)                                         \
+           goto err_label;                                                   \
+         if (monetary->cat != NULL)                                          \
+           lr_error (ldfile, _("\
+%s: field `%s' declared more than once"), "LC_MONETARY", #cat);                      \
+         else if (!ignore_content && now->val.str.startmb == NULL)           \
+           {                                                                 \
+             lr_error (ldfile, _("\
+%s: unknown character in field `%s'"), "LC_MONETARY", #cat);                 \
+             monetary->cat = "";                                             \
+             monetary->cat##_wc = L'\0';                                     \
+           }                                                                 \
+         else if (now->val.str.startwc != NULL && now->val.str.lenwc > 1)    \
+           {                                                                 \
+             lr_error (ldfile, _("\
+%s: value for field `%s' must be a single character"), "LC_MONETARY", #cat);  \
+           }                                                                 \
+         else if (!ignore_content)                                           \
+           {                                                                 \
+             monetary->cat = now->val.str.startmb;                           \
+                                                                             \
+             if (now->val.str.startwc != NULL)                               \
+               monetary->cat##_wc = *now->val.str.startwc;                   \
+           }                                                                 \
+         break
+
+         STR_ELEM_WC (mon_decimal_point);
+         STR_ELEM_WC (mon_thousands_sep);
+
 #define INT_ELEM(cat) \
        case tok_##cat:                                                       \
          /* Ignore the rest of the line if we don't need the input of        \
index e61db91..d7cec90 100644 (file)
@@ -40,6 +40,8 @@ struct locale_numeric_t
   const char *thousands_sep;
   char *grouping;
   size_t grouping_len;
+  uint32_t decimal_point_wc;
+  uint32_t thousands_sep_wc;
 };
 
 
@@ -49,19 +51,15 @@ numeric_startup (struct linereader *lr, struct localedef_t *locale,
 {
   if (!ignore_content)
     {
-      struct locale_numeric_t *numeric;
-
-      locale->categories[LC_NUMERIC].numeric = numeric =
-       (struct locale_numeric_t *) xcalloc (1, sizeof (*numeric));
-
-      numeric->grouping = NULL;
-      numeric->grouping_len = 0;
+      locale->categories[LC_NUMERIC].numeric =
+       (struct locale_numeric_t *) xcalloc (1,
+                                            sizeof (struct locale_numeric_t));
     }
 
   if (lr != NULL)
     {
       lr->translate_strings = 1;
-      lr->return_widestr = 0;
+      lr->return_widestr = 1;
     }
 }
 
@@ -106,12 +104,14 @@ numeric_finish (struct localedef_t *locale, struct charmap_t *charmap)
        }
     }
 
-#define TEST_ELEM(cat                                                      \
+#define TEST_ELEM(cat, default)                                                      \
   if (numeric->cat == NULL && ! be_quiet && ! nothing)                       \
-    error (0, 0, _("%s: field `%s' not defined"), "LC_NUMERIC", #cat)
+    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);
-  TEST_ELEM (thousands_sep);
+  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
@@ -169,6 +169,16 @@ numeric_output (struct localedef_t *locale, struct charmap_t *charmap,
   iov[cnt].iov_base = numeric->grouping;
   iov[cnt].iov_len = numeric->grouping_len;
 
+  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;
+  iov[cnt].iov_base = (void *) &numeric->thousands_sep_wc;
+  iov[cnt].iov_len = sizeof (uint32_t);;
+  ++cnt;
+
   assert (cnt + 1 == 2 + _NL_ITEM_INDEX (_NL_NUM_LC_NUMERIC));
 
   write_locale_data (output_path, "LC_NUMERIC",
@@ -246,9 +256,20 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result,
              lr_error (ldfile, _("\
 %s: unknown character in field `%s'"), "LC_NUMERIC", #cat);                  \
              numeric->cat = "";                                              \
+             numeric->cat##_wc = L'\0';                                      \
+           }                                                                 \
+         else if (now->val.str.startwc != NULL && now->val.str.lenwc > 1)    \
+           {                                                                 \
+             lr_error (ldfile, _("\
+%s: value for field `%s' must be a single character"), "LC_NUMERIC", #cat);   \
            }                                                                 \
          else if (!ignore_content)                                           \
-           numeric->cat = now->val.str.startmb;                              \
+           {                                                                 \
+             numeric->cat = now->val.str.startmb;                            \
+                                                                             \
+             if (now->val.str.startwc != NULL)                               \
+               numeric->cat##_wc = *now->val.str.startwc;                    \
+           }                                                                 \
          break
 
          STR_ELEM (decimal_point);