diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-06 06:19:12 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-06 06:19:12 +0000 |
commit | dbbfac20fc35270df87a41d07ba7a219ab8b2a0a (patch) | |
tree | 4411c21c630fcc1146d6c75030afd99abdcabc37 /ext | |
parent | 25d040780fcff44b3b03062d1d2c4540df7b33ef (diff) | |
download | ruby-dbbfac20fc35270df87a41d07ba7a219ab8b2a0a.tar.gz |
YAML.load time correctly parse usecs smaller than 1 fixes #4571
Signed-off-by: URABE, Shyouhei <shyouhei@ruby-lang.org>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31441 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/syck/rubyext.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c index e35f0177e9..b7ab817002 100644 --- a/ext/syck/rubyext.c +++ b/ext/syck/rubyext.c @@ -226,7 +226,7 @@ mktime_do(VALUE varg) VALUE hour = INT2FIX(0); VALUE min = INT2FIX(0); VALUE sec = INT2FIX(0); - long usec; + double usec; /* Year*/ if ( ptr[0] != '\0' && len > 0 ) { @@ -272,19 +272,26 @@ mktime_do(VALUE varg) ptr += 2; if ( len > ptr - str && *ptr == '.' ) { - char padded[] = "000000"; + char padded[] = "000000.000000"; + const int padding = 6; + const int offset = padding + 1; const char *end = ptr + 1; - const char *p = end; + const char *begin = end; + int length; while ( isdigit( *end ) ) end++; - if (end - p < (int)sizeof(padded)) { - MEMCPY(padded, ptr + 1, char, end - (ptr + 1)); - p = padded; + length = (int)(end - begin) <= padding ? (int)(end - begin) : padding; + MEMCPY(padded, begin, char, length); + length = (int)(end - begin); + if (length > padding) { + length = length - padding; + MEMCPY(padded + offset, begin + padding, char, length); } - usec = strtol(p, NULL, 10); + + usec = strtod(padded, NULL); } else { - usec = 0; + usec = 0.0; } /* Time Zone*/ @@ -312,12 +319,12 @@ mktime_do(VALUE varg) time = rb_funcall(rb_cTime, s_utc, 6, year, mon, day, hour, min, sec); tmp = rb_funcall(time, s_to_i, 0); tmp = rb_funcall(tmp, '-', 1, LONG2FIX(tz_offset)); - return rb_funcall(rb_cTime, s_at, 2, tmp, LONG2NUM(usec)); + return rb_funcall(rb_cTime, s_at, 2, tmp, rb_float_new(usec)); } else { /* Make UTC time*/ - return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, LONG2NUM(usec)); + return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, rb_float_new(usec)); } } |