-/* 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.
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>
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;
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;
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]; \
#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; \
}
/* 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 = '+';
}
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
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
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
> 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);
}
}
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
> 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 = "";
}
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 = "";
}
}
}
+ /* 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 $&$!@... */
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);
}
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
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: