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

ruby-changes:46383

From: nobu <ko1@a...>
Date: Fri, 28 Apr 2017 11:10:56 +0900 (JST)
Subject: [ruby-changes:46383] nobu:r58497 (trunk): sprintf.c: format by utility functions

nobu	2017-04-28 11:10:51 +0900 (Fri, 28 Apr 2017)

  New Revision: 58497

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=58497

  Log:
    sprintf.c: format by utility functions
    
    * sprintf.c (rb_str_format, fmt_setup): format by utility
      functions in vsnprintf.c instead of `snprintf`.
    
    * sprintf.c (rb_str_format): format and append by `rb_str_catf`
      instead of formatting by `snprintf` and then copy.

  Modified files:
    trunk/sprintf.c
Index: sprintf.c
===================================================================
--- sprintf.c	(revision 58496)
+++ sprintf.c	(revision 58497)
@@ -23,7 +23,8 @@ https://github.com/ruby/ruby/blob/trunk/sprintf.c#L23
 
 #define BIT_DIGITS(N)   (((N)*146)/485 + 1)  /* log2(10) =~ 146/485 */
 
-static void fmt_setup(char*,size_t,int,int,int,int);
+static char *fmt_setup(char*,size_t,int,int,int,int);
+static char *ultoa(unsigned long val, char *endp, int base, int octzero);
 
 static char
 sign_bits(int base, const char *p)
@@ -938,9 +939,8 @@ rb_str_format(int argc, const VALUE *arg https://github.com/ruby/ruby/blob/trunk/sprintf.c#L939
                         sc = ' ';
                         width--;
                     }
-                    snprintf(nbuf, sizeof(nbuf), "%ld", v);
-                    s = nbuf;
-		    len = (int)strlen(s);
+		    s = ultoa((unsigned long)v, nbuf + sizeof(nbuf), 10, 0);
+		    len = (int)(nbuf + sizeof(nbuf) - s);
 		}
 		else {
                     tmp = rb_big2str(val, 10);
@@ -1122,12 +1122,11 @@ rb_str_format(int argc, const VALUE *arg https://github.com/ruby/ruby/blob/trunk/sprintf.c#L1122
 	    {
 		VALUE val = GETARG();
 		double fval;
-		int i, need;
-		char fbuf[32];
 
 		fval = RFLOAT_VALUE(rb_Float(val));
 		if (isnan(fval) || isinf(fval)) {
 		    const char *expr;
+		    int i, need;
 		    int elen;
 		    char sign = '\0';
 
@@ -1162,23 +1161,16 @@ rb_str_format(int argc, const VALUE *arg https://github.com/ruby/ruby/blob/trunk/sprintf.c#L1161
 		    }
 		    break;
 		}
-
-		fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec);
-		need = 0;
-		if (*p != 'e' && *p != 'E') {
-		    i = INT_MIN;
-		    frexp(fval, &i);
-		    if (i > 0)
-			need = BIT_DIGITS(i);
-		}
-		need += (flags&FPREC) ? prec : default_float_precision;
-		if ((flags&FWIDTH) && need < width)
-		    need = width;
-		need += 20;
-
-		CHECK(need);
-		snprintf(&buf[blen], need, fbuf, fval);
-		blen += strlen(&buf[blen]);
+		else {
+		    int cr = ENC_CODERANGE(result);
+		    char fbuf[2*BIT_DIGITS(SIZEOF_INT*CHAR_BIT)+10];
+		    char *fmt = fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec);
+		    rb_str_set_len(result, blen);
+		    rb_str_catf(result, fmt, fval);
+		    ENC_CODERANGE_SET(result, cr);
+		    bsiz = rb_str_capacity(result);
+		    RSTRING_GETMEM(result, buf, blen);
+		}
 	    }
 	    break;
 	}
@@ -1200,29 +1192,29 @@ rb_str_format(int argc, const VALUE *arg https://github.com/ruby/ruby/blob/trunk/sprintf.c#L1192
     return result;
 }
 
-static void
+static char *
 fmt_setup(char *buf, size_t size, int c, int flags, int width, int prec)
 {
-    char *end = buf + size;
-    *buf++ = '%';
-    if (flags & FSHARP) *buf++ = '#';
-    if (flags & FPLUS)  *buf++ = '+';
-    if (flags & FMINUS) *buf++ = '-';
-    if (flags & FZERO)  *buf++ = '0';
-    if (flags & FSPACE) *buf++ = ' ';
+    buf += size;
+    *--buf = '\0';
+    *--buf = c;
 
-    if (flags & FWIDTH) {
-	snprintf(buf, end - buf, "%d", width);
-	buf += strlen(buf);
+    if (flags & FPREC) {
+	buf = ultoa(prec, buf, 10, 0);
+	*--buf = '.';
     }
 
-    if (flags & FPREC) {
-	snprintf(buf, end - buf, ".%d", prec);
-	buf += strlen(buf);
+    if (flags & FWIDTH) {
+	buf = ultoa(width, buf, 10, 0);
     }
 
-    *buf++ = c;
-    *buf = '\0';
+    if (flags & FSPACE) *--buf = ' ';
+    if (flags & FZERO)  *--buf = '0';
+    if (flags & FMINUS) *--buf = '-';
+    if (flags & FPLUS)  *--buf = '+';
+    if (flags & FSHARP) *--buf = '#';
+    *--buf = '%';
+    return buf;
 }
 
 #undef FILE
@@ -1255,6 +1247,14 @@ fmt_setup(char *buf, size_t size, int c, https://github.com/ruby/ruby/blob/trunk/sprintf.c#L1247
 #define upper_hexdigits (ruby_hexdigits+16)
 #include "vsnprintf.c"
 
+static char *
+ultoa(unsigned long val, char *endp, int base, int flags)
+{
+    const char *xdigs = lower_hexdigits;
+    int octzero = flags & FSHARP;
+    return BSD__ultoa(val, endp, base, octzero, xdigs);
+}
+
 int
 ruby_vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
 {

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

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