From 90865aa8d319b1bd736690717c6fcc23b7a29e98 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 10 Sep 1998 11:58:53 +0000 Subject: [PATCH] Update. 1998-09-10 11:53 Ulrich Drepper * timezone/Makefile: Add rules to generate Asia/Tokyo zoneinfo files for test. * timezone/tst-timezone.c (tests): Fix typo in last patch. * time/tzfile.c (__tzfile_read): Handle case when there are no transitions. Set __timezone based on computed offset. * time/tzset.c (tzset_internal): Set __timezone before returning. * time/tzset.c (tzset_internal): Optimize handling of local string copy. 1998-09-10 Andreas Jaeger * timezone/tst-timezone.c (tests): Add test for Asia/Tokyo (see PR libc/776). * sysdeps/powerpc/bits/fenv.h: Add parens. --- ChangeLog | 20 +++++++++++++++++++- time/tzfile.c | 25 +++++++++++++++++-------- time/tzset.c | 44 +++++++++++++++----------------------------- timezone/Makefile | 4 +++- timezone/tst-timezone.c | 1 + 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index a81a49a..8e1fa8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,26 @@ +1998-09-10 11:53 Ulrich Drepper + + * timezone/Makefile: Add rules to generate Asia/Tokyo zoneinfo files + for test. + * timezone/tst-timezone.c (tests): Fix typo in last patch. + + * time/tzfile.c (__tzfile_read): Handle case when there are no + transitions. Set __timezone based on computed offset. + * time/tzset.c (tzset_internal): Set __timezone before returning. + + * time/tzset.c (tzset_internal): Optimize handling of local string + copy. + +1998-09-10 Andreas Jaeger + + * timezone/tst-timezone.c (tests): Add test for Asia/Tokyo (see PR + libc/776). + 1998-09-09 Benjamin Kosnik * math/libm-test.c (exp10_test): Adapt epsilons for powerpc. (csqrt_test): Likewise. - * sysdeps/powerpc/bits/fenv.h: Add parens. . + * sysdeps/powerpc/bits/fenv.h: Add parens. 1998-09-09 18:48 Ulrich Drepper diff --git a/time/tzfile.c b/time/tzfile.c index eca09e2..a7753d2 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -281,15 +281,21 @@ __tzfile_read (const char *file) compute_tzname_max (chars); - rule_stdoff = rule_dstoff = 0; - for (i = 0; i < num_transitions; ++i) + if (num_transitions == 0) + /* Use the first rule (which should also be the only one. */ + rule_stdoff = rule_dstoff = types[0].offset; + else { - if (!rule_stdoff && !types[type_idxs[i]].isdst) - rule_stdoff = types[type_idxs[i]].offset; - if (!rule_dstoff && types[type_idxs[i]].isdst) - rule_dstoff = types[type_idxs[i]].offset; - if (rule_stdoff && rule_dstoff) - break; + rule_stdoff = rule_dstoff = 0; + for (i = 0; i < num_transitions; ++i) + { + if (!rule_stdoff && !types[type_idxs[i]].isdst) + rule_stdoff = types[type_idxs[i]].offset; + if (!rule_dstoff && types[type_idxs[i]].isdst) + rule_dstoff = types[type_idxs[i]].offset; + if (rule_stdoff && rule_dstoff) + break; + } } __daylight = rule_stdoff != rule_dstoff; @@ -381,6 +387,9 @@ __tzfile_default (const char *std, const char *dst, __tzname[0] = (char *) std; __tzname[1] = (char *) dst; + /* Set the timezone. */ + __timezone = -types[0].offset; + compute_tzname_max (stdlen + dstlen); } diff --git a/time/tzset.c b/time/tzset.c index d4e3037..c35017c 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -207,21 +207,11 @@ tzset_internal (always) tz_rules[0].name = tz_rules[1].name = ""; /* Get the standard timezone name. */ - tzbuf = malloc (strlen (tz) + 1); - if (! tzbuf) - { - /* Clear the old tz name so we will try again. */ - free (old_tz); - old_tz = NULL; - return; - } + tzbuf = strdupa (tz); if (sscanf (tz, "%[^0-9,+-]", tzbuf) != 1 || (l = strlen (tzbuf)) < 3) - { - free (tzbuf); - return; - } + return; tz_rules[0].name = __tzstring (tzbuf); @@ -229,10 +219,7 @@ tzset_internal (always) /* Figure out the standard offset from UTC. */ if (*tz == '\0' || (*tz != '+' && *tz != '-' && !isdigit (*tz))) - { - free (tzbuf); - return; - } + return; if (*tz == '-' || *tz == '+') tz_rules[0].offset = *tz++ == '-' ? 1L : -1L; @@ -241,7 +228,6 @@ tzset_internal (always) switch (sscanf (tz, "%hu:%hu:%hu", &hh, &mm, &ss)) { default: - free (tzbuf); return; case 1: mm = 0; @@ -311,7 +297,6 @@ tzset_internal (always) { free (old_tz); old_tz = NULL; - free (tzbuf); return; } } @@ -321,13 +306,10 @@ tzset_internal (always) /* There is no DST. */ tz_rules[1].name = tz_rules[0].name; tz_rules[1].offset = tz_rules[0].offset; - free (tzbuf); - return; + goto out; } done_names: - free (tzbuf); - /* Figure out the standard <-> DST rules. */ for (whichrule = 0; whichrule < 2; ++whichrule) { @@ -343,12 +325,12 @@ tzset_internal (always) char *end; tzr->type = *tz == 'J' ? J1 : J0; if (tzr->type == J1 && !isdigit (*++tz)) - return; + goto out; tzr->d = (unsigned short int) strtoul (tz, &end, 10); if (end == tz || tzr->d > 365) - return; + goto out; else if (tzr->type == J1 && tzr->d == 0) - return; + goto out; tz = end; } else if (*tz == 'M') @@ -359,7 +341,7 @@ tzset_internal (always) &tzr->m, &tzr->n, &tzr->d, &n) != 3 || tzr->m < 1 || tzr->m > 12 || tzr->n < 1 || tzr->n > 5 || tzr->d > 6) - return; + goto out; tz += n; } else if (*tz == '\0') @@ -380,16 +362,16 @@ tzset_internal (always) } } else - return; + goto out; if (*tz != '\0' && *tz != '/' && *tz != ',') - return; + goto out; else if (*tz == '/') { /* Get the time of day of the change. */ ++tz; if (*tz == '\0') - return; + goto out; switch (sscanf (tz, "%hu:%hu:%hu", &hh, &mm, &ss)) { default: @@ -416,6 +398,10 @@ tzset_internal (always) tzr->computed_for = -1; } + + out: + /* We know the offset now, set `__timezone'. */ + __timezone = -tz_rules[0].offset; } /* Maximum length of a timezone name. __tz_compute keeps this up to date diff --git a/timezone/Makefile b/timezone/Makefile index 23d50b1..c0a9bc1 100644 --- a/timezone/Makefile +++ b/timezone/Makefile @@ -178,7 +178,7 @@ $(objpfx)test-tz.out: $(addprefix $(testdata)/, America/New_York Etc/UTC UTC) $(objpfx)tst-timezone.out: $(addprefix $(testdata)/, \ Europe/Berlin Universal \ Australia/Melbourne \ - America/Sao_Paulo) + America/Sao_Paulo Asia/Tokyo) test-tz-ENV = TZDIR=$(testdata) tst-timezone-ENV = TZDIR=$(testdata) @@ -202,6 +202,8 @@ $(testdata)/Australia/Melbourne: australasia $(objpfx)zic $(leapseconds) \ $(testdata)/America/Sao_Paulo: southamerica $(objpfx)zic $(leapseconds) \ yearistype $(build-testdata) +$(testdata)/Asia/Tokyo: asia $(objpfx)zic $(leapseconds) yearistype + $(build-testdata) $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make diff --git a/timezone/tst-timezone.c b/timezone/tst-timezone.c index d05632d..3585a9c 100644 --- a/timezone/tst-timezone.c +++ b/timezone/tst-timezone.c @@ -40,6 +40,7 @@ static const struct test_times tests[] = { "Australia/Melbourne", 1, -36000, { "EST", "EST" }}, { "America/Sao_Paulo", 1, 10800, {"EST", "EDT" }}, { "America/Los_Angeles", 1, 28800, {"PST", "PDT" }}, + { "Asia/Tokyo", 0, -32400, {"JST", "JST" }}, { NULL, 0, 0 } }; -- 2.7.4