[前][次][番号順一覧][スレッド一覧]

ruby-changes:19402

From: shyouhei <ko1@a...>
Date: Fri, 6 May 2011 15:29:34 +0900 (JST)
Subject: [ruby-changes:19402] Ruby:r31441 (trunk): YAML.load time correctly parse usecs smaller than 1 fixes #4571

shyouhei	2011-05-06 15:19:12 +0900 (Fri, 06 May 2011)

  New Revision: 31441

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31441

  Log:
    YAML.load time correctly parse usecs smaller than 1 fixes #4571
    
    Signed-off-by: URABE, Shyouhei <shyouhei@r...>

  Modified files:
    trunk/ext/syck/rubyext.c

Index: ext/syck/rubyext.c
===================================================================
--- ext/syck/rubyext.c	(revision 31440)
+++ ext/syck/rubyext.c	(revision 31441)
@@ -226,7 +226,7 @@
     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 @@
     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 @@
         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));
     }
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]