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>
* 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
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 \

View file

@ -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\

View file

@ -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
View file

@ -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;

View file

@ -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
View file

@ -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);
}
/*

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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
View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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 *);