[v3] Fix strptime era handling, add more era tests [BZ #24394]
Carlos O'Donell
codonell@redhat.com
Fri Mar 29 03:03:00 GMT 2019
On 3/28/19 4:19 PM, DJ Delorie wrote:
Please post v4 with the following changes:
- Add BCE->CE transition test.
- Suggested comment changes.
I'll review one more time and then we're done.
> "Carlos O'Donell" <codonell@redhat.com> writes:
>> Put them in.
>
> I put them in. If this mail gets corrupted, I'll have to figure out how
> to safely send non-ascii emails ;-)
>
You sent it just fine! :-)
> Also added the 1873 transition.
Thanks.
What about the BCE / CE transitions?
There is one from year 0 going to year 1.
> Also fixed a second fencepost error in strptime_l.c
>
> ----
>
> Test the transition points between all the currently listed Japanese
> era name changes. This includes testing the transition between the
> first year date and the second year date. This test will help test
> the upcoming Japanese era name change.
>
> Also fixes a fencepost error where the era name isn't properly parsed
> by strptime in the last (partial) year of the era.
>
> Example: if an era change happens in Feb 1990, and again in Aug 1995,
> that's 5.5 years long, but the 0.5 year wasn't accounted for.
>
> diff --git a/ChangeLog b/ChangeLog
> index bd76c1e28d..db33d8a6a3 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,10 @@
> +2019-03-28 DJ Delorie <dj@redhat.com>
> +
> + [BZ #24394]
> + * time/strptime_l.c (%Ey): Fix fencepost error.
> + * time/tst-strftime3.c: New.
> + * time/Makefile (tests): Add tst-strftime3.
> +
> 2019-02-26 Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> * math/math.h (fpclassify, isfinite, isnormal, isnan): Use builtin for
> diff --git a/time/Makefile b/time/Makefile
> index 5c6304ece1..2ca206309d 100644
> --- a/time/Makefile
> +++ b/time/Makefile
> @@ -43,7 +43,7 @@ tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
> tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \
> tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \
> tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \
> - tst-tzname tst-y2039 bug-mktime4 tst-strftime2
> + tst-tzname tst-y2039 bug-mktime4 tst-strftime2 tst-strftime3
>
> include ../Rules
>
> diff --git a/time/strptime_l.c b/time/strptime_l.c
> index e19b9a15dd..7830a5fd63 100644
> --- a/time/strptime_l.c
> +++ b/time/strptime_l.c
> @@ -907,10 +907,15 @@ __strptime_internal (const char *rp, const char *fmt, struct tm *tmp,
> {
> int delta = ((tm->tm_year - era->offset)
> * era->absolute_direction);
> + /* If an era goes from, say, Feb 1990 to Aug
> + 1995, there are 5.5 years in the allowed
> + range, but 1995-1990 is only 5. Add one
> + to allow for the partial end year. */
Suggest:
/* The difference between two sets of years does not include the final
year itself, therefore add 1 to the difference to account for that
final year. */
> match = (delta >= 0
> && delta < (((int64_t) era->stop_date[0]
> - (int64_t) era->start_date[0])
> - * era->absolute_direction));
> + * era->absolute_direction
> + + 1));
OK. era->absolute_direction is a sign which when multiplied by the year difference
always yields a positive value.
> }
> if (! match)
> return NULL;
> @@ -931,7 +936,8 @@ __strptime_internal (const char *rp, const char *fmt, struct tm *tmp,
> if (delta >= 0
Suggest:
/* See comment above about year difference + 1. */
> && delta < (((int64_t) era->stop_date[0]
> - (int64_t) era->start_date[0])
> - * era->absolute_direction))
> + * era->absolute_direction
> + + 1))
OK.
> {
> s.decided = loc;
> break;
> diff --git a/time/tst-strftime3.c b/time/tst-strftime3.c
> new file mode 100644
> index 0000000000..14f7b8a0bf
> --- /dev/null
> +++ b/time/tst-strftime3.c
> @@ -0,0 +1,414 @@
> +/* Test for strftime, esp Japenese era name changes.
OK.
> + Copyright (C) 2019 Free Software Foundation, Inc. This file is
OK.
> + part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <time.h>
> +#include <locale.h>
> +#include <wchar.h>
> +
> +#include <support/check.h>
> +#include <array_length.h>
> +
> +/* These exist for the convenience of writing the test data, because
> + zero-based vs one-based. */
> +typedef enum {
> + Sun, Mon, Tue, Wed, Thu, Fri, Sat
> +} WeekDay;
> +
> +typedef enum {
> + Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
> +} Month;
> +
> +typedef struct Data {
> + /* A descriptive name of the test. */
> + const char *name;
> +
> + /* The specific date and time to be tested. */
> + int y, m, d;
> + WeekDay w;
> + int hh, mm, ss;
> +
> + /* The locale under which the conversion is done. */
> + const char *locale;
> +
> + /* Format passed to strftime. */
> + const char *format;
> +
> + /* Expected data, NUL terminated. */
> + const char *printed;
> +
> +} Data;
> +
> +/* Notes:
> +
> + Years are full 4-digit years, the code compensates. Likewise,
> + use month and weekday enums (above) which are zero-based.
> +
> + The encoded strings are multibyte strings in the C locale which
> + reflect the same binary data as the expected strings. When you run
> + the test, the strings are printed as-is to stdout, so if your
> + terminal is set for the correct encoding, they'll be printed
> + "correctly". Put the Unicode codes and UTF-8 samples in the
> + comments.
> +
> + For convenience, mis-matched strings are printed in
> + paste-compatible format, raw text format, and unicode format. Use
> + "" between a hex escape sequence (like \xe8) and a following hex
> + digit which should be considered as a printable character.
> +
> + To verify text, save the correct text in a file, and use "od -tx1
> + -tc file" to see the raw hex values. */
OK. Great comment!
> +
> +const Data data[] = {
> +
> + { "Baseline test",
> + 2019, Mar, 27, Wed, 14, 3, 22, "en_US.ISO-8859-1", "%Y-%m-%d %T",
> + "2019-03-27 14:03:22" },
> +
> +
We are missing the test for ç´å
å (B.C.E.) transition to è¥¿æ¦ (C.E).
Could you please add that?
> + { "Japanese era change, 1873, before transition",
> + 1872, Dec, 31, Tue, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U897F><U66A6>1872<U5E74> 西æ¦1872å¹´ */
> + "\xe8\xa5\xbf\xe6\x9a\xa6""1872\xe5\xb9\xb4" },
OK. Test 1/4, transition CE -> Meiji era.
> + { "Japanese era change, 1873, after transition",
> + 1873, Jan, 1, Wed, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U660E><U6CBB>06<U5E74> ææ²»06å¹´ */
> + "\xe6\x98\x8e\xe6\xb2\xbb""06\xe5\xb9\xb4" },
OK. Test 2/4, transition CE -> Meiji era.
> +
> +
> + { "Japanese era change, 1873, before transition",
> + 1872, Dec, 31, Tue, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U897F><U66A6>1872<U5E74> 西æ¦1872å¹´ */
> + "\xc0\xbe\xce\xf1""1872\xc7\xaf" },
> + { "Japanese era change, 1873, after transition",
> + 1873, Jan, 1, Wed, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U660E><U6CBB>06<U5E74> ææ²»06å¹´ */
> + "\xcc\xc0\xbc\xa3""06\xc7\xaf" },
OK. In EUC-JP.
> +
> +
> + { "Japanese era change, 1912, before transition year",
> + 1911, Dec, 31, Sun, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U660E><U6CBB>44<U5E74> ææ²»44å¹´ */
> + "\xe6\x98\x8e\xe6\xb2\xbb""44\xe5\xb9\xb4" },
OK. Test 3/4, last day before last year of Meiji era.
> + { "Japanese era change, 1912, start of transition year",
> + 1912, Jan, 1, Mon, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U660E><U6CBB>45<U5E74> ææ²»45å¹´ */
> + "\xe6\x98\x8e\xe6\xb2\xbb""45\xe5\xb9\xb4" },
> +
OK. Test 4/4, first day of last year of Meiji era.
> + { "Japanese era change, 1912, before transition",
> + 1912, Jul, 29, Mon, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U660E><U6CBB>45<U5E74> ææ²»45å¹´ */
> + "\xe6\x98\x8e\xe6\xb2\xbb""45\xe5\xb9\xb4" },
OK. Test 1/4, transition Meiji -> Taisho era.
> + { "Japanese era change, 1912, after transition",
> + 1912, Jul, 30, Tue, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5927><U6B63><U5143><U5E74> 大æ£å
å¹´ */
> + "\xe5\xa4\xa7\xe6\xad\xa3\xe5\x85\x83\xe5\xb9\xb4" },
OK. Test 2/4, transition Meiji -> Taisho era.
> +
> + { "Japanese era change, 1912, before end of transition year",
> + 1912, Dec, 31, Tue, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5927><U6B63><U5143><U5E74> 大æ£å
å¹´ */
> + "\xe5\xa4\xa7\xe6\xad\xa3\xe5\x85\x83\xe5\xb9\xb4" },
OK. Test 3/4, transition Taisho -> Taisho era.
> + { "Japanese era change, 1912, after transition year",
> + 1913, Jan, 1, Wed, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5927><U6B63>02<U5E74> 大æ£02å¹´ */
> + "\xe5\xa4\xa7\xe6\xad\xa3""02\xe5\xb9\xb4" },
OK. Test 4/4, transition Taisho -> Taisho era.
> +
> +
> + { "Japanese era change, 1912, before transition year",
> + 1911, Dec, 31, Sun, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U660E><U6CBB>44<U5E74> ææ²»44å¹´ */
> + "\xcc\xc0\xbc\xa3""44\xc7\xaf" },
> + { "Japanese era change, 1912, start of transition year",
> + 1912, Jan, 1, Mon, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U660E><U6CBB>45<U5E74> ææ²»45å¹´ */
> + "\xcc\xc0\xbc\xa3""45\xc7\xaf" },
> +
> + { "Japanese era change, 1912, before transition",
> + 1912, Jul, 29, Mon, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U660E><U6CBB>45<U5E74> ææ²»45å¹´ */
> + "\xcc\xc0\xbc\xa3""45\xc7\xaf" },
> + { "Japanese era change, 1912, after transition",
> + 1912, Jul, 30, Tue, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5927><U6B63><U5143><U5E74> 大æ£å
å¹´ */
> + "\xc2\xe7\xc0\xb5\xb8\xb5\xc7\xaf" },
> +
> + { "Japanese era change, 1912, before end of transition year",
> + 1912, Dec, 31, Tue, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5927><U6B63><U5143><U5E74> 大æ£å
å¹´ */
> + "\xc2\xe7\xc0\xb5\xb8\xb5\xc7\xaf" },
> + { "Japanese era change, 1912, after transition year",
> + 1913, Jan, 1, Wed, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5927><U6B63>02<U5E74> 大æ£02å¹´ */
> + "\xc2\xe7\xc0\xb5""02\xc7\xaf" },
OK. In EUC-JP.
> +
> +
> + { "Japanese era change, 1926, before transition year",
> + 1925, Dec, 31, Thu, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5927><U6B63>14<U5E74> 大æ£14å¹´ */
> + "\xe5\xa4\xa7\xe6\xad\xa3""14\xe5\xb9\xb4" },
OK. Test 1/4 for last day before last year of Taisho era.
> + { "Japanese era change, 1926, start of transition year",
> + 1926, Jan, 1, Fri, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5927><U6B63>15<U5E74> 大æ£15å¹´ */
> + "\xe5\xa4\xa7\xe6\xad\xa3""15\xe5\xb9\xb4" },
OK. Test 2/4 for first day of last year of Taisho era.
> +
> + { "Japanese era change, 1926, before transition",
> + 1926, Dec, 24, Fri, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5927><U6B63>15<U5E74> 大æ£15å¹´ */
> + "\xe5\xa4\xa7\xe6\xad\xa3""15\xe5\xb9\xb4" },
OK. Test 3/4, transition Taisho -> Showa era.
> + { "Japanese era change, 1926, after transition",
> + 1926, Dec, 25, Sat, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U662D><U548C><U5143><U5E74> æåå
å¹´ */
> + "\xe6\x98\xad\xe5\x92\x8c\xe5\x85\x83\xe5\xb9\xb4" },
OK. Test 4/4, transition Taisho -> Showa era.
> +
> + { "Japanese era change, 1926, before end of transition year",
> + 1926, Dec, 31, Fri, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U662D><U548C><U5143><U5E74> æåå
å¹´ */
> + "\xe6\x98\xad\xe5\x92\x8c\xe5\x85\x83\xe5\xb9\xb4" },
OK. Test 1/4, transition Showa -> Showa era.
> + { "Japanese era change, 1926, after transition year",
> + 1927, Jan, 1, Sat, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U662D><U548C>02<U5E74> æå02å¹´ */
> + "\xe6\x98\xad\xe5\x92\x8c""02\xe5\xb9\xb4" },
OK. Test 2/4, transition Showa -> Showa era.
> +
> +
> + { "Japanese era change, 1926, before transition year",
> + 1925, Dec, 31, Thu, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5927><U6B63>14<U5E74> 大æ£14å¹´ */
> + "\xc2\xe7\xc0\xb5""14\xc7\xaf" },
> + { "Japanese era change, 1926, start of transition year",
> + 1926, Jan, 1, Fri, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5927><U6B63>15<U5E74> 大æ£15å¹´ */
> + "\xc2\xe7\xc0\xb5""15\xc7\xaf" },
> +
> + { "Japanese era change, 1926, before transition",
> + 1926, Dec, 24, Fri, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5927><U6B63>15<U5E74> 大æ£15å¹´ */
> + "\xc2\xe7\xc0\xb5""15\xc7\xaf" },
> + { "Japanese era change, 1926, after transition",
> + 1926, Dec, 25, Sat, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U662D><U548C><U5143><U5E74> æåå
å¹´ */
> + "\xbe\xbc\xcf\xc2\xb8\xb5\xc7\xaf" },
> +
> + { "Japanese era change, 1926, before end of transition year",
> + 1926, Dec, 31, Fri, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U662D><U548C><U5143><U5E74> æåå
å¹´ */
> + "\xbe\xbc\xcf\xc2\xb8\xb5\xc7\xaf" },
> + { "Japanese era change, 1926, after transition year",
> + 1927, Jan, 1, Sat, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U662D><U548C>02<U5E74> æå02å¹´ */
> + "\xbe\xbc\xcf\xc2""02\xc7\xaf" },
OK. EUC-JP versions.
> +
> +
> + { "Japanese era change, 1989, before transition year",
> + 1988, Dec, 31, Sat, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U662D><U548C>63<U5E74> æå63å¹´ */
> + "\xe6\x98\xad\xe5\x92\x8c""63\xe5\xb9\xb4" },
OK. Test 3/4, last day before last year of Showa era.
> + { "Japanese era change, 1989, start of transition year",
> + 1989, Jan, 1, Sun, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U662D><U548C>64<U5E74> æå64å¹´ */
> + "\xe6\x98\xad\xe5\x92\x8c""64\xe5\xb9\xb4" },
OK. Test 4/4, first day of last year of Showa era.
> +
> + { "Japanese era change, 1989, before transition",
> + 1989, Jan, 7, Sat, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U662D><U548C>64<U5E74> æå64å¹´ */
> + "\xe6\x98\xad\xe5\x92\x8c""64\xe5\xb9\xb4" },
OK. Test 1/4, transition Showa -> Heisei.
> + { "Japanese era change, 1989, after transition",
> + 1989, Jan, 8, Sun, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5E73><U6210><U5143><U5E74> å¹³æå
å¹´ */
> + "\xe5\xb9\xb3\xe6\x88\x90\xe5\x85\x83\xe5\xb9\xb4" },
OK. Test 2/4, transition Showa -> Heisei.
> +
> + { "Japanese era change, 1989, end of transition year",
> + 1989, Dec, 31, Sun, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5E73><U6210><U5143><U5E74> å¹³æå
å¹´ */
> + "\xe5\xb9\xb3\xe6\x88\x90\xe5\x85\x83\xe5\xb9\xb4" },
OK. Test 3/4, transition Heisei -> Heisei.
> + { "Japanese era change, 1989, after transition year",
> + 1990, Jan, 1, Mon, 12, 00, 00, "ja_JP.UTF-8", "%EY",
> + /* <U5E73><U6210>02<U5E74> å¹³æ02å¹´ */
> + "\xe5\xb9\xb3\xe6\x88\x90""02\xe5\xb9\xb4" },
OK. Test 4/4, transition Heisei -> Heisei.
> +
> +
> + { "Japanese era change, 1989, before transition year",
> + 1988, Dec, 31, Sat, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U662D><U548C>63<U5E74> æå63å¹´ */
> + "\xbe\xbc\xcf\xc2""63\xc7\xaf" },
> + { "Japanese era change, 1989, start of transition year",
> + 1989, Jan, 1, Sun, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U662D><U548C>64<U5E74> æå64å¹´ */
> + "\xbe\xbc\xcf\xc2""64\xc7\xaf" },
> +
> + { "Japanese era change, 1989, before transition",
> + 1989, Jan, 7, Sat, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U662D><U548C>64<U5E74> æå64å¹´ */
> + "\xbe\xbc\xcf\xc2""64\xc7\xaf" },
> + { "Japanese era change, 1989, after transition",
> + 1989, Jan, 8, Sun, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5E73><U6210><U5143><U5E74> å¹³æå
å¹´ */
> + "\xca\xbf\xc0\xae\xb8\xb5\xc7\xaf" },
> +
> + { "Japanese era change, 1989, end of transition year",
> + 1989, Dec, 31, Sun, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5E73><U6210><U5143><U5E74> å¹³æå
å¹´ */
> + "\xca\xbf\xc0\xae\xb8\xb5\xc7\xaf" },
> + { "Japanese era change, 1989, after transition year",
> + 1990, Jan, 1, Mon, 12, 00, 00, "ja_JP.EUC-JP", "%EY",
> + /* <U5E73><U6210>02<U5E74> å¹³æ02å¹´ */
> + "\xca\xbf\xc0\xae""02\xc7\xaf" },
OK. EUC-JP versions.
> +};
> +
> +#define NDATA array_length(data)
> +
> +/* Size of buffer passed to strftime. */
> +#define STRBUFLEN 1000
> +/* Size of buffer passed to tm_to_printed. */
> +#define TMBUFLEN 50
> +
> +/* Helper function to compare strings and print out mismatches in a
> + format suitable for maintaining this test. TEST_COMPARE_STRINGS
> + prints out a less suitable format. */
> +
> +static void
> +print_string_hex (const char *header, const char *str)
> +{
> + int tictoc = 0;
> + const char *s = str;
> + wchar_t w[STRBUFLEN];
> + size_t i, wlen;
> +
> + printf("%s : ", header);
> +
> + while (s && *s)
> + {
> + /* isgraph() equivalent, but independent of current locale. */
> + if (' ' <= *s && *s <= '~')
> + putchar(*s);
> + else
> + {
> + if (tictoc)
> + printf("\033[36m");
> + else
> + printf("\033[31m");
> + tictoc = ! tictoc;
> +
> + printf("\\x%02x\033[0m", (unsigned char)*s);
> + }
> +
> + ++ s;
> + }
> + printf(" - %s\n", str);
> +
> + s = str;
> + wlen = mbsrtowcs (w, &s, strlen (s), NULL);
> + printf("%*s", (int)strlen(header) + 3, " ");
> + for (i = 0; i < wlen && i < strlen (str); i ++)
> + {
> + if (' ' <= w[i] && w[i] <= '~')
> + putchar(w[i]);
> + else
> + printf("<U%04X>", w[i]);
> + }
> + printf("\n");
OK.
> +}
> +
> +static void
> +compare_strings (const char *got, const char *expected,
> + const char *filename, int lineno)
> +{
> + if (got && expected && strcmp (got, expected) == 0)
> + return;
> + support_record_failure ();
> + printf ("%s:%d: error: strftime output incorrect\n", filename, lineno);
> + print_string_hex ("Got", got);
> + print_string_hex ("Exp", expected);
OK.
> +}
> +#define COMPARE_STRINGS(g,e) compare_strings (g, e, __FILE__, __LINE__)
> +
> +/* Helper function to create a printable version of struct tm. */
> +static void
> +tm_to_printed (struct tm *tm, char *buffer)
> +{
> + snprintf (buffer, TMBUFLEN, "%04d/%02d/%02d-%02d:%02d:%02d-%d",
> + tm->tm_year,
> + tm->tm_mon,
> + tm->tm_mday,
> + tm->tm_hour,
> + tm->tm_min,
> + tm->tm_sec,
> + tm->tm_wday);
> +}
> +
> +static int
> +do_test (void)
> +{
> + int i;
> + char buffer[STRBUFLEN];
> + char buf1[TMBUFLEN];
> + char buf2[TMBUFLEN];
> +
> + for (i = 0; i < NDATA; i ++)
> + {
> + const Data *d = &(data[i]);
> + struct tm tm;
> + struct tm tm2;
> + size_t rv;
> + char *rvp;
> +
> + /* Print this just to help debug failures. */
> + printf("%s: %s %s %s\n", d->name, d->locale, d->format, d->printed);
> +
> + tm.tm_year = d->y - 1900;
> + tm.tm_mon = d->m;
> + tm.tm_mday = d->d;
> + tm.tm_wday = d->w;
> + tm.tm_hour = d->hh;
> + tm.tm_min = d->mm;
> + tm.tm_sec = d->ss;
> + tm.tm_isdst = -1;
> +
> + /* LC_ALL may interfere with the snprintf in tm_to_printed. */
> + if (setlocale (LC_TIME, d->locale) == NULL)
> + {
> + /* See the LOCALES list in the Makefile. */
> + printf ("locale %s does not exist!\n", d->locale);
> + exit (EXIT_FAILURE);
> + }
> + /* This is just for printing wide characters if there's an error. */
> + setlocale (LC_CTYPE, d->locale);
> +
> + rv = strftime (buffer, sizeof(buffer), d->format, &tm);
> +
> + TEST_COMPARE (rv, strlen (d->printed));
> + COMPARE_STRINGS (buffer, d->printed);
> +
> + /* Copy the original time, so that any fields not affected by
> + the call to strptime() will match. */
> + tm2 = tm;
> +
> + rvp = strptime (d->printed, d->format, &tm2);
> +
> + TEST_COMPARE_STRING (rvp, "");
OK.
> +
> + tm_to_printed (&tm, buf1);
> + tm_to_printed (&tm2, buf2);
> + TEST_COMPARE_STRING (buf1, buf2);
OK.
> + }
> +
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
>
--
Cheers,
Carlos.
More information about the Libc-alpha
mailing list