summaryrefslogtreecommitdiff
path: root/locale/programs/ld-time.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/programs/ld-time.c')
-rw-r--r--locale/programs/ld-time.c143
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: