diff options
Diffstat (limited to 'locale/programs/ld-time.c')
-rw-r--r-- | locale/programs/ld-time.c | 143 |
1 files changed, 87 insertions, 56 deletions
diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c index ca31c9c81b..a755792363 100644 --- a/locale/programs/ld-time.c +++ b/locale/programs/ld-time.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2016 Free Software Foundation, Inc. +/* Copyright (C) 1995-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -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: |