aboutsummaryrefslogtreecommitdiffstats
path: root/time.c
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2021-02-27 13:46:28 +0900
committernagachika <nagachika@ruby-lang.org>2021-02-27 13:46:28 +0900
commit190ffd8761bec206582095028e5752ae5ccd7587 (patch)
tree2f42be4a14e0a22039781d1d961befac5a01d254 /time.c
parent931815bfd86df603337194f3fcefb46bfe3e7940 (diff)
downloadruby-190ffd8761bec206582095028e5752ae5ccd7587.tar.gz
merge revision(s) f4be7a510eebbe6507ba41d138d7d252f4a68e90,9441f3f97087a4325ee80911859d37da41fa5050: [Backport #17504]
Added tests for Time#getlocal with UTC offset --- test/ruby/test_time.rb | 8 ++++++++ 1 file changed, 8 insertions(+) Allow UTC offset without colons per ISO-8601 [Bug #17504] --- test/ruby/test_time.rb | 6 ++++++ time.c | 44 +++++++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 15 deletions(-)
Diffstat (limited to 'time.c')
-rw-r--r--time.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/time.c b/time.c
index d76e015f00..5c252adee1 100644
--- a/time.c
+++ b/time.c
@@ -2071,7 +2071,7 @@ utc_offset_arg(VALUE arg)
VALUE tmp;
if (!NIL_P(tmp = rb_check_string_type(arg))) {
int n = 0;
- char *s = RSTRING_PTR(tmp);
+ const char *s = RSTRING_PTR(tmp), *min = NULL, *sec = NULL;
if (!rb_enc_str_asciicompat_p(tmp)) {
invalid_utc_offset:
return Qnil;
@@ -2100,24 +2100,38 @@ utc_offset_arg(VALUE arg)
if (STRNCASECMP("UTC", s, 3) == 0) {
return UTC_ZONE;
}
- goto invalid_utc_offset;
- case 9:
- if (s[6] != ':') goto invalid_utc_offset;
- if (!ISDIGIT(s[7]) || !ISDIGIT(s[8])) goto invalid_utc_offset;
- n += (s[7] * 10 + s[8] - '0' * 11);
- /* fall through */
- case 6:
- if (s[0] != '+' && s[0] != '-') goto invalid_utc_offset;
- if (!ISDIGIT(s[1]) || !ISDIGIT(s[2])) goto invalid_utc_offset;
- if (s[3] != ':') goto invalid_utc_offset;
- if (!ISDIGIT(s[4]) || !ISDIGIT(s[5])) goto invalid_utc_offset;
- if (s[4] > '5') goto invalid_utc_offset;
- break;
+ break; /* +HH */
+ case 5: /* +HHMM */
+ min = s+3;
+ break;
+ case 6: /* +HH:MM */
+ min = s+4;
+ break;
+ case 7: /* +HHMMSS */
+ sec = s+5;
+ min = s+3;
+ break;
+ case 9: /* +HH:MM:SS */
+ sec = s+7;
+ min = s+4;
+ break;
default:
goto invalid_utc_offset;
}
+ if (sec) {
+ if (sec == s+7 && *(sec-1) != ':') goto invalid_utc_offset;
+ if (!ISDIGIT(sec[0]) || !ISDIGIT(sec[1])) goto invalid_utc_offset;
+ n += (sec[0] * 10 + sec[1] - '0' * 11);
+ }
+ if (min) {
+ if (min == s+4 && *(min-1) != ':') goto invalid_utc_offset;
+ if (!ISDIGIT(min[0]) || !ISDIGIT(min[1])) goto invalid_utc_offset;
+ if (min[0] > '5') goto invalid_utc_offset;
+ n += (min[0] * 10 + min[1] - '0' * 11) * 60;
+ }
+ if (s[0] != '+' && s[0] != '-') goto invalid_utc_offset;
+ if (!ISDIGIT(s[1]) || !ISDIGIT(s[2])) goto invalid_utc_offset;
n += (s[1] * 10 + s[2] - '0' * 11) * 3600;
- n += (s[4] * 10 + s[5] - '0' * 11) * 60;
if (s[0] == '-')
n = -n;
return INT2FIX(n);