]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - locale/programs/ld-time.c
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / locale / programs / ld-time.c
index a40edfd474f29e8794c3a30916ef5da8fb0b2270..a1721e05c6f5838b45cab70d3a966a7aec391d3d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-2014 Free Software Foundation, Inc.
+/* Copyright (C) 1995-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -13,7 +13,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -91,6 +91,12 @@ struct locale_time_t
   const char *date_fmt;
   const uint32_t *wdate_fmt;
   int alt_digits_defined;
+  const char *alt_mon[12];
+  const uint32_t *walt_mon[12];
+  int alt_mon_defined;
+  const char *ab_alt_mon[12];
+  const uint32_t *wab_alt_mon[12];
+  int ab_alt_mon_defined;
   unsigned char week_ndays;
   uint32_t week_1stday;
   unsigned char week_1stweek;
@@ -155,9 +161,8 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
         empty one.  */
       if (time == NULL)
        {
-         if (! be_quiet)
-           WITH_CUR_LOCALE (error (0, 0, _("\
-No definition for %s category found"), "LC_TIME"));
+         record_warning (_("\
+No definition for %s category found"), "LC_TIME");
          time_startup (NULL, locale, 0);
          time = locale->categories[LC_TIME].time;
          nothing = 1;
@@ -171,9 +176,9 @@ No definition for %s category found"), "LC_TIME"));
       const char *initval[] = { noparen val };                               \
       unsigned int i;                                                        \
                                                                              \
-      if (! be_quiet && ! nothing)                                           \
-       WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),        \
-                               "LC_TIME", #cat));                            \
+      if (! nothing)                                                         \
+       record_error (0, 0, _("%s: field `%s' not defined"),                  \
+                     "LC_TIME", #cat);                                       \
                                                                              \
       for (i = 0; i < sizeof (initval) / sizeof (initval[0]); ++i)           \
        time->cat[i] = initval[i];                                            \
@@ -192,9 +197,9 @@ No definition for %s category found"), "LC_TIME"));
 #define TEST_ELEM(cat, initval) \
   if (time->cat == NULL)                                                     \
     {                                                                        \
-      if (! be_quiet && ! nothing)                                           \
-       WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),        \
-                               "LC_TIME", #cat));                            \
+      if (! nothing)                                                         \
+       record_error (0, 0, _("%s: field `%s' not defined"),                  \
+                     "LC_TIME", #cat);                                       \
                                                                              \
       time->cat = initval;                                                   \
     }
@@ -243,10 +248,9 @@ No definition for %s category found"), "LC_TIME"));
          /* First character must be + or - for the direction.  */
          if (*str != '+' && *str != '-')
            {
-             if (!be_quiet)
-               WITH_CUR_LOCALE (error (0, 0, _("\
+             record_error (0, 0, _("\
 %s: direction flag in string %Zd in `era' field is not '+' nor '-'"),
-                                       "LC_TIME", idx + 1));
+                           "LC_TIME", idx + 1);
              /* Default arbitrarily to '+'.  */
              time->era_entries[idx].direction = '+';
            }
@@ -254,10 +258,9 @@ No definition for %s category found"), "LC_TIME"));
            time->era_entries[idx].direction = *str;
          if (*++str != ':')
            {
-             if (!be_quiet)
-               WITH_CUR_LOCALE (error (0, 0, _("\
+             record_error (0, 0, _("\
 %s: direction flag in string %Zd in `era' field is not a single character"),
-                                       "LC_TIME", idx + 1));
+                           "LC_TIME", idx + 1);
              (void) strsep (&str, ":");
            }
          else
@@ -267,18 +270,16 @@ No definition for %s category found"), "LC_TIME"));
          time->era_entries[idx].offset = strtol (str, &endp, 10);
          if (endp == str)
            {
-             if (!be_quiet)
-               WITH_CUR_LOCALE (error (0, 0, _("\
+             record_error (0, 0, _("\
 %s: invalid number for offset in string %Zd in `era' field"),
-                                       "LC_TIME", idx + 1));
+                           "LC_TIME", idx + 1);
              (void) strsep (&str, ":");
            }
          else if (*endp != ':')
            {
-             if (!be_quiet)
-               WITH_CUR_LOCALE (error (0, 0, _("\
+             record_error (0, 0, _("\
 %s: garbage at end of offset value in string %Zd in `era' field"),
-                                       "LC_TIME", idx + 1));
+                           "LC_TIME", idx + 1);
              (void) strsep (&str, ":");
            }
          else
@@ -326,19 +327,17 @@ No definition for %s category found"), "LC_TIME"));
              if (endp == str)
                {
                invalid_start_date:
-                 if (!be_quiet)
-                   WITH_CUR_LOCALE (error (0, 0, _("\
+                 record_error (0, 0, _("\
 %s: invalid starting date in string %Zd in `era' field"),
-                                           "LC_TIME", idx + 1));
+                               "LC_TIME", idx + 1);
                  (void) strsep (&str, ":");
                }
              else if (*endp != ':')
                {
                garbage_start_date:
-                 if (!be_quiet)
-                   WITH_CUR_LOCALE (error (0, 0, _("\
+                 record_error (0, 0, _("\
 %s: garbage at end of starting date in string %Zd in `era' field "),
-                                           "LC_TIME", idx + 1));
+                               "LC_TIME", idx + 1);
                  (void) strsep (&str, ":");
                }
              else
@@ -353,11 +352,10 @@ No definition for %s category found"), "LC_TIME"));
                           > days_per_month[time->era_entries[idx].start_date[1]])
                       || (time->era_entries[idx].start_date[1] == 2
                           && time->era_entries[idx].start_date[2] == 29
-                          && !__isleap (time->era_entries[idx].start_date[0])))
-                     && !be_quiet)
-                         WITH_CUR_LOCALE (error (0, 0, _("\
+                          && !__isleap (time->era_entries[idx].start_date[0]))))
+                   record_error (0, 0, _("\
 %s: starting date is invalid in string %Zd in `era' field"),
-                                                 "LC_TIME", idx + 1));
+                                 "LC_TIME", idx + 1);
                }
            }
 
@@ -403,19 +401,17 @@ No definition for %s category found"), "LC_TIME"));
              if (endp == str)
                {
                invalid_stop_date:
-                 if (!be_quiet)
-                   WITH_CUR_LOCALE (error (0, 0, _("\
+                 record_error (0, 0, _("\
 %s: invalid stopping date in string %Zd in `era' field"),
-                                           "LC_TIME", idx + 1));
+                               "LC_TIME", idx + 1);
                  (void) strsep (&str, ":");
                }
              else if (*endp != ':')
                {
                garbage_stop_date:
-                 if (!be_quiet)
-                   WITH_CUR_LOCALE (error (0, 0, _("\
+                 record_error (0, 0, _("\
 %s: garbage at end of stopping date in string %Zd in `era' field"),
-                                           "LC_TIME", idx + 1));
+                               "LC_TIME", idx + 1);
                  (void) strsep (&str, ":");
                }
              else
@@ -430,19 +426,17 @@ No definition for %s category found"), "LC_TIME"));
                           > days_per_month[time->era_entries[idx].stop_date[1]])
                       || (time->era_entries[idx].stop_date[1] == 2
                           && time->era_entries[idx].stop_date[2] == 29
-                          && !__isleap (time->era_entries[idx].stop_date[0])))
-                     && !be_quiet)
-                         WITH_CUR_LOCALE (error (0, 0, _("\
+                          && !__isleap (time->era_entries[idx].stop_date[0]))))
+                   record_error (0, 0, _("\
 %s: invalid stopping date in string %Zd in `era' field"),
-                                                 "LC_TIME", idx + 1));
+                                 "LC_TIME", idx + 1);
                }
            }
 
          if (str == NULL || *str == '\0')
            {
-             if (!be_quiet)
-               WITH_CUR_LOCALE (error (0, 0, _("\
-%s: missing era name in string %Zd in `era' field"), "LC_TIME", idx + 1));
+             record_error (0, 0, _("\
+%s: missing era name in string %Zd in `era' field"), "LC_TIME", idx + 1);
              time->era_entries[idx].name =
                time->era_entries[idx].format = "";
            }
@@ -452,10 +446,9 @@ No definition for %s category found"), "LC_TIME"));
 
              if (str == NULL || *str == '\0')
                {
-                 if (!be_quiet)
-                   WITH_CUR_LOCALE (error (0, 0, _("\
+                 record_error (0, 0, _("\
 %s: missing era format in string %Zd in `era' field"),
-                                           "LC_TIME", idx + 1));
+                               "LC_TIME", idx + 1);
                  time->era_entries[idx].name =
                    time->era_entries[idx].format = "";
                }
@@ -487,40 +480,44 @@ No definition for %s category found"), "LC_TIME"));
        }
     }
 
+  /* Set up defaults based on ISO 30112 WD10 [2014].  */
   if (time->week_ndays == 0)
     time->week_ndays = 7;
 
   if (time->week_1stday == 0)
     time->week_1stday = 19971130;
 
+  if (time->week_1stweek == 0)
+    time->week_1stweek = 7;
+
   if (time->week_1stweek > time->week_ndays)
-    WITH_CUR_LOCALE (error (0, 0, _("\
+    record_error (0, 0, _("\
 %s: third operand for value of field `%s' must not be larger than %d"),
-                           "LC_TIME", "week", 7));
+                 "LC_TIME", "week", 7);
 
   if (time->first_weekday == '\0')
     /* The definition does not specify this so the default is used.  */
     time->first_weekday = 1;
   else if (time->first_weekday > time->week_ndays)
-    WITH_CUR_LOCALE (error (0, 0, _("\
+    record_error (0, 0, _("\
 %s: values for field `%s' must not be larger than %d"),
-                           "LC_TIME", "first_weekday", 7));
+                 "LC_TIME", "first_weekday", 7);
 
   if (time->first_workday == '\0')
     /* The definition does not specify this so the default is used.  */
     time->first_workday = 2;
   else if (time->first_workday > time->week_ndays)
-    WITH_CUR_LOCALE (error (0, 0, _("\
+    record_error (0, 0, _("\
 %s: values for field `%s' must not be larger than %d"),
-                           "LC_TIME", "first_workday", 7));
+                 "LC_TIME", "first_workday", 7);
 
   if (time->cal_direction == '\0')
     /* The definition does not specify this so the default is used.  */
     time->cal_direction = 1;
   else if (time->cal_direction > 3)
-    WITH_CUR_LOCALE (error (0, 0, _("\
+    record_error (0, 0, _("\
 %s: values for field `%s' must not be larger than %d"),
-                           "LC_TIME", "cal_direction", 3));
+                 "LC_TIME", "cal_direction", 3);
 
   /* XXX We don't perform any tests on the timezone value since this is
      simply useless, stupid $&$!@...  */
@@ -648,6 +645,23 @@ time_output (struct localedef_t *locale, const struct charmap_t *charmap,
   add_locale_string (&file, time->date_fmt);
   add_locale_wstring (&file, time->wdate_fmt);
   add_locale_string (&file, charmap->code_set_name);
+
+  /* The alt'mons.  */
+  for (n = 0; n < 12; ++n)
+    add_locale_string (&file, time->alt_mon[n] ?: "");
+
+  /* The wide character alt'mons.  */
+  for (n = 0; n < 12; ++n)
+    add_locale_wstring (&file, time->walt_mon[n] ?: empty_wstr);
+
+  /* The ab'alt'mons.  */
+  for (n = 0; n < 12; ++n)
+    add_locale_string (&file, time->ab_alt_mon[n] ?: "");
+
+  /* The wide character ab'alt'mons.  */
+  for (n = 0; n < 12; ++n)
+    add_locale_wstring (&file, time->wab_alt_mon[n] ?: empty_wstr);
+
   write_locale_data (output_path, LC_TIME, "LC_TIME", &file);
 }
 
@@ -791,6 +805,8 @@ time_read (struct linereader *ldfile, struct localedef_t *result,
          STRARR_ELEM (mon, 12, 12);
          STRARR_ELEM (am_pm, 2, 2);
          STRARR_ELEM (alt_digits, 0, 100);
+         STRARR_ELEM (alt_mon, 12, 12);
+         STRARR_ELEM (ab_alt_mon, 12, 12);
 
        case tok_era:
          /* Ignore the rest of the line if we don't need the input of
@@ -943,6 +959,21 @@ time_read (struct linereader *ldfile, struct localedef_t *result,
            lr_error (ldfile, _("\
 %1$s: definition does not end with `END %1$s'"), "LC_TIME");
          lr_ignore_rest (ldfile, now->tok == tok_lc_time);
+
+         /* If alt_mon was not specified, make it a copy of mon.  */
+         if (!ignore_content && !time->alt_mon_defined)
+           {
+             memcpy (time->alt_mon, time->mon, sizeof (time->mon));
+             memcpy (time->walt_mon, time->wmon, sizeof (time->wmon));
+             time->alt_mon_defined = 1;
+           }
+         /* The same for abbreviated versions.  */
+         if (!ignore_content && !time->ab_alt_mon_defined)
+           {
+             memcpy (time->ab_alt_mon, time->abmon, sizeof (time->abmon));
+             memcpy (time->wab_alt_mon, time->wabmon, sizeof (time->wabmon));
+             time->ab_alt_mon_defined = 1;
+           }
          return;
 
        default: