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:
parent
e6a02b9374
commit
6524f34a26
17 changed files with 200 additions and 132 deletions
|
@ -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>
|
||||
|
||||
* lib/rss/rss.rb: moved copyright description to lib/rss.rb.
|
||||
|
|
|
@ -178,7 +178,6 @@ flock.$(OBJEXT): {$(VPATH)}flock.c
|
|||
memcmp.$(OBJEXT): {$(VPATH)}memcmp.c
|
||||
memmove.$(OBJEXT): {$(VPATH)}memmove.c
|
||||
mkdir.$(OBJEXT): {$(VPATH)}mkdir.c
|
||||
vsnprintf.$(OBJEXT): {$(VPATH)}vsnprintf.c
|
||||
strcasecmp.$(OBJEXT): {$(VPATH)}strcasecmp.c
|
||||
strncasecmp.$(OBJEXT): {$(VPATH)}strncasecmp.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 \
|
||||
{$(VPATH)}oniguruma.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
|
||||
string.$(OBJEXT): {$(VPATH)}string.c {$(VPATH)}ruby.h config.h \
|
||||
{$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h \
|
||||
|
|
|
@ -353,7 +353,6 @@ mingw*) LIBS="-lshell32 -lws2_32 $LIBS"
|
|||
ac_cv_func_times=yes
|
||||
ac_cv_func_waitpid=yes
|
||||
ac_cv_func_fsync=yes
|
||||
ac_cv_func_vsnprintf=yes
|
||||
ac_cv_func_seekdir=yes
|
||||
ac_cv_func_telldir=yes
|
||||
ac_cv_func_isinf=yes
|
||||
|
@ -482,7 +481,7 @@ AC_TYPE_SIGNAL
|
|||
AC_FUNC_ALLOCA
|
||||
AC_FUNC_MEMCMP
|
||||
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)
|
||||
AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot fsync getcwd\
|
||||
truncate chsize times utimes fcntl lockf lstat link symlink readlink\
|
||||
|
|
6
error.c
6
error.c
|
@ -956,14 +956,10 @@ syserr_initialize(argc, argv, self)
|
|||
else err = "unknown error";
|
||||
if (!NIL_P(mesg)) {
|
||||
VALUE str = mesg;
|
||||
size_t len;
|
||||
|
||||
StringValue(str);
|
||||
len = strlen(err)+RSTRING(str)->len+3;
|
||||
mesg = rb_str_new(0, len);
|
||||
snprintf(RSTRING(mesg)->ptr, len+1, "%s - %.*s", err,
|
||||
mesg = rb_sprintf("%s - %.*s", err,
|
||||
(int)RSTRING(str)->len, RSTRING(str)->ptr);
|
||||
RSTRING(mesg)->len = strlen(RSTRING(mesg)->ptr);
|
||||
}
|
||||
else {
|
||||
mesg = rb_str_new2(err);
|
||||
|
|
34
eval.c
34
eval.c
|
@ -6120,7 +6120,7 @@ backtrace(lev)
|
|||
int lev;
|
||||
{
|
||||
struct FRAME *frame = ruby_frame;
|
||||
char buf[BUFSIZ];
|
||||
VALUE str;
|
||||
volatile VALUE ary;
|
||||
NODE *n;
|
||||
|
||||
|
@ -6131,17 +6131,16 @@ backtrace(lev)
|
|||
if (lev < 0) {
|
||||
ruby_set_current_source();
|
||||
if (frame->this_func) {
|
||||
snprintf(buf, BUFSIZ, "%s:%d:in `%s'",
|
||||
ruby_sourcefile, ruby_sourceline,
|
||||
str = rb_sprintf("%s:%d:in `%s'", ruby_sourcefile, ruby_sourceline,
|
||||
rb_id2name(frame->this_func));
|
||||
}
|
||||
else if (ruby_sourceline == 0) {
|
||||
snprintf(buf, BUFSIZ, "%s", ruby_sourcefile);
|
||||
str = rb_str_new2(ruby_sourcefile);
|
||||
}
|
||||
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;
|
||||
}
|
||||
else {
|
||||
|
@ -6156,14 +6155,13 @@ backtrace(lev)
|
|||
for (; frame && (n = frame->node); frame = frame->prev) {
|
||||
if (frame->prev && frame->prev->this_func) {
|
||||
if (frame->prev->node == n) continue;
|
||||
snprintf(buf, BUFSIZ, "%s:%d:in `%s'",
|
||||
n->nd_file, nd_line(n),
|
||||
str = rb_sprintf("%s:%d:in `%s'", n->nd_file, nd_line(n),
|
||||
rb_id2name(frame->prev->this_func));
|
||||
}
|
||||
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;
|
||||
|
@ -8667,23 +8665,16 @@ proc_to_s(self)
|
|||
NODE *node;
|
||||
char *cname = rb_obj_classname(self);
|
||||
const int w = (SIZEOF_LONG * CHAR_BIT) / 4;
|
||||
long len = strlen(cname)+6+w; /* 6:tags 16:addr */
|
||||
VALUE str;
|
||||
|
||||
Data_Get_Struct(self, struct BLOCK, data);
|
||||
if ((node = data->frame.node) || (node = data->body)) {
|
||||
len += strlen(node->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT-NODE_LSHIFT)/3;
|
||||
str = rb_str_new(0, len);
|
||||
snprintf(RSTRING(str)->ptr, len+1,
|
||||
"#<%s:0x%.*lx@%s:%d>", cname, w, (VALUE)data->body,
|
||||
str = rb_sprintf("#<%s:0x%.*lx@%s:%d>", cname, w, (VALUE)data->body,
|
||||
node->nd_file, nd_line(node));
|
||||
}
|
||||
else {
|
||||
str = rb_str_new(0, len);
|
||||
snprintf(RSTRING(str)->ptr, len+1,
|
||||
"#<%s:0x%.*lx>", cname, w, (VALUE)data->body);
|
||||
str = rb_sprintf("#<%s:0x%.*lx>", cname, w, (VALUE)data->body);
|
||||
}
|
||||
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
|
||||
if (OBJ_TAINTED(self)) OBJ_TAINT(str);
|
||||
|
||||
return str;
|
||||
|
@ -12761,11 +12752,8 @@ rb_thread_inspect(thread)
|
|||
rb_thread_t th = rb_thread_check(thread);
|
||||
const char *status = thread_status_name(th->status);
|
||||
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 */
|
||||
snprintf(RSTRING(str)->ptr, len, "#<%s:0x%lx %s>", cname, thread, status);
|
||||
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
|
||||
str = rb_sprintf("#<%s:0x%lx %s>", cname, thread, status);
|
||||
OBJ_INFECT(str, thread);
|
||||
|
||||
return str;
|
||||
|
|
15
intern.h
15
intern.h
|
@ -15,6 +15,12 @@
|
|||
#ifndef RUBY_INTERN_H
|
||||
#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
|
||||
* the kernel.
|
||||
|
@ -449,7 +455,14 @@ void rb_trap_exit _((void));
|
|||
void rb_trap_exec _((void));
|
||||
const char *ruby_signal_name _((int));
|
||||
/* 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 */
|
||||
VALUE rb_str_new _((const char*, long));
|
||||
VALUE rb_str_new2 _((const char*));
|
||||
|
|
7
io.c
7
io.c
|
@ -1093,19 +1093,14 @@ rb_io_inspect(obj)
|
|||
{
|
||||
OpenFile *fptr;
|
||||
char *buf, *cname, *st = "";
|
||||
long len;
|
||||
|
||||
fptr = RFILE(rb_io_taint_check(obj))->fptr;
|
||||
if (!fptr || !fptr->path) return rb_any_to_s(obj);
|
||||
cname = rb_obj_classname(obj);
|
||||
len = strlen(cname) + strlen(fptr->path) + 5;
|
||||
if (fptr->fd < 0) {
|
||||
st = " (closed)";
|
||||
len += 9;
|
||||
}
|
||||
buf = ALLOCA_N(char, len);
|
||||
snprintf(buf, len, "#<%s:%s%s>", cname, fptr->path, st);
|
||||
return rb_str_new2(buf);
|
||||
return rb_sprintf("#<%s:%s%s>", cname, fptr->path, st);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -65,8 +65,14 @@
|
|||
#define u_short unsigned short
|
||||
#define u_int unsigned int
|
||||
|
||||
#undef __P
|
||||
#if !defined(HAVE_STDARG_PROTOTYPES)
|
||||
#if defined(__STDC__)
|
||||
#define HAVE_STDARG_PROTOTYPES 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef __P
|
||||
#if defined(HAVE_STDARG_PROTOTYPES)
|
||||
# include <stdarg.h>
|
||||
# if !defined(__P)
|
||||
# define __P(x) x
|
||||
|
@ -151,12 +157,15 @@ struct __sbuf {
|
|||
*/
|
||||
typedef struct __sFILE {
|
||||
unsigned char *_p; /* current position in (some) buffer */
|
||||
#if 0
|
||||
int _r; /* read space left for getc() */
|
||||
#endif
|
||||
int _w; /* write space left for putc() */
|
||||
short _flags; /* flags, below; this FILE is free if 0 */
|
||||
short _file; /* fileno, if Unix descriptor, else -1 */
|
||||
struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
|
||||
int _lbfsize; /* 0 or -_bf._size, for inline putc */
|
||||
int (*vwrite)(/* struct __sFILE*, struct __suio * */);
|
||||
} FILE;
|
||||
|
||||
|
||||
|
@ -673,10 +682,9 @@ reswitch: switch (ch) {
|
|||
uqval = -uqval;
|
||||
sign = '-';
|
||||
}
|
||||
} else {
|
||||
#else /* _HAVE_SANE_QUAD_ */
|
||||
{
|
||||
} else
|
||||
#endif /* _HAVE_SANE_QUAD_ */
|
||||
{
|
||||
ulval = SARG();
|
||||
if ((long)ulval < 0) {
|
||||
ulval = -ulval;
|
||||
|
@ -1083,6 +1091,7 @@ vsnprintf(str, n, fmt, ap)
|
|||
f._flags = __SWR | __SSTR;
|
||||
f._bf._base = f._p = (unsigned char *)str;
|
||||
f._bf._size = f._w = n - 1;
|
||||
f.vwrite = BSD__sfvwrite;
|
||||
ret = BSD_vfprintf(&f, fmt, ap);
|
||||
*f._p = 0;
|
||||
return (ret);
|
||||
|
@ -1092,14 +1101,8 @@ vsnprintf(str, n, fmt, ap)
|
|||
static char sccsid[] = "@(#)snprintf.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#if defined(__STDC__)
|
||||
# include <stdarg.h>
|
||||
#else
|
||||
# include <varargs.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
#if defined(__STDC__)
|
||||
#if defined(HAVE_STDARG_PROTOTYPES)
|
||||
snprintf(char *str, size_t n, char const *fmt, ...)
|
||||
#else
|
||||
snprintf(str, n, fmt, va_alist)
|
||||
|
@ -1115,7 +1118,7 @@ va_dcl
|
|||
if ((int)n < 1)
|
||||
return (EOF);
|
||||
|
||||
#if defined(__STDC__)
|
||||
#if defined(HAVE_STDARG_PROTOTYPES)
|
||||
va_start(ap, fmt);
|
||||
#else
|
||||
va_start(ap);
|
||||
|
@ -1123,6 +1126,7 @@ va_dcl
|
|||
f._flags = __SWR | __SSTR;
|
||||
f._bf._base = f._p = (unsigned char *)str;
|
||||
f._bf._size = f._w = n - 1;
|
||||
f.vwrite = BSD__sfvwrite;
|
||||
ret = BSD_vfprintf(&f, fmt, ap);
|
||||
*f._p = 0;
|
||||
va_end(ap);
|
||||
|
|
12
object.c
12
object.c
|
@ -298,13 +298,9 @@ rb_any_to_s(obj)
|
|||
VALUE obj;
|
||||
{
|
||||
char *cname = rb_obj_classname(obj);
|
||||
size_t len;
|
||||
VALUE str;
|
||||
|
||||
len = strlen(cname)+6+16;
|
||||
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);
|
||||
str = rb_sprintf("#<%s:0x%lx>", cname, obj);
|
||||
if (OBJ_TAINTED(obj)) OBJ_TAINT(str);
|
||||
|
||||
return str;
|
||||
|
@ -385,14 +381,10 @@ rb_obj_inspect(obj)
|
|||
&& ROBJECT(obj)->iv_tbl
|
||||
&& ROBJECT(obj)->iv_tbl->num_entries > 0) {
|
||||
VALUE str;
|
||||
size_t len;
|
||||
char *c;
|
||||
|
||||
c = rb_obj_classname(obj);
|
||||
len = strlen(c)+10+16;
|
||||
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);
|
||||
str = rb_sprintf("-<%s:0x%lx", c, obj);
|
||||
return rb_exec_recursive(inspect_obj, obj, str);
|
||||
}
|
||||
return rb_funcall(obj, rb_intern("to_s"), 0, 0);
|
||||
|
|
6
parse.y
6
parse.y
|
@ -8904,13 +8904,13 @@ ripper_compile_error(parser, fmt, va_alist)
|
|||
va_dcl
|
||||
#endif
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
VALUE str;
|
||||
va_list args;
|
||||
|
||||
va_init_list(args, fmt);
|
||||
vsnprintf(buf, BUFSIZ, fmt, args);
|
||||
str = rb_vsprintf(fmt, 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
|
||||
|
|
|
@ -280,8 +280,7 @@ pst_inspect(st)
|
|||
pid = pst_pid(st);
|
||||
status = NUM2INT(st);
|
||||
|
||||
snprintf(buf, sizeof(buf), "#<%s: pid=%ld", rb_class2name(CLASS_OF(st)), NUM2LONG(pid));
|
||||
str = rb_str_new2(buf);
|
||||
str = rb_sprintf("#<%s: pid=%ld", rb_class2name(CLASS_OF(st)), NUM2LONG(pid));
|
||||
if (WIFSTOPPED(status)) {
|
||||
int stopsig = WSTOPSIG(status);
|
||||
const char *signame = ruby_signal_name(stopsig);
|
||||
|
|
115
sprintf.c
115
sprintf.c
|
@ -15,6 +15,13 @@
|
|||
#include "ruby.h"
|
||||
#include <ctype.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 */
|
||||
|
||||
|
@ -96,6 +103,12 @@ sign_bits(base, p)
|
|||
blen += (l);\
|
||||
} while (0)
|
||||
|
||||
#define FILL(c, l) do { \
|
||||
CHECK(l);\
|
||||
memset(&buf[blen], c, l);\
|
||||
blen += (l);\
|
||||
} while (0)
|
||||
|
||||
#define GETARG() (nextvalue != Qundef ? nextvalue : \
|
||||
posarg < 0 ? \
|
||||
(rb_raise(rb_eArgError, "unnumbered(%d) mixed with numbered", nextarg), 0) : \
|
||||
|
@ -230,9 +243,17 @@ sign_bits(base, p)
|
|||
VALUE
|
||||
rb_f_sprintf(argc, argv)
|
||||
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;
|
||||
{
|
||||
const char *p, *end;
|
||||
char *buf;
|
||||
int blen, bsiz;
|
||||
|
@ -246,7 +267,8 @@ rb_f_sprintf(argc, argv)
|
|||
VALUE tmp;
|
||||
VALUE str;
|
||||
|
||||
fmt = GETNTHARG(0);
|
||||
++argc;
|
||||
--argv;
|
||||
if (OBJ_TAINTED(fmt)) tainted = 1;
|
||||
StringValue(fmt);
|
||||
fmt = rb_str_new4(fmt);
|
||||
|
@ -380,13 +402,14 @@ rb_f_sprintf(argc, argv)
|
|||
VALUE val = GETARG();
|
||||
char c;
|
||||
|
||||
if (!(flags & FMINUS))
|
||||
while (--width > 0)
|
||||
PUSH(" ", 1);
|
||||
c = NUM2INT(val) & 0xff;
|
||||
if (!(flags & FWIDTH)) {
|
||||
PUSH(&c, 1);
|
||||
while (--width > 0)
|
||||
PUSH(" ", 1);
|
||||
}
|
||||
else {
|
||||
FILL(' ', width);
|
||||
buf[blen - ((flags & FMINUS) ? width : 1)] = c;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -807,3 +830,81 @@ fmt_setup(buf, c, flags, width, prec)
|
|||
*buf++ = c;
|
||||
*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;
|
||||
}
|
||||
|
|
17
string.c
17
string.c
|
@ -444,22 +444,13 @@ rb_str_times(str, times)
|
|||
*/
|
||||
|
||||
static VALUE
|
||||
rb_str_format(str, arg)
|
||||
rb_str_format_m(str, arg)
|
||||
VALUE str, arg;
|
||||
{
|
||||
VALUE *argv;
|
||||
|
||||
if (TYPE(arg) == T_ARRAY) {
|
||||
argv = ALLOCA_N(VALUE, RARRAY(arg)->len + 1);
|
||||
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(RARRAY(arg)->len, RARRAY(arg)->ptr, str);
|
||||
}
|
||||
|
||||
argv = ALLOCA_N(VALUE, 2);
|
||||
argv[0] = str;
|
||||
argv[1] = arg;
|
||||
return rb_f_sprintf(2, argv);
|
||||
return rb_str_format(1, &arg, str);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -4669,7 +4660,7 @@ Init_String()
|
|||
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_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_aset_m, -1);
|
||||
rb_define_method(rb_cString, "insert", rb_str_insert, 2);
|
||||
|
|
12
struct.c
12
struct.c
|
@ -476,19 +476,11 @@ inspect_struct(s, dummy, recur)
|
|||
long i;
|
||||
|
||||
if (recur) {
|
||||
char *cname = rb_class2name(rb_obj_class(s));
|
||||
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;
|
||||
return rb_sprintf("#<struct %s:...>", cname);
|
||||
}
|
||||
|
||||
members = rb_struct_members(s);
|
||||
str = rb_str_buf_new2("#<struct ");
|
||||
rb_str_cat2(str, cname);
|
||||
rb_str_cat2(str, " ");
|
||||
str = rb_sprintf("#<struct %s ", cname);
|
||||
for (i=0; i<RSTRUCT(s)->len; i++) {
|
||||
VALUE slot;
|
||||
ID id;
|
||||
|
|
|
@ -196,7 +196,6 @@ rb_class_path(klass)
|
|||
}
|
||||
else {
|
||||
char *s = "Class";
|
||||
size_t len;
|
||||
|
||||
if (TYPE(klass) == T_MODULE) {
|
||||
if (rb_obj_class(klass) == rb_cModule) {
|
||||
|
@ -206,10 +205,7 @@ rb_class_path(klass)
|
|||
s = rb_class2name(RBASIC(klass)->klass);
|
||||
}
|
||||
}
|
||||
len = 2 + strlen(s) + 3 + 2 * SIZEOF_LONG + 1;
|
||||
path = rb_str_new(0, len);
|
||||
snprintf(RSTRING(path)->ptr, len+1, "#<%s:0x%lx>", s, klass);
|
||||
RSTRING(path)->len = strlen(RSTRING(path)->ptr);
|
||||
path = rb_sprintf("#<%s:0x%lx>", s, klass);
|
||||
rb_ivar_set(klass, tmp_classpath, path);
|
||||
|
||||
return path;
|
||||
|
|
|
@ -3602,9 +3602,7 @@ rb_w32_utime(const char *path, struct utimbuf *times)
|
|||
int
|
||||
rb_w32_vsnprintf(char *buf, size_t size, const char *format, va_list va)
|
||||
{
|
||||
int ret = _vsnprintf(buf, size, format, va);
|
||||
if (size > 0) buf[size - 1] = 0;
|
||||
return ret;
|
||||
return vsnprintf(buf, size, format, va);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -178,10 +178,8 @@ extern int rb_w32_rename(const char *, const char *);
|
|||
extern char **rb_w32_get_environ(void);
|
||||
extern void rb_w32_free_environ(char **);
|
||||
|
||||
#define vsnprintf(s,n,f,l) rb_w32_vsnprintf(s,n,f,l)
|
||||
#define snprintf rb_w32_snprintf
|
||||
extern int rb_w32_vsnprintf(char *, size_t, const char *, va_list);
|
||||
extern int rb_w32_snprintf(char *, size_t, const char *, ...);
|
||||
DEPRECATED(extern int rb_w32_vsnprintf(char *, size_t, const char *, va_list));
|
||||
DEPRECATED(extern int rb_w32_snprintf(char *, size_t, const char *, ...));
|
||||
|
||||
extern int chown(const char *, int, int);
|
||||
extern int link(const char *, const char *);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue