]> sourceware.org Git - glibc.git/commitdiff
Abbreviated alternative month names (%Ob) also added (bug 10871).
authorRafal Luzynski <digitalfreak@lingonborough.com>
Tue, 14 Nov 2017 01:22:38 +0000 (02:22 +0100)
committerRafal Luzynski <digitalfreak@lingonborough.com>
Mon, 22 Jan 2018 10:26:55 +0000 (11:26 +0100)
All the previous changes also repeated to support abbreviated
alternative month names.  In most languages which have declension and
need nominative/genitive month names the abbreviated forms for both
cases are the same.  An example where they do differ is May in Russian:
this name is too short to be abbreviated so even the abbreviated form
features the declension suffixes.

[BZ #10871]
* locale/C-time.c (_nl_C_LC_TIME): Add abbreviated alternative month
names, define them as the same as abbreviated month names explicitly.
* locale/categories.def (LC_TIME): Add ab_alt_mon and wide-ab_alt_mon.
* locale/langinfo.h: (_NL_ABALTMON_1, _NL_ABALTMON_2, _NL_ABALTMON_3,
_NL_ABALTMON_4, _NL_ABALTMON_5, _NL_ABALTMON_6, _NL_ABALTMON_7,
_NL_ABALTMON_8, _NL_ABALTMON_9, _NL_ABALTMON_10, _NL_ABALTMON_11,
_NL_ABALTMON_12, _NL_WABALTMON_1, _NL_WABALTMON_2, _NL_WABALTMON_3,
_NL_WABALTMON_4, _NL_WABALTMON_5, _NL_WABALTMON_6, _NL_WABALTMON_7,
_NL_WABALTMON_8, _NL_WABALTMON_9, _NL_WABALTMON_10, _NL_WABALTMON_11,
_NL_WABALTMON_12): New enum constants.
* locale/programs/ld-time.c (struct locale_time_t): Add ab_alt_mon,
wab_alt_mon, and ab_alt_mon_defined members.
(time_output): Output ab_alt_mon and wab_alt_mon members.
(time_read): Read them, initialize them as copies of abmon and wabmon
respectively if they are missing, initialize ab_alt_mon_defined.
* locale/programs/locfile-kw.gperf (ab_alt_mon): Define.
* locale/programs/locfile-kw.h: Regenerate.
* locale/programs/locfile-token.h (tok_ab_alt_mon): New enum constant.
* time/Makefile [$(run-built-tests) = yes] (LOCALES): Add es_ES.UTF-8
and ru_RU.UTF-8.
* time/strftime_l.c (a_altmonth, aam_len): New macros.
[!COMPILE_WIDE] (ABALTMON_1): New macro.
(__strftime_internal): Handle %Ob and %Oh formats.
* time/strptime_l.c [_LIBC] (ab_alt_month_name): New macro.
(__strptime_internal): Handle %Ob and %Oh formats.
* time/tst-strptime.c (day_tests): Add more tests to parse different
forms of month names including the new %Ob format specifier.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
12 files changed:
ChangeLog
locale/C-time.c
locale/categories.def
locale/langinfo.h
locale/programs/ld-time.c
locale/programs/locfile-kw.gperf
locale/programs/locfile-kw.h
locale/programs/locfile-token.h
time/Makefile
time/strftime_l.c
time/strptime_l.c
time/tst-strptime.c

index 8c333bb88fa1211a689c5103fff077dd872c1a74..ab15b5991cb9cdb9552afcdf6b9e3ba0845f5162 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2018-01-22  Rafal Luzynski  <digitalfreak@lingonborough.com>
+
+       [BZ #10871]
+       * locale/C-time.c (_nl_C_LC_TIME): Add abbreviated alternative month
+       names, define them as the same as abbreviated month names explicitly.
+       * locale/categories.def (LC_TIME): Add ab_alt_mon and wide-ab_alt_mon.
+       * locale/langinfo.h: (_NL_ABALTMON_1, _NL_ABALTMON_2, _NL_ABALTMON_3,
+       _NL_ABALTMON_4, _NL_ABALTMON_5, _NL_ABALTMON_6, _NL_ABALTMON_7,
+       _NL_ABALTMON_8, _NL_ABALTMON_9, _NL_ABALTMON_10, _NL_ABALTMON_11,
+       _NL_ABALTMON_12, _NL_WABALTMON_1, _NL_WABALTMON_2, _NL_WABALTMON_3,
+       _NL_WABALTMON_4, _NL_WABALTMON_5, _NL_WABALTMON_6, _NL_WABALTMON_7,
+       _NL_WABALTMON_8, _NL_WABALTMON_9, _NL_WABALTMON_10, _NL_WABALTMON_11,
+       _NL_WABALTMON_12): New enum constants.
+       * locale/programs/ld-time.c (struct locale_time_t): Add ab_alt_mon,
+       wab_alt_mon, and ab_alt_mon_defined members.
+       (time_output): Output ab_alt_mon and wab_alt_mon members.
+       (time_read): Read them, initialize them as copies of abmon and wabmon
+       respectively if they are missing, initialize ab_alt_mon_defined.
+       * locale/programs/locfile-kw.gperf (ab_alt_mon): Define.
+       * locale/programs/locfile-kw.h: Regenerate.
+       * locale/programs/locfile-token.h (tok_ab_alt_mon): New enum constant.
+       * time/Makefile [$(run-built-tests) = yes] (LOCALES): Add es_ES.UTF-8
+       and ru_RU.UTF-8.
+       * time/strftime_l.c (a_altmonth, aam_len): New macros.
+       [!COMPILE_WIDE] (ABALTMON_1): New macro.
+       (__strftime_internal): Handle %Ob and %Oh formats.
+       * time/strptime_l.c [_LIBC] (ab_alt_month_name): New macro.
+       (__strptime_internal): Handle %Ob and %Oh formats.
+       * time/tst-strptime.c (day_tests): Add more tests to parse different
+       forms of month names including the new %Ob format specifier.
+
 2018-01-22  Rafal Luzynski  <digitalfreak@lingonborough.com>
 
        [BZ #10871]
index 73bc700c2b243b51c11bc1708399c1f7f344728f..e2b3b17258bf564c4f1d838e32b5aaf61f754405 100644 (file)
@@ -30,7 +30,7 @@ const struct __locale_data _nl_C_LC_TIME attribute_hidden =
   { NULL, },                   /* no cached data */
   UNDELETABLE,
   0,
-  135,
+  159,
   {
     { .string = "Sun" },
     { .string = "Mon" },
@@ -166,6 +166,30 @@ const struct __locale_data _nl_C_LC_TIME attribute_hidden =
     { .wstr = (const uint32_t *) L"September" },
     { .wstr = (const uint32_t *) L"October" },
     { .wstr = (const uint32_t *) L"November" },
-    { .wstr = (const uint32_t *) L"December" }
+    { .wstr = (const uint32_t *) L"December" },
+    { .string = "Jan" },
+    { .string = "Feb" },
+    { .string = "Mar" },
+    { .string = "Apr" },
+    { .string = "May" },
+    { .string = "Jun" },
+    { .string = "Jul" },
+    { .string = "Aug" },
+    { .string = "Sep" },
+    { .string = "Oct" },
+    { .string = "Nov" },
+    { .string = "Dec" },
+    { .wstr = (const uint32_t *) L"Jan" },
+    { .wstr = (const uint32_t *) L"Feb" },
+    { .wstr = (const uint32_t *) L"Mar" },
+    { .wstr = (const uint32_t *) L"Apr" },
+    { .wstr = (const uint32_t *) L"May" },
+    { .wstr = (const uint32_t *) L"Jun" },
+    { .wstr = (const uint32_t *) L"Jul" },
+    { .wstr = (const uint32_t *) L"Aug" },
+    { .wstr = (const uint32_t *) L"Sep" },
+    { .wstr = (const uint32_t *) L"Oct" },
+    { .wstr = (const uint32_t *) L"Nov" },
+    { .wstr = (const uint32_t *) L"Dec" }
   }
 };
index 3cbb4e673882eb4ff827fa2b6d9eec2faafceff4..56c5f88f6e1d0ae0f5d21550eb1b175348a52751 100644 (file)
@@ -249,8 +249,10 @@ DEFINE_CATEGORY
   DEFINE_ELEMENT (_DATE_FMT,                "date_fmt",            opt, string)
   DEFINE_ELEMENT (_NL_W_DATE_FMT,           "wide-date_fmt",       opt, wstring)
   DEFINE_ELEMENT (_NL_TIME_CODESET,        "time-codeset",        std, string)
-  DEFINE_ELEMENT (ALTMON_1,       "alt_mon",       opt, stringarray, 12, 12)
-  DEFINE_ELEMENT (_NL_WALTMON_1,  "wide-alt_mon",  opt, wstringarray, 12, 12)
+  DEFINE_ELEMENT (ALTMON_1,        "alt_mon",         opt, stringarray,  12, 12)
+  DEFINE_ELEMENT (_NL_WALTMON_1,   "wide-alt_mon",    opt, wstringarray, 12, 12)
+  DEFINE_ELEMENT (_NL_ABALTMON_1,  "ab_alt_mon",      opt, stringarray,  12, 12)
+  DEFINE_ELEMENT (_NL_WABALTMON_1, "wide-ab_alt_mon", opt, wstringarray, 12, 12)
   ), NO_POSTLOAD)
 
 
index 65374dd09a83da3eda38b2889fee82de6ce069e1..a50cc9b568781927273cfcd67c7baad9f8337773 100644 (file)
@@ -74,7 +74,8 @@ enum
   DAY_7,                       /* Saturday */
 #define DAY_7                  DAY_7
 
-  /* Abbreviated month names.  */
+  /* Abbreviated month names, in the grammatical form used when the month
+     is a part of a complete date.  */
   ABMON_1,                     /* Jan */
 #define ABMON_1                        ABMON_1
   ABMON_2,
@@ -176,7 +177,8 @@ enum
   _NL_WDAY_6,          /* Friday */
   _NL_WDAY_7,          /* Saturday */
 
-  /* Abbreviated month names.  */
+  /* Abbreviated month names, in the grammatical form used when the month
+     is a part of a complete date.  */
   _NL_WABMON_1,                /* Jan */
   _NL_WABMON_2,
   _NL_WABMON_3,
@@ -277,6 +279,36 @@ enum
   _NL_WALTMON_11,
   _NL_WALTMON_12,
 
+  /* Abbreviated month names, in the grammatical form used when the month
+     is named by itself.  */
+  _NL_ABALTMON_1,                      /* Jan */
+  _NL_ABALTMON_2,
+  _NL_ABALTMON_3,
+  _NL_ABALTMON_4,
+  _NL_ABALTMON_5,
+  _NL_ABALTMON_6,
+  _NL_ABALTMON_7,
+  _NL_ABALTMON_8,
+  _NL_ABALTMON_9,
+  _NL_ABALTMON_10,
+  _NL_ABALTMON_11,
+  _NL_ABALTMON_12,
+
+  /* Abbreviated month names, in the grammatical form used when the month
+     is named by itself.  */
+  _NL_WABALTMON_1,                     /* Jan */
+  _NL_WABALTMON_2,
+  _NL_WABALTMON_3,
+  _NL_WABALTMON_4,
+  _NL_WABALTMON_5,
+  _NL_WABALTMON_6,
+  _NL_WABALTMON_7,
+  _NL_WABALTMON_8,
+  _NL_WABALTMON_9,
+  _NL_WABALTMON_10,
+  _NL_WABALTMON_11,
+  _NL_WABALTMON_12,
+
   _NL_NUM_LC_TIME,     /* Number of indices in LC_TIME category.  */
 
   /* LC_COLLATE category: text sorting.
index 41864482eccb14e31e0ff6cbe27c7008f687160d..a7557923632356690adfaad293631a7badbd62ed 100644 (file)
@@ -94,6 +94,9 @@ struct locale_time_t
   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;
@@ -651,6 +654,14 @@ time_output (struct localedef_t *locale, const struct charmap_t *charmap,
   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);
 }
 
@@ -795,6 +806,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result,
          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
@@ -955,6 +967,13 @@ time_read (struct linereader *ldfile, struct localedef_t *result,
              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:
index dad7f2179a7f42b830abb692dcea6c7aad56ee6e..6bf2f6018b83549c3d0d3ece5a0259a3b51db630 100644 (file)
@@ -149,6 +149,7 @@ cal_direction,          tok_cal_direction,          0
 timezone,               tok_timezone,               0
 date_fmt,               tok_date_fmt,               0
 alt_mon,                tok_alt_mon,                0
+ab_alt_mon,             tok_ab_alt_mon,             0
 LC_MESSAGES,            tok_lc_messages,            0
 yesexpr,                tok_yesexpr,                0
 noexpr,                 tok_noexpr,                 0
index 10d9d9af67266dbc9ab410285400f5293acab142..d25cf992f2f78c3d26cea04d7faca8c5addfe237 100644 (file)
@@ -54,7 +54,7 @@
 #line 24 "locfile-kw.gperf"
 struct keyword_t ;
 
-#define TOTAL_KEYWORDS 177
+#define TOTAL_KEYWORDS 178
 #define MIN_WORD_LENGTH 3
 #define MAX_WORD_LENGTH 22
 #define MIN_HASH_VALUE 3
@@ -147,22 +147,22 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 30 "locfile-kw.gperf"
       {"LC_CTYPE",               tok_lc_ctype,               0},
       {""},
-#line 167 "locfile-kw.gperf"
+#line 168 "locfile-kw.gperf"
       {"LC_ADDRESS",             tok_lc_address,             0},
-#line 152 "locfile-kw.gperf"
+#line 153 "locfile-kw.gperf"
       {"LC_MESSAGES",            tok_lc_messages,            0},
-#line 160 "locfile-kw.gperf"
+#line 161 "locfile-kw.gperf"
       {"LC_NAME",                tok_lc_name,                0},
-#line 157 "locfile-kw.gperf"
+#line 158 "locfile-kw.gperf"
       {"LC_PAPER",               tok_lc_paper,               0},
-#line 185 "locfile-kw.gperf"
+#line 186 "locfile-kw.gperf"
       {"LC_MEASUREMENT",         tok_lc_measurement,         0},
 #line 56 "locfile-kw.gperf"
       {"LC_COLLATE",             tok_lc_collate,             0},
       {""},
-#line 187 "locfile-kw.gperf"
+#line 188 "locfile-kw.gperf"
       {"LC_IDENTIFICATION",      tok_lc_identification,      0},
-#line 200 "locfile-kw.gperf"
+#line 201 "locfile-kw.gperf"
       {"revision",               tok_revision,               0},
 #line 69 "locfile-kw.gperf"
       {"UNDEFINED",              tok_undefined,              0},
@@ -170,19 +170,19 @@ locfile_hash (register const char *str, register unsigned int len)
       {"LC_NUMERIC",             tok_lc_numeric,             0},
 #line 82 "locfile-kw.gperf"
       {"LC_MONETARY",            tok_lc_monetary,            0},
-#line 180 "locfile-kw.gperf"
+#line 181 "locfile-kw.gperf"
       {"LC_TELEPHONE",           tok_lc_telephone,           0},
       {""}, {""}, {""},
 #line 75 "locfile-kw.gperf"
       {"define",                 tok_define,                 0},
-#line 153 "locfile-kw.gperf"
+#line 154 "locfile-kw.gperf"
       {"yesexpr",                tok_yesexpr,                0},
 #line 141 "locfile-kw.gperf"
       {"era_year",               tok_era_year,               0},
       {""},
 #line 54 "locfile-kw.gperf"
       {"translit_ignore",        tok_translit_ignore,        0},
-#line 155 "locfile-kw.gperf"
+#line 156 "locfile-kw.gperf"
       {"yesstr",                 tok_yesstr,                 0},
       {""},
 #line 89 "locfile-kw.gperf"
@@ -190,7 +190,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {""},
 #line 137 "locfile-kw.gperf"
       {"t_fmt",                  tok_t_fmt,                  0},
-#line 158 "locfile-kw.gperf"
+#line 159 "locfile-kw.gperf"
       {"height",                 tok_height,                 0},
       {""}, {""},
 #line 52 "locfile-kw.gperf"
@@ -213,7 +213,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {""},
 #line 142 "locfile-kw.gperf"
       {"era_d_fmt",              tok_era_d_fmt,              0},
-#line 188 "locfile-kw.gperf"
+#line 189 "locfile-kw.gperf"
       {"title",                  tok_title,                  0},
       {""}, {""},
 #line 149 "locfile-kw.gperf"
@@ -243,7 +243,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {"duo_n_cs_precedes",      tok_duo_n_cs_precedes,      0},
 #line 127 "locfile-kw.gperf"
       {"thousands_sep",          tok_thousands_sep,          0},
-#line 196 "locfile-kw.gperf"
+#line 197 "locfile-kw.gperf"
       {"territory",              tok_territory,              0},
 #line 36 "locfile-kw.gperf"
       {"digit",                  tok_digit,                  0},
@@ -258,7 +258,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {""},
 #line 78 "locfile-kw.gperf"
       {"else",                   tok_else,                   0},
-#line 183 "locfile-kw.gperf"
+#line 184 "locfile-kw.gperf"
       {"int_select",             tok_int_select,             0},
       {""}, {""}, {""},
 #line 132 "locfile-kw.gperf"
@@ -266,11 +266,11 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 33 "locfile-kw.gperf"
       {"upper",                  tok_upper,                  0},
       {""}, {""},
-#line 193 "locfile-kw.gperf"
+#line 194 "locfile-kw.gperf"
       {"tel",                    tok_tel,                    0},
 #line 93 "locfile-kw.gperf"
       {"p_sep_by_space",         tok_p_sep_by_space,         0},
-#line 159 "locfile-kw.gperf"
+#line 160 "locfile-kw.gperf"
       {"width",                  tok_width,                  0},
       {""},
 #line 98 "locfile-kw.gperf"
@@ -301,7 +301,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {""}, {""}, {""}, {""}, {""},
 #line 58 "locfile-kw.gperf"
       {"section-symbol",         tok_section_symbol,         0},
-#line 184 "locfile-kw.gperf"
+#line 185 "locfile-kw.gperf"
       {"int_prefix",             tok_int_prefix,             0},
       {""}, {""}, {""}, {""},
 #line 42 "locfile-kw.gperf"
@@ -318,7 +318,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {"duo_p_sep_by_space",     tok_duo_p_sep_by_space,     0},
 #line 118 "locfile-kw.gperf"
       {"duo_int_p_sign_posn",    tok_duo_int_p_sign_posn,    0},
-#line 156 "locfile-kw.gperf"
+#line 157 "locfile-kw.gperf"
       {"nostr",                  tok_nostr,                  0},
       {""}, {""},
 #line 140 "locfile-kw.gperf"
@@ -327,26 +327,26 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 84 "locfile-kw.gperf"
       {"currency_symbol",        tok_currency_symbol,        0},
       {""},
-#line 166 "locfile-kw.gperf"
+#line 167 "locfile-kw.gperf"
       {"name_ms",                tok_name_ms,                0},
-#line 164 "locfile-kw.gperf"
-      {"name_mrs",               tok_name_mrs,               0},
 #line 165 "locfile-kw.gperf"
+      {"name_mrs",               tok_name_mrs,               0},
+#line 166 "locfile-kw.gperf"
       {"name_miss",              tok_name_miss,              0},
 #line 83 "locfile-kw.gperf"
       {"int_curr_symbol",        tok_int_curr_symbol,        0},
-#line 189 "locfile-kw.gperf"
+#line 190 "locfile-kw.gperf"
       {"source",                 tok_source,                 0},
-#line 163 "locfile-kw.gperf"
+#line 164 "locfile-kw.gperf"
       {"name_mr",                tok_name_mr,                0},
-#line 162 "locfile-kw.gperf"
+#line 163 "locfile-kw.gperf"
       {"name_gen",               tok_name_gen,               0},
-#line 201 "locfile-kw.gperf"
+#line 202 "locfile-kw.gperf"
       {"date",                   tok_date,                   0},
       {""}, {""},
-#line 190 "locfile-kw.gperf"
+#line 191 "locfile-kw.gperf"
       {"address",                tok_address,                0},
-#line 161 "locfile-kw.gperf"
+#line 162 "locfile-kw.gperf"
       {"name_fmt",               tok_name_fmt,               0},
 #line 32 "locfile-kw.gperf"
       {"copy",                   tok_copy,                   0},
@@ -365,16 +365,16 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 117 "locfile-kw.gperf"
       {"duo_n_sign_posn",        tok_duo_n_sign_posn,        0},
       {""},
-#line 169 "locfile-kw.gperf"
+#line 170 "locfile-kw.gperf"
       {"country_name",           tok_country_name,           0},
 #line 71 "locfile-kw.gperf"
       {"reorder-after",          tok_reorder_after,          0},
       {""}, {""},
-#line 154 "locfile-kw.gperf"
+#line 155 "locfile-kw.gperf"
       {"noexpr",                 tok_noexpr,                 0},
 #line 50 "locfile-kw.gperf"
       {"tolower",                tok_tolower,                0},
-#line 197 "locfile-kw.gperf"
+#line 198 "locfile-kw.gperf"
       {"audience",               tok_audience,               0},
       {""}, {""}, {""},
 #line 49 "locfile-kw.gperf"
@@ -395,7 +395,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {""},
 #line 102 "locfile-kw.gperf"
       {"int_p_sign_posn",        tok_int_p_sign_posn,        0},
-#line 174 "locfile-kw.gperf"
+#line 175 "locfile-kw.gperf"
       {"country_car",            tok_country_car,            0},
       {""}, {""},
 #line 104 "locfile-kw.gperf"
@@ -406,9 +406,9 @@ locfile_hash (register const char *str, register unsigned int len)
       {""}, {""},
 #line 116 "locfile-kw.gperf"
       {"duo_p_sign_posn",        tok_duo_p_sign_posn,        0},
-#line 186 "locfile-kw.gperf"
+#line 187 "locfile-kw.gperf"
       {"measurement",            tok_measurement,            0},
-#line 175 "locfile-kw.gperf"
+#line 176 "locfile-kw.gperf"
       {"country_isbn",           tok_country_isbn,           0},
 #line 37 "locfile-kw.gperf"
       {"outdigit",               tok_outdigit,               0},
@@ -418,9 +418,9 @@ locfile_hash (register const char *str, register unsigned int len)
       {""}, {""}, {""},
 #line 34 "locfile-kw.gperf"
       {"lower",                  tok_lower,                  0},
-#line 182 "locfile-kw.gperf"
+#line 183 "locfile-kw.gperf"
       {"tel_dom_fmt",            tok_tel_dom_fmt,            0},
-#line 170 "locfile-kw.gperf"
+#line 171 "locfile-kw.gperf"
       {"country_post",           tok_country_post,           0},
 #line 148 "locfile-kw.gperf"
       {"cal_direction",          tok_cal_direction,          0},
@@ -430,7 +430,7 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 91 "locfile-kw.gperf"
       {"frac_digits",            tok_frac_digits,            0},
       {""}, {""},
-#line 176 "locfile-kw.gperf"
+#line 177 "locfile-kw.gperf"
       {"lang_name",              tok_lang_name,              0},
 #line 90 "locfile-kw.gperf"
       {"int_frac_digits",        tok_int_frac_digits,        0},
@@ -445,7 +445,7 @@ locfile_hash (register const char *str, register unsigned int len)
       {""}, {""}, {""}, {""},
 #line 107 "locfile-kw.gperf"
       {"duo_frac_digits",        tok_duo_frac_digits,        0},
-#line 181 "locfile-kw.gperf"
+#line 182 "locfile-kw.gperf"
       {"tel_int_fmt",            tok_tel_int_fmt,            0},
 #line 123 "locfile-kw.gperf"
       {"duo_valid_to",           tok_duo_valid_to,           0},
@@ -455,7 +455,7 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 130 "locfile-kw.gperf"
       {"abday",                  tok_abday,                  0},
       {""},
-#line 199 "locfile-kw.gperf"
+#line 200 "locfile-kw.gperf"
       {"abbreviation",           tok_abbreviation,           0},
 #line 147 "locfile-kw.gperf"
       {"first_workday",          tok_first_workday,          0},
@@ -472,12 +472,12 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 45 "locfile-kw.gperf"
       {"blank",                  tok_blank,                  0},
       {""}, {""},
-#line 195 "locfile-kw.gperf"
+#line 196 "locfile-kw.gperf"
       {"language",               tok_language,               0},
 #line 120 "locfile-kw.gperf"
       {"uno_valid_from",         tok_uno_valid_from,         0},
       {""},
-#line 198 "locfile-kw.gperf"
+#line 199 "locfile-kw.gperf"
       {"application",            tok_application,            0},
       {""},
 #line 80 "locfile-kw.gperf"
@@ -498,7 +498,7 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 96 "locfile-kw.gperf"
       {"p_sign_posn",            tok_p_sign_posn,            0},
       {""},
-#line 202 "locfile-kw.gperf"
+#line 203 "locfile-kw.gperf"
       {"category",               tok_category,               0},
       {""}, {""}, {""}, {""},
 #line 134 "locfile-kw.gperf"
@@ -510,29 +510,29 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 63 "locfile-kw.gperf"
       {"order_start",            tok_order_start,            0},
       {""}, {""}, {""}, {""}, {""},
-#line 177 "locfile-kw.gperf"
+#line 178 "locfile-kw.gperf"
       {"lang_ab",                tok_lang_ab,                0},
-#line 179 "locfile-kw.gperf"
+#line 180 "locfile-kw.gperf"
       {"lang_lib",               tok_lang_lib,               0},
       {""}, {""}, {""},
-#line 191 "locfile-kw.gperf"
+#line 192 "locfile-kw.gperf"
       {"contact",                tok_contact,                0},
       {""}, {""}, {""},
-#line 172 "locfile-kw.gperf"
+#line 173 "locfile-kw.gperf"
       {"country_ab3",            tok_country_ab3,            0},
       {""}, {""}, {""},
-#line 192 "locfile-kw.gperf"
+#line 193 "locfile-kw.gperf"
       {"email",                  tok_email,                  0},
-#line 171 "locfile-kw.gperf"
+#line 172 "locfile-kw.gperf"
       {"country_ab2",            tok_country_ab2,            0},
       {""}, {""}, {""},
 #line 55 "locfile-kw.gperf"
       {"default_missing",        tok_default_missing,        0},
       {""}, {""},
-#line 194 "locfile-kw.gperf"
+#line 195 "locfile-kw.gperf"
       {"fax",                    tok_fax,                    0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 173 "locfile-kw.gperf"
+#line 174 "locfile-kw.gperf"
       {"country_num",            tok_country_num,            0},
       {""}, {""}, {""}, {""}, {""}, {""},
 #line 51 "locfile-kw.gperf"
@@ -560,7 +560,9 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 59 "locfile-kw.gperf"
       {"collating-element",      tok_collating_element,      0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+#line 152 "locfile-kw.gperf"
+      {"ab_alt_mon",             tok_ab_alt_mon,             0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -571,7 +573,7 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 85 "locfile-kw.gperf"
       {"mon_decimal_point",      tok_mon_decimal_point,      0},
       {""}, {""},
-#line 168 "locfile-kw.gperf"
+#line 169 "locfile-kw.gperf"
       {"postal_fmt",             tok_postal_fmt,             0},
       {""}, {""}, {""}, {""}, {""},
 #line 60 "locfile-kw.gperf"
@@ -590,7 +592,7 @@ locfile_hash (register const char *str, register unsigned int len)
 #line 87 "locfile-kw.gperf"
       {"mon_grouping",           tok_mon_grouping,           0},
       {""},
-#line 178 "locfile-kw.gperf"
+#line 179 "locfile-kw.gperf"
       {"lang_term",              tok_lang_term,              0},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
index d49da5e1b7d3c9abec848adc68b4e74c92bc9405..e3cd18e5f0db977246e5748a232d476828ac4075 100644 (file)
@@ -187,6 +187,7 @@ enum token_t
   tok_timezone,
   tok_date_fmt,
   tok_alt_mon,
+  tok_ab_alt_mon,
   tok_lc_messages,
   tok_yesexpr,
   tok_noexpr,
index 2deb025013f585ee7ea6a41a8c92b0bb39187a54..0db1206820c7763bed0e8bc3ccc1239767e8de41 100644 (file)
@@ -49,7 +49,7 @@ include ../Rules
 
 ifeq ($(run-built-tests),yes)
 LOCALES := de_DE.ISO-8859-1 en_US.ISO-8859-1 ja_JP.EUC-JP fr_FR.UTF-8 \
-          pl_PL.UTF-8
+          es_ES.UTF-8 pl_PL.UTF-8 ru_RU.UTF-8
 include ../gen-locales.mk
 
 $(objpfx)tst-ftime_l.out: $(gen-locales)
index ac5d28fbcc2e503c45f42e01dfcce31a799410e8..c71f9f47a9525046b59a89c005de22a304367d4d 100644 (file)
@@ -106,6 +106,7 @@ extern char *tzname[];
 # define UCHAR_T unsigned char
 # define L_(Str) Str
 # define NLW(Sym) Sym
+# define ABALTMON_1 _NL_ABALTMON_1
 
 # if !defined STDC_HEADERS && !defined HAVE_MEMCPY
 #  define MEMCPY(d, s, n) bcopy ((s), (d), (n))
@@ -492,6 +493,9 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 # define f_month \
   ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11                      \
                     ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)))
+# define a_altmonth \
+  ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11                      \
+                    ? "?" : _NL_CURRENT (LC_TIME, NLW(ABALTMON_1) + tp->tm_mon)))
 # define f_altmonth \
   ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11                      \
                     ? "?" : _NL_CURRENT (LC_TIME, NLW(ALTMON_1) + tp->tm_mon)))
@@ -501,6 +505,7 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 
 # define aw_len STRLEN (a_wkday)
 # define am_len STRLEN (a_month)
+# define aam_len STRLEN (a_altmonth)
 # define ap_len STRLEN (ampm)
 #else
 # if !HAVE_STRFTIME
@@ -510,11 +515,13 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
                   ? "?" : month_name[tp->tm_mon])
 #  define a_wkday f_wkday
 #  define a_month f_month
+#  define a_altmonth a_month
 #  define f_altmonth f_month
 #  define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11))
 
   size_t aw_len = 3;
   size_t am_len = 3;
+  size_t aam_len = 3;
   size_t ap_len = 2;
 # endif
 #endif
@@ -779,10 +786,13 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
              to_uppcase = 1;
              to_lowcase = 0;
            }
-         if (modifier != 0)
+         if (modifier == L_('E'))
            goto bad_format;
 #if defined _NL_CURRENT || !HAVE_STRFTIME
-         cpy (am_len, a_month);
+         if (modifier == L_('O'))
+           cpy (aam_len, a_altmonth);
+         else
+           cpy (am_len, a_month);
          break;
 #else
          goto underlying_strftime;
index 39cf38d9a903b82790b8f7c8f1273ed6a5e3c03f..cd901c2606b86c3be14a62d6ed81fa041ed5664a 100644 (file)
@@ -126,6 +126,8 @@ extern const struct __locale_data _nl_C_LC_TIME attribute_hidden;
 # define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)
 # define alt_month_name \
   (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ALTMON_1)].string)
+# define ab_alt_month_name \
+  (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (_NL_ABALTMON_1)].string)
 # define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
 # define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string)
 # define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)
@@ -437,6 +439,18 @@ __strptime_internal (const char *rp, const char *fmt, struct tm *tmp,
                                     alt_month_name[cnt]))
                        decided_longest = loc;
                    }
+                 trp = rp;
+                 if (match_string (_NL_CURRENT (LC_TIME, _NL_ABALTMON_1 + cnt),
+                                   trp)
+                     && trp > rp_longest)
+                   {
+                     rp_longest = trp;
+                     cnt_longest = cnt;
+                     if (s.decided == not
+                         && strcmp (_NL_CURRENT (LC_TIME, _NL_ABALTMON_1 + cnt),
+                                    alt_month_name[cnt]))
+                       decided_longest = loc;
+                   }
 #endif
                }
 #endif
@@ -448,6 +462,8 @@ __strptime_internal (const char *rp, const char *fmt, struct tm *tmp,
 #ifdef _LIBC
                      || ((trp = rp, match_string (alt_month_name[cnt], trp))
                          && trp > rp_longest)
+                     || ((trp = rp, match_string (ab_alt_month_name[cnt], trp))
+                         && trp > rp_longest)
 #endif
              ))
                {
@@ -1035,7 +1051,9 @@ __strptime_internal (const char *rp, const char *fmt, struct tm *tmp,
        case 'O':
          switch (*fmt++)
            {
+           case 'b':
            case 'B':
+           case 'h':
              /* Match month name.  Reprocess as plain 'B'.  */
              fmt--;
              goto start_over;
index 62ecb7c804bb8b335fc8b5b846e9acf3386b0b47..2eac5a25cbbfe9e81e381be82c20a66a0ae1ef9c 100644 (file)
@@ -56,6 +56,7 @@ static const struct
   { "en_US.ISO-8859-1", "November 17, 2017", "%B %e, %Y", 5, 320, 10, 17 },
   { "de_DE.ISO-8859-1", "18. Nov 2017", "%d. %b %Y", 6, 321, 10, 18 },
   { "fr_FR.UTF-8", "19 novembre 2017", "%d %OB %Y", 0, 322, 10, 19 },
+  { "es_ES.UTF-8", "20 de nov de 2017", "%d de %Ob de %Y", 1, 323, 10, 20 },
   /* Some languages do need the declension of the month names.  */
   { "pl_PL.UTF-8", "21 lis 2017", "%d %b %Y", 2, 324, 10, 21 },
   { "pl_PL.UTF-8", "22 LIS 2017", "%d %B %Y", 3, 325, 10, 22 },
@@ -63,6 +64,14 @@ static const struct
   { "pl_PL.UTF-8", "23 listopad 2017", "%d %B %Y", 4, 326, 10, 23 },
   /* The nominative case is incorrect here but it is parseable.  */
   { "pl_PL.UTF-8", "24 listopad 2017", "%d %OB %Y", 5, 327, 10, 24 },
+  { "pl_PL.UTF-8", "25 lis 2017", "%d %Ob %Y", 6, 328, 10, 25 },
+  /* ноя - pronounce: 'noya' - "Nov" (abbreviated "November") in Russian.  */
+  { "ru_RU.UTF-8", "26 ноя 2017", "%d %b %Y", 0, 329, 10, 26 },
+  /* TODO: Add an example of "may"/"maya" (5th month, May) using %Ob in
+     Russian when the localedata is updated.  Without the genitive forms
+     in localedata the word "maya" is ambiguous and may be mistaken for
+     "mart" (March).
+   */
 };
 
 
This page took 0.106295 seconds and 5 git commands to generate.