From 80aaa3ef6c87a4cbb13c92097ee5170a663d4175 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 24 May 2012 16:15:42 +0000 Subject: sprintf.c: inspect by plus * sprintf.c (ruby__sfvextra): [EXPERIMENTAL] use inspect instead of to_s if plus flag is given. * vsnprintf.c (BSD_vfprintf): pass sign flag. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35779 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ error.c | 4 ++-- sprintf.c | 9 +++++++-- vsnprintf.c | 7 ++++--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd2acbe001..c004465000 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Fri May 25 01:15:39 2012 Nobuyoshi Nakada + + * sprintf.c (ruby__sfvextra): [EXPERIMENTAL] use inspect instead of + to_s if plus flag is given. + + * vsnprintf.c (BSD_vfprintf): pass sign flag. + Fri May 25 00:37:22 2012 Nobuyoshi Nakada * test/rubygems/test_gem_indexer.rb (setup, teardown): save @tempdir diff --git a/error.c b/error.c index 2bca03f0da..1dce70c01b 100644 --- a/error.c +++ b/error.c @@ -1116,9 +1116,9 @@ nometh_err_args(VALUE self) void rb_invalid_str(const char *str, const char *type) { - VALUE s = rb_str_inspect(rb_str_new2(str)); + VALUE s = rb_str_new2(str); - rb_raise(rb_eArgError, "invalid value for %s: %"PRIsVALUE, type, s); + rb_raise(rb_eArgError, "invalid value for %s: %+"PRIsVALUE, type, s); } /* diff --git a/sprintf.c b/sprintf.c index d705566fdf..c3fc39591d 100644 --- a/sprintf.c +++ b/sprintf.c @@ -1178,7 +1178,7 @@ ruby__sfvwrite(register rb_printf_buffer *fp, register struct __suio *uio) } static char * -ruby__sfvextra(rb_printf_buffer *fp, size_t valsize, void *valp, long *sz) +ruby__sfvextra(rb_printf_buffer *fp, size_t valsize, void *valp, long *sz, int sign) { VALUE value, result = (VALUE)fp->_bf._base; rb_encoding *enc; @@ -1189,7 +1189,12 @@ ruby__sfvextra(rb_printf_buffer *fp, size_t valsize, void *valp, long *sz) if (RBASIC(result)->klass) { rb_raise(rb_eRuntimeError, "rb_vsprintf reentered"); } - value = rb_obj_as_string(value); + if (sign == '+') { + value = rb_inspect(value); + } + else { + value = rb_obj_as_string(value); + } enc = rb_enc_compatible(result, value); if (enc) { rb_enc_associate(result, enc); diff --git a/vsnprintf.c b/vsnprintf.c index bb6a0e139a..68fb44c27f 100644 --- a/vsnprintf.c +++ b/vsnprintf.c @@ -183,7 +183,7 @@ typedef struct __sFILE { struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ size_t _lbfsize; /* 0 or -_bf._size, for inline putc */ int (*vwrite)(/* struct __sFILE*, struct __suio * */); - char *(*vextra)(/* struct __sFILE*, size_t, void*, long* */); + char *(*vextra)(/* struct __sFILE*, size_t, void*, long*, int */); } FILE; @@ -811,11 +811,12 @@ reswitch: switch (ch) { FLUSH(); #if defined _HAVE_SANE_QUAD_ && SIZEOF_VOIDP == SIZEOF_LONG_LONG uqval = va_arg(ap, u_quad_t); - cp = (*fp->vextra)(fp, sizeof(uqval), &uqval, &fieldsz); + cp = (*fp->vextra)(fp, sizeof(uqval), &uqval, &fieldsz, sign); #else ulval = va_arg(ap, u_long); - cp = (*fp->vextra)(fp, sizeof(ulval), &ulval, &fieldsz); + cp = (*fp->vextra)(fp, sizeof(ulval), &ulval, &fieldsz, sign); #endif + sign = '\0'; if (!cp) goto error; if (prec < 0) goto long_len; size = fieldsz < prec ? (int)fieldsz : prec; -- cgit v1.2.3