1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* sprintf.c (rb_vsprintf, rb_sprintf): new functions return new String,

using missing/vsnprintf.c.  [ruby-dev:26580]

*  missing/vsnprintf.c: made the output changeable.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8825 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2005-07-23 01:02:18 +00:00
parent e6a02b9374
commit 6524f34a26
17 changed files with 200 additions and 132 deletions

View file

@ -1,3 +1,10 @@
Sat Jul 23 10:01:41 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
* sprintf.c (rb_vsprintf, rb_sprintf): new functions return new String,
using missing/vsnprintf.c. [ruby-dev:26580]
* missing/vsnprintf.c: made the output changeable.
Fri Jul 22 15:02:39 2005 Kouhei Sutou <kou@cozmixng.org> Fri Jul 22 15:02:39 2005 Kouhei Sutou <kou@cozmixng.org>
* lib/rss/rss.rb: moved copyright description to lib/rss.rb. * lib/rss/rss.rb: moved copyright description to lib/rss.rb.

View file

@ -178,7 +178,6 @@ flock.$(OBJEXT): {$(VPATH)}flock.c
memcmp.$(OBJEXT): {$(VPATH)}memcmp.c memcmp.$(OBJEXT): {$(VPATH)}memcmp.c
memmove.$(OBJEXT): {$(VPATH)}memmove.c memmove.$(OBJEXT): {$(VPATH)}memmove.c
mkdir.$(OBJEXT): {$(VPATH)}mkdir.c mkdir.$(OBJEXT): {$(VPATH)}mkdir.c
vsnprintf.$(OBJEXT): {$(VPATH)}vsnprintf.c
strcasecmp.$(OBJEXT): {$(VPATH)}strcasecmp.c strcasecmp.$(OBJEXT): {$(VPATH)}strcasecmp.c
strncasecmp.$(OBJEXT): {$(VPATH)}strncasecmp.c strncasecmp.$(OBJEXT): {$(VPATH)}strncasecmp.c
strchr.$(OBJEXT): {$(VPATH)}strchr.c strchr.$(OBJEXT): {$(VPATH)}strchr.c
@ -302,7 +301,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c {$(VPATH)}ruby.h config.h \
sjis.$(OBJEXT): {$(VPATH)}sjis.c {$(VPATH)}regenc.h \ sjis.$(OBJEXT): {$(VPATH)}sjis.c {$(VPATH)}regenc.h \
{$(VPATH)}oniguruma.h config.h {$(VPATH)}oniguruma.h config.h
sprintf.$(OBJEXT): {$(VPATH)}sprintf.c {$(VPATH)}ruby.h config.h \ sprintf.$(OBJEXT): {$(VPATH)}sprintf.c {$(VPATH)}ruby.h config.h \
{$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h {$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h {$(VPATH)}missing/vsnprintf.c
st.$(OBJEXT): {$(VPATH)}st.c config.h {$(VPATH)}st.h st.$(OBJEXT): {$(VPATH)}st.c config.h {$(VPATH)}st.h
string.$(OBJEXT): {$(VPATH)}string.c {$(VPATH)}ruby.h config.h \ string.$(OBJEXT): {$(VPATH)}string.c {$(VPATH)}ruby.h config.h \
{$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h \ {$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h \

View file

@ -353,7 +353,6 @@ mingw*) LIBS="-lshell32 -lws2_32 $LIBS"
ac_cv_func_times=yes ac_cv_func_times=yes
ac_cv_func_waitpid=yes ac_cv_func_waitpid=yes
ac_cv_func_fsync=yes ac_cv_func_fsync=yes
ac_cv_func_vsnprintf=yes
ac_cv_func_seekdir=yes ac_cv_func_seekdir=yes
ac_cv_func_telldir=yes ac_cv_func_telldir=yes
ac_cv_func_isinf=yes ac_cv_func_isinf=yes
@ -482,7 +481,7 @@ AC_TYPE_SIGNAL
AC_FUNC_ALLOCA AC_FUNC_ALLOCA
AC_FUNC_MEMCMP AC_FUNC_MEMCMP
AC_REPLACE_FUNCS(dup2 memmove strcasecmp strncasecmp strerror strftime\ AC_REPLACE_FUNCS(dup2 memmove strcasecmp strncasecmp strerror strftime\
strchr strstr strtoul crypt flock vsnprintf\ strchr strstr strtoul crypt flock\
isnan finite isinf hypot acosh erf) isnan finite isinf hypot acosh erf)
AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot fsync getcwd\ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot fsync getcwd\
truncate chsize times utimes fcntl lockf lstat link symlink readlink\ truncate chsize times utimes fcntl lockf lstat link symlink readlink\

View file

@ -956,14 +956,10 @@ syserr_initialize(argc, argv, self)
else err = "unknown error"; else err = "unknown error";
if (!NIL_P(mesg)) { if (!NIL_P(mesg)) {
VALUE str = mesg; VALUE str = mesg;
size_t len;
StringValue(str); StringValue(str);
len = strlen(err)+RSTRING(str)->len+3; mesg = rb_sprintf("%s - %.*s", err,
mesg = rb_str_new(0, len);
snprintf(RSTRING(mesg)->ptr, len+1, "%s - %.*s", err,
(int)RSTRING(str)->len, RSTRING(str)->ptr); (int)RSTRING(str)->len, RSTRING(str)->ptr);
RSTRING(mesg)->len = strlen(RSTRING(mesg)->ptr);
} }
else { else {
mesg = rb_str_new2(err); mesg = rb_str_new2(err);

34
eval.c
View file

@ -6120,7 +6120,7 @@ backtrace(lev)
int lev; int lev;
{ {
struct FRAME *frame = ruby_frame; struct FRAME *frame = ruby_frame;
char buf[BUFSIZ]; VALUE str;
volatile VALUE ary; volatile VALUE ary;
NODE *n; NODE *n;
@ -6131,17 +6131,16 @@ backtrace(lev)
if (lev < 0) { if (lev < 0) {
ruby_set_current_source(); ruby_set_current_source();
if (frame->this_func) { if (frame->this_func) {
snprintf(buf, BUFSIZ, "%s:%d:in `%s'", str = rb_sprintf("%s:%d:in `%s'", ruby_sourcefile, ruby_sourceline,
ruby_sourcefile, ruby_sourceline,
rb_id2name(frame->this_func)); rb_id2name(frame->this_func));
} }
else if (ruby_sourceline == 0) { else if (ruby_sourceline == 0) {
snprintf(buf, BUFSIZ, "%s", ruby_sourcefile); str = rb_str_new2(ruby_sourcefile);
} }
else { else {
snprintf(buf, BUFSIZ, "%s:%d", ruby_sourcefile, ruby_sourceline); str = rb_sprintf("%s:%d", ruby_sourcefile, ruby_sourceline);
} }
rb_ary_push(ary, rb_str_new2(buf)); rb_ary_push(ary, str);
if (lev < -1) return ary; if (lev < -1) return ary;
} }
else { else {
@ -6156,14 +6155,13 @@ backtrace(lev)
for (; frame && (n = frame->node); frame = frame->prev) { for (; frame && (n = frame->node); frame = frame->prev) {
if (frame->prev && frame->prev->this_func) { if (frame->prev && frame->prev->this_func) {
if (frame->prev->node == n) continue; if (frame->prev->node == n) continue;
snprintf(buf, BUFSIZ, "%s:%d:in `%s'", str = rb_sprintf("%s:%d:in `%s'", n->nd_file, nd_line(n),
n->nd_file, nd_line(n),
rb_id2name(frame->prev->this_func)); rb_id2name(frame->prev->this_func));
} }
else { else {
snprintf(buf, BUFSIZ, "%s:%d", n->nd_file, nd_line(n)); str = rb_sprintf("%s:%d", n->nd_file, nd_line(n));
} }
rb_ary_push(ary, rb_str_new2(buf)); rb_ary_push(ary, str);
} }
return ary; return ary;
@ -8667,23 +8665,16 @@ proc_to_s(self)
NODE *node; NODE *node;
char *cname = rb_obj_classname(self); char *cname = rb_obj_classname(self);
const int w = (SIZEOF_LONG * CHAR_BIT) / 4; const int w = (SIZEOF_LONG * CHAR_BIT) / 4;
long len = strlen(cname)+6+w; /* 6:tags 16:addr */
VALUE str; VALUE str;
Data_Get_Struct(self, struct BLOCK, data); Data_Get_Struct(self, struct BLOCK, data);
if ((node = data->frame.node) || (node = data->body)) { if ((node = data->frame.node) || (node = data->body)) {
len += strlen(node->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT-NODE_LSHIFT)/3; str = rb_sprintf("#<%s:0x%.*lx@%s:%d>", cname, w, (VALUE)data->body,
str = rb_str_new(0, len);
snprintf(RSTRING(str)->ptr, len+1,
"#<%s:0x%.*lx@%s:%d>", cname, w, (VALUE)data->body,
node->nd_file, nd_line(node)); node->nd_file, nd_line(node));
} }
else { else {
str = rb_str_new(0, len); str = rb_sprintf("#<%s:0x%.*lx>", cname, w, (VALUE)data->body);
snprintf(RSTRING(str)->ptr, len+1,
"#<%s:0x%.*lx>", cname, w, (VALUE)data->body);
} }
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
if (OBJ_TAINTED(self)) OBJ_TAINT(str); if (OBJ_TAINTED(self)) OBJ_TAINT(str);
return str; return str;
@ -12761,11 +12752,8 @@ rb_thread_inspect(thread)
rb_thread_t th = rb_thread_check(thread); rb_thread_t th = rb_thread_check(thread);
const char *status = thread_status_name(th->status); const char *status = thread_status_name(th->status);
VALUE str; VALUE str;
size_t len = strlen(cname)+7+16+9+1;
str = rb_str_new(0, len); /* 7:tags 16:addr 9:status 1:nul */ str = rb_sprintf("#<%s:0x%lx %s>", cname, thread, status);
snprintf(RSTRING(str)->ptr, len, "#<%s:0x%lx %s>", cname, thread, status);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
OBJ_INFECT(str, thread); OBJ_INFECT(str, thread);
return str; return str;

View file

@ -15,6 +15,12 @@
#ifndef RUBY_INTERN_H #ifndef RUBY_INTERN_H
#define RUBY_INTERN_H 1 #define RUBY_INTERN_H 1
#ifdef HAVE_STDARG_PROTOTYPES
# include <stdarg.h>
#else
# include <varargs.h>
#endif
/* /*
* Functions and variables that are used by more than one source file of * Functions and variables that are used by more than one source file of
* the kernel. * the kernel.
@ -449,7 +455,14 @@ void rb_trap_exit _((void));
void rb_trap_exec _((void)); void rb_trap_exec _((void));
const char *ruby_signal_name _((int)); const char *ruby_signal_name _((int));
/* sprintf.c */ /* sprintf.c */
VALUE rb_f_sprintf _((int, VALUE*)); VALUE rb_f_sprintf _((int, const VALUE*));
VALUE rb_sprintf __((const char*, ...))
#ifdef __GNUC__
__attribute__((format(printf,1,2)))
#endif
;
VALUE rb_vsprintf _((const char*, va_list));
VALUE rb_str_format _((int, const VALUE *, VALUE));
/* string.c */ /* string.c */
VALUE rb_str_new _((const char*, long)); VALUE rb_str_new _((const char*, long));
VALUE rb_str_new2 _((const char*)); VALUE rb_str_new2 _((const char*));

7
io.c
View file

@ -1093,19 +1093,14 @@ rb_io_inspect(obj)
{ {
OpenFile *fptr; OpenFile *fptr;
char *buf, *cname, *st = ""; char *buf, *cname, *st = "";
long len;
fptr = RFILE(rb_io_taint_check(obj))->fptr; fptr = RFILE(rb_io_taint_check(obj))->fptr;
if (!fptr || !fptr->path) return rb_any_to_s(obj); if (!fptr || !fptr->path) return rb_any_to_s(obj);
cname = rb_obj_classname(obj); cname = rb_obj_classname(obj);
len = strlen(cname) + strlen(fptr->path) + 5;
if (fptr->fd < 0) { if (fptr->fd < 0) {
st = " (closed)"; st = " (closed)";
len += 9;
} }
buf = ALLOCA_N(char, len); return rb_sprintf("#<%s:%s%s>", cname, fptr->path, st);
snprintf(buf, len, "#<%s:%s%s>", cname, fptr->path, st);
return rb_str_new2(buf);
} }
/* /*

View file

@ -65,8 +65,14 @@
#define u_short unsigned short #define u_short unsigned short
#define u_int unsigned int #define u_int unsigned int
#undef __P #if !defined(HAVE_STDARG_PROTOTYPES)
#if defined(__STDC__) #if defined(__STDC__)
#define HAVE_STDARG_PROTOTYPES 1
#endif
#endif
#undef __P
#if defined(HAVE_STDARG_PROTOTYPES)
# include <stdarg.h> # include <stdarg.h>
# if !defined(__P) # if !defined(__P)
# define __P(x) x # define __P(x) x
@ -151,12 +157,15 @@ struct __sbuf {
*/ */
typedef struct __sFILE { typedef struct __sFILE {
unsigned char *_p; /* current position in (some) buffer */ unsigned char *_p; /* current position in (some) buffer */
#if 0
int _r; /* read space left for getc() */ int _r; /* read space left for getc() */
#endif
int _w; /* write space left for putc() */ int _w; /* write space left for putc() */
short _flags; /* flags, below; this FILE is free if 0 */ short _flags; /* flags, below; this FILE is free if 0 */
short _file; /* fileno, if Unix descriptor, else -1 */ short _file; /* fileno, if Unix descriptor, else -1 */
struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
int _lbfsize; /* 0 or -_bf._size, for inline putc */ int _lbfsize; /* 0 or -_bf._size, for inline putc */
int (*vwrite)(/* struct __sFILE*, struct __suio * */);
} FILE; } FILE;
@ -673,10 +682,9 @@ reswitch: switch (ch) {
uqval = -uqval; uqval = -uqval;
sign = '-'; sign = '-';
} }
} else { } else
#else /* _HAVE_SANE_QUAD_ */
{
#endif /* _HAVE_SANE_QUAD_ */ #endif /* _HAVE_SANE_QUAD_ */
{
ulval = SARG(); ulval = SARG();
if ((long)ulval < 0) { if ((long)ulval < 0) {
ulval = -ulval; ulval = -ulval;
@ -1083,6 +1091,7 @@ vsnprintf(str, n, fmt, ap)
f._flags = __SWR | __SSTR; f._flags = __SWR | __SSTR;
f._bf._base = f._p = (unsigned char *)str; f._bf._base = f._p = (unsigned char *)str;
f._bf._size = f._w = n - 1; f._bf._size = f._w = n - 1;
f.vwrite = BSD__sfvwrite;
ret = BSD_vfprintf(&f, fmt, ap); ret = BSD_vfprintf(&f, fmt, ap);
*f._p = 0; *f._p = 0;
return (ret); return (ret);
@ -1092,14 +1101,8 @@ vsnprintf(str, n, fmt, ap)
static char sccsid[] = "@(#)snprintf.c 8.1 (Berkeley) 6/4/93"; static char sccsid[] = "@(#)snprintf.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#if defined(__STDC__)
# include <stdarg.h>
#else
# include <varargs.h>
#endif
int int
#if defined(__STDC__) #if defined(HAVE_STDARG_PROTOTYPES)
snprintf(char *str, size_t n, char const *fmt, ...) snprintf(char *str, size_t n, char const *fmt, ...)
#else #else
snprintf(str, n, fmt, va_alist) snprintf(str, n, fmt, va_alist)
@ -1115,7 +1118,7 @@ va_dcl
if ((int)n < 1) if ((int)n < 1)
return (EOF); return (EOF);
#if defined(__STDC__) #if defined(HAVE_STDARG_PROTOTYPES)
va_start(ap, fmt); va_start(ap, fmt);
#else #else
va_start(ap); va_start(ap);
@ -1123,6 +1126,7 @@ va_dcl
f._flags = __SWR | __SSTR; f._flags = __SWR | __SSTR;
f._bf._base = f._p = (unsigned char *)str; f._bf._base = f._p = (unsigned char *)str;
f._bf._size = f._w = n - 1; f._bf._size = f._w = n - 1;
f.vwrite = BSD__sfvwrite;
ret = BSD_vfprintf(&f, fmt, ap); ret = BSD_vfprintf(&f, fmt, ap);
*f._p = 0; *f._p = 0;
va_end(ap); va_end(ap);

View file

@ -298,13 +298,9 @@ rb_any_to_s(obj)
VALUE obj; VALUE obj;
{ {
char *cname = rb_obj_classname(obj); char *cname = rb_obj_classname(obj);
size_t len;
VALUE str; VALUE str;
len = strlen(cname)+6+16; str = rb_sprintf("#<%s:0x%lx>", cname, obj);
str = rb_str_new(0, len); /* 6:tags 16:addr */
snprintf(RSTRING(str)->ptr, len+1, "#<%s:0x%lx>", cname, obj);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
if (OBJ_TAINTED(obj)) OBJ_TAINT(str); if (OBJ_TAINTED(obj)) OBJ_TAINT(str);
return str; return str;
@ -385,14 +381,10 @@ rb_obj_inspect(obj)
&& ROBJECT(obj)->iv_tbl && ROBJECT(obj)->iv_tbl
&& ROBJECT(obj)->iv_tbl->num_entries > 0) { && ROBJECT(obj)->iv_tbl->num_entries > 0) {
VALUE str; VALUE str;
size_t len;
char *c; char *c;
c = rb_obj_classname(obj); c = rb_obj_classname(obj);
len = strlen(c)+10+16; str = rb_sprintf("-<%s:0x%lx", c, obj);
str = rb_str_new(0, len); /* 10:tags 16:addr */
snprintf(RSTRING(str)->ptr, len+1, "-<%s:0x%lx", c, obj);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
return rb_exec_recursive(inspect_obj, obj, str); return rb_exec_recursive(inspect_obj, obj, str);
} }
return rb_funcall(obj, rb_intern("to_s"), 0, 0); return rb_funcall(obj, rb_intern("to_s"), 0, 0);

View file

@ -8904,13 +8904,13 @@ ripper_compile_error(parser, fmt, va_alist)
va_dcl va_dcl
#endif #endif
{ {
char buf[BUFSIZ]; VALUE str;
va_list args; va_list args;
va_init_list(args, fmt); va_init_list(args, fmt);
vsnprintf(buf, BUFSIZ, fmt, args); str = rb_vsprintf(fmt, args);
va_end(args); va_end(args);
rb_funcall(parser->value, rb_intern("compile_error"), 1, rb_str_new2(buf)); rb_funcall(parser->value, rb_intern("compile_error"), 1, str);
} }
static void static void

View file

@ -280,8 +280,7 @@ pst_inspect(st)
pid = pst_pid(st); pid = pst_pid(st);
status = NUM2INT(st); status = NUM2INT(st);
snprintf(buf, sizeof(buf), "#<%s: pid=%ld", rb_class2name(CLASS_OF(st)), NUM2LONG(pid)); str = rb_sprintf("#<%s: pid=%ld", rb_class2name(CLASS_OF(st)), NUM2LONG(pid));
str = rb_str_new2(buf);
if (WIFSTOPPED(status)) { if (WIFSTOPPED(status)) {
int stopsig = WSTOPSIG(status); int stopsig = WSTOPSIG(status);
const char *signame = ruby_signal_name(stopsig); const char *signame = ruby_signal_name(stopsig);

115
sprintf.c
View file

@ -15,6 +15,13 @@
#include "ruby.h" #include "ruby.h"
#include <ctype.h> #include <ctype.h>
#include <math.h> #include <math.h>
#ifdef HAVE_STDARG_PROTOTYPES
#include <stdarg.h>
#define va_init_list(a,b) va_start(a,b)
#else
#include <varargs.h>
#define va_init_list(a,b) va_start(a)
#endif
#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */ #define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */
@ -96,6 +103,12 @@ sign_bits(base, p)
blen += (l);\ blen += (l);\
} while (0) } while (0)
#define FILL(c, l) do { \
CHECK(l);\
memset(&buf[blen], c, l);\
blen += (l);\
} while (0)
#define GETARG() (nextvalue != Qundef ? nextvalue : \ #define GETARG() (nextvalue != Qundef ? nextvalue : \
posarg < 0 ? \ posarg < 0 ? \
(rb_raise(rb_eArgError, "unnumbered(%d) mixed with numbered", nextarg), 0) : \ (rb_raise(rb_eArgError, "unnumbered(%d) mixed with numbered", nextarg), 0) : \
@ -230,9 +243,17 @@ sign_bits(base, p)
VALUE VALUE
rb_f_sprintf(argc, argv) rb_f_sprintf(argc, argv)
int argc; int argc;
VALUE *argv; const VALUE *argv;
{ {
return rb_str_format(argc - 1, argv + 1, GETNTHARG(0));
}
VALUE
rb_str_format(argc, argv, fmt)
int argc;
const VALUE *argv;
VALUE fmt; VALUE fmt;
{
const char *p, *end; const char *p, *end;
char *buf; char *buf;
int blen, bsiz; int blen, bsiz;
@ -246,7 +267,8 @@ rb_f_sprintf(argc, argv)
VALUE tmp; VALUE tmp;
VALUE str; VALUE str;
fmt = GETNTHARG(0); ++argc;
--argv;
if (OBJ_TAINTED(fmt)) tainted = 1; if (OBJ_TAINTED(fmt)) tainted = 1;
StringValue(fmt); StringValue(fmt);
fmt = rb_str_new4(fmt); fmt = rb_str_new4(fmt);
@ -380,13 +402,14 @@ rb_f_sprintf(argc, argv)
VALUE val = GETARG(); VALUE val = GETARG();
char c; char c;
if (!(flags & FMINUS))
while (--width > 0)
PUSH(" ", 1);
c = NUM2INT(val) & 0xff; c = NUM2INT(val) & 0xff;
if (!(flags & FWIDTH)) {
PUSH(&c, 1); PUSH(&c, 1);
while (--width > 0) }
PUSH(" ", 1); else {
FILL(' ', width);
buf[blen - ((flags & FMINUS) ? width : 1)] = c;
}
} }
break; break;
@ -807,3 +830,81 @@ fmt_setup(buf, c, flags, width, prec)
*buf++ = c; *buf++ = c;
*buf = '\0'; *buf = '\0';
} }
#undef FILE
#define FILE rb_printf_buffer
#define __sbuf rb_printf_sbuf
#define __sFILE rb_printf_sfile
#undef feof
#undef ferror
#undef fileno
#include "missing/vsnprintf.c"
static int
ruby__sfvwrite(fp, uio)
register rb_printf_buffer *fp;
register struct __suio *uio;
{
struct __siov *iov;
VALUE result = (VALUE)fp->_bf._base;
char *buf = fp->_p;
size_t len, n;
int blen = buf - RSTRING(result)->ptr, bsiz = fp->_w;
if (RBASIC(result)->klass) {
rb_raise(rb_eRuntimeError, "rb_vsprintf reentered");
}
if ((len = uio->uio_resid) == 0)
return 0;
CHECK(len);
fp->_w = bsiz;
for (iov = uio->uio_iov; len > 0; ++iov) {
MEMCPY(buf, iov->iov_base, char, n = iov->iov_len);
buf += n;
len -= n;
}
fp->_p = (unsigned char *)buf;
return 0;
}
VALUE
rb_vsprintf(fmt, ap)
const char *fmt;
va_list ap;
{
rb_printf_buffer f;
VALUE result;
f._flags = __SWR | __SSTR;
f._bf._size = 0;
f._w = 120;
result = rb_str_buf_new(f._w);
f._bf._base = (unsigned char *)result;
f._p = (unsigned char *)RSTRING(result)->ptr;
RBASIC(result)->klass = 0;
f.vwrite = ruby__sfvwrite;
BSD_vfprintf(&f, fmt, ap);
RBASIC(result)->klass = rb_cString;
rb_str_resize(result, (char *)f._p - RSTRING(result)->ptr);
return result;
}
VALUE
#ifdef HAVE_STDARG_PROTOTYPES
rb_sprintf(const char *format, ...)
#else
ruby_sprintf(format, va_alist)
const char *format;
va_dcl
#endif
{
VALUE result;
va_list ap;
va_init_list(ap, format);
result = rb_vsprintf(format, ap);
va_end(ap);
return result;
}

View file

@ -444,22 +444,13 @@ rb_str_times(str, times)
*/ */
static VALUE static VALUE
rb_str_format(str, arg) rb_str_format_m(str, arg)
VALUE str, arg; VALUE str, arg;
{ {
VALUE *argv;
if (TYPE(arg) == T_ARRAY) { if (TYPE(arg) == T_ARRAY) {
argv = ALLOCA_N(VALUE, RARRAY(arg)->len + 1); return rb_str_format(RARRAY(arg)->len, RARRAY(arg)->ptr, str);
argv[0] = str;
MEMCPY(argv+1, RARRAY(arg)->ptr, VALUE, RARRAY(arg)->len);
return rb_f_sprintf(RARRAY(arg)->len+1, argv);
} }
return rb_str_format(1, &arg, str);
argv = ALLOCA_N(VALUE, 2);
argv[0] = str;
argv[1] = arg;
return rb_f_sprintf(2, argv);
} }
static int static int
@ -4669,7 +4660,7 @@ Init_String()
rb_define_method(rb_cString, "casecmp", rb_str_casecmp, 1); rb_define_method(rb_cString, "casecmp", rb_str_casecmp, 1);
rb_define_method(rb_cString, "+", rb_str_plus, 1); rb_define_method(rb_cString, "+", rb_str_plus, 1);
rb_define_method(rb_cString, "*", rb_str_times, 1); rb_define_method(rb_cString, "*", rb_str_times, 1);
rb_define_method(rb_cString, "%", rb_str_format, 1); rb_define_method(rb_cString, "%", rb_str_format_m, 1);
rb_define_method(rb_cString, "[]", rb_str_aref_m, -1); rb_define_method(rb_cString, "[]", rb_str_aref_m, -1);
rb_define_method(rb_cString, "[]=", rb_str_aset_m, -1); rb_define_method(rb_cString, "[]=", rb_str_aset_m, -1);
rb_define_method(rb_cString, "insert", rb_str_insert, 2); rb_define_method(rb_cString, "insert", rb_str_insert, 2);

View file

@ -476,19 +476,11 @@ inspect_struct(s, dummy, recur)
long i; long i;
if (recur) { if (recur) {
char *cname = rb_class2name(rb_obj_class(s)); return rb_sprintf("#<struct %s:...>", cname);
size_t len = strlen(cname) + 14;
VALUE str = rb_str_new(0, len);
snprintf(RSTRING(str)->ptr, len+1, "#<struct %s:...>", cname);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
return str;
} }
members = rb_struct_members(s); members = rb_struct_members(s);
str = rb_str_buf_new2("#<struct "); str = rb_sprintf("#<struct %s ", cname);
rb_str_cat2(str, cname);
rb_str_cat2(str, " ");
for (i=0; i<RSTRUCT(s)->len; i++) { for (i=0; i<RSTRUCT(s)->len; i++) {
VALUE slot; VALUE slot;
ID id; ID id;

View file

@ -196,7 +196,6 @@ rb_class_path(klass)
} }
else { else {
char *s = "Class"; char *s = "Class";
size_t len;
if (TYPE(klass) == T_MODULE) { if (TYPE(klass) == T_MODULE) {
if (rb_obj_class(klass) == rb_cModule) { if (rb_obj_class(klass) == rb_cModule) {
@ -206,10 +205,7 @@ rb_class_path(klass)
s = rb_class2name(RBASIC(klass)->klass); s = rb_class2name(RBASIC(klass)->klass);
} }
} }
len = 2 + strlen(s) + 3 + 2 * SIZEOF_LONG + 1; path = rb_sprintf("#<%s:0x%lx>", s, klass);
path = rb_str_new(0, len);
snprintf(RSTRING(path)->ptr, len+1, "#<%s:0x%lx>", s, klass);
RSTRING(path)->len = strlen(RSTRING(path)->ptr);
rb_ivar_set(klass, tmp_classpath, path); rb_ivar_set(klass, tmp_classpath, path);
return path; return path;

View file

@ -3602,9 +3602,7 @@ rb_w32_utime(const char *path, struct utimbuf *times)
int int
rb_w32_vsnprintf(char *buf, size_t size, const char *format, va_list va) rb_w32_vsnprintf(char *buf, size_t size, const char *format, va_list va)
{ {
int ret = _vsnprintf(buf, size, format, va); return vsnprintf(buf, size, format, va);
if (size > 0) buf[size - 1] = 0;
return ret;
} }
int int

View file

@ -178,10 +178,8 @@ extern int rb_w32_rename(const char *, const char *);
extern char **rb_w32_get_environ(void); extern char **rb_w32_get_environ(void);
extern void rb_w32_free_environ(char **); extern void rb_w32_free_environ(char **);
#define vsnprintf(s,n,f,l) rb_w32_vsnprintf(s,n,f,l) DEPRECATED(extern int rb_w32_vsnprintf(char *, size_t, const char *, va_list));
#define snprintf rb_w32_snprintf DEPRECATED(extern int rb_w32_snprintf(char *, size_t, const char *, ...));
extern int rb_w32_vsnprintf(char *, size_t, const char *, va_list);
extern int rb_w32_snprintf(char *, size_t, const char *, ...);
extern int chown(const char *, int, int); extern int chown(const char *, int, int);
extern int link(const char *, const char *); extern int link(const char *, const char *);