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

* ruby.c (proc_options): should not alter origargv[].

* ruby.c (set_arg0): long strings for $0 dumped core.

* ruby.c (set_arg0): use setprogtitle() if it's available.

* io.c (rb_io_popen): accept integer flags as mode.

* file.c (rb_find_file_ext): extension table can be supplied from
  outside.  renamed.

* eval.c (rb_f_require): replace rb_find_file_noext by
  rb_find_file_ext.

* eval.c (rb_provided): should also check feature without
  extension.

* numeric.c (flo_to_s): do not rely on decimal point to be '.'


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1722 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2001-09-03 05:37:42 +00:00
parent c9d1be6327
commit 0f35b58a2f
12 changed files with 133 additions and 157 deletions

View file

@ -3,6 +3,12 @@ Mon Sep 3 14:11:17 2001 Akinori MUSHA <knu@iDaemons.org>
* error.c: unbreak the build on *BSD with gcc 3.0.1 by removing * error.c: unbreak the build on *BSD with gcc 3.0.1 by removing
the conflicting declaration of sys_nerr for *BSD. the conflicting declaration of sys_nerr for *BSD.
Sat Sep 1 18:50:07 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* ruby.c (proc_options): should not alter origargv[].
* ruby.c (set_arg0): long strings for $0 dumped core.
Sat Sep 1 09:50:54 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp> Sat Sep 1 09:50:54 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* ruby.c (set_arg0): prevent SEGV when val is longer than the * ruby.c (set_arg0): prevent SEGV when val is longer than the
@ -11,6 +17,31 @@ Sat Sep 1 09:50:54 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* ruby.c (ruby_process_options): initialize total length of * ruby.c (ruby_process_options): initialize total length of
original arguments at first. original arguments at first.
Sat Sep 1 14:05:28 2001 Brian F. Feldman <green@FreeBSD.org>
* ruby.c (set_arg0): use setprogtitle() if it's available.
Sat Sep 1 03:49:11 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (rb_io_popen): accept integer flags as mode.
Fri Aug 31 19:46:05 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* file.c (rb_find_file_ext): extension table can be supplied from
outside. renamed.
* eval.c (rb_f_require): replace rb_find_file_noext by
rb_find_file_ext.
Fri Aug 31 19:26:55 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* eval.c (rb_provided): should also check feature without
extension.
Fri Aug 31 13:06:33 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* numeric.c (flo_to_s): do not rely on decimal point to be '.'
Wed Aug 29 02:18:53 2001 Yukihiro Matsumoto <matz@ruby-lang.org> Wed Aug 29 02:18:53 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (yylex): ternary ? can be followed by newline. * parse.y (yylex): ternary ? can be followed by newline.

1
ToDo
View file

@ -87,6 +87,7 @@ Standard Libraries
* move NameError under StandardError. * move NameError under StandardError.
* library to load per-user profile seeking .ruby_profile or ruby.ini file. * library to load per-user profile seeking .ruby_profile or ruby.ini file.
* warning framework * warning framework
* marshal should not depend on sprintf/strtod (works bad for locale).
Extension Libraries Extension Libraries

View file

@ -295,7 +295,7 @@ AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\
isinf isnan finite hypot) isinf isnan finite hypot)
AC_CHECK_FUNCS(fmod killpg drand48 random wait4 waitpid syscall getcwd chroot\ AC_CHECK_FUNCS(fmod killpg drand48 random wait4 waitpid syscall getcwd chroot\
truncate chsize times utimes fcntl lockf lstat symlink readlink\ truncate chsize times utimes fcntl lockf lstat symlink readlink\
setitimer setruid seteuid setreuid setresuid \ setitimer setruid seteuid setreuid setresuid setproctitle\
setrgid setegid setregid setresgid pause lchown lchmod\ setrgid setegid setregid setresgid pause lchown lchmod\
getpgrp setpgrp getpgid setpgid getgroups getpriority getrlimit\ getpgrp setpgrp getpgid setpgid getgroups getpriority getrlimit\
dlopen sigprocmask sigaction _setjmp setsid telldir seekdir fchmod) dlopen sigprocmask sigaction _setjmp setsid telldir seekdir fchmod)

26
eval.c
View file

@ -5393,6 +5393,14 @@ rb_feature_p(feature, wait)
return Qtrue; return Qtrue;
} }
static const char *const loadable_ext[] = {
".rb", DLEXT,
#ifdef DLEXT2
DLEXT2,
#endif
0
};
int int
rb_provided(feature) rb_provided(feature)
const char *feature; const char *feature;
@ -5400,8 +5408,8 @@ rb_provided(feature)
VALUE f = rb_str_new2(feature); VALUE f = rb_str_new2(feature);
if (strrchr(feature, '.') == 0) { if (strrchr(feature, '.') == 0) {
if (rb_find_file_noext(&f) == 0) { if (rb_find_file_ext(&f, loadable_ext) == 0) {
return Qfalse; return rb_feature_p(feature, Qfalse);
} }
} }
return rb_feature_p(RSTRING(f)->ptr, Qfalse); return rb_feature_p(RSTRING(f)->ptr, Qfalse);
@ -5444,14 +5452,14 @@ rb_f_require(obj, fname)
} }
else if (strcmp(".so", ext) == 0 || strcmp(".o", ext) == 0) { else if (strcmp(".so", ext) == 0 || strcmp(".o", ext) == 0) {
fname = rb_str_new(RSTRING(fname)->ptr, ext-RSTRING(fname)->ptr); fname = rb_str_new(RSTRING(fname)->ptr, ext-RSTRING(fname)->ptr);
feature = tmp = rb_str_dup(fname); #ifdef DLEXT2
rb_str_cat2(tmp, DLEXT); tmp = fname;
tmp = rb_find_file(tmp); if (rb_find_file_ext(&tmp, loadable_ext+1)) {
if (tmp) { feature = tmp;
fname = tmp; fname = rb_find_file(tmp);
goto load_dyna; goto load_dyna;
} }
#ifdef DLEXT2 #else
feature = tmp = rb_str_dup(fname); feature = tmp = rb_str_dup(fname);
rb_str_cat2(tmp, DLEXT); rb_str_cat2(tmp, DLEXT);
tmp = rb_find_file(tmp); tmp = rb_find_file(tmp);
@ -5481,7 +5489,7 @@ rb_f_require(obj, fname)
#endif #endif
} }
tmp = fname; tmp = fname;
switch (rb_find_file_noext(&tmp)) { switch (rb_find_file_ext(&tmp, loadable_ext)) {
case 0: case 0:
break; break;

11
file.c
View file

@ -2284,22 +2284,15 @@ file_load_ok(file)
extern VALUE rb_load_path; extern VALUE rb_load_path;
int int
rb_find_file_noext(filep) rb_find_file_ext(filep, ext)
VALUE *filep; VALUE *filep;
char **ext;
{ {
char *path, *e, *found; char *path, *e, *found;
char *f = RSTRING(*filep)->ptr; char *f = RSTRING(*filep)->ptr;
VALUE fname; VALUE fname;
int i, j; int i, j;
static char *ext[] = {
".rb", DLEXT,
#ifdef DLEXT2
DLEXT2,
#endif
0
};
if (f[0] == '~') { if (f[0] == '~') {
fname = *filep; fname = *filep;
fname = rb_file_s_expand_path(1, &fname); fname = rb_file_s_expand_path(1, &fname);

14
io.c
View file

@ -1339,7 +1339,7 @@ rb_io_binmode_flags(mode)
return flags; return flags;
} }
int static int
rb_io_mode_binmode(mode) rb_io_mode_binmode(mode)
const char *mode; const char *mode;
{ {
@ -1378,10 +1378,9 @@ rb_io_mode_binmode(mode)
} }
static char* static char*
rb_io_modestr(flags) rb_io_binmode_mode(flags, mode)
int flags; int flags;
{ {
static char mode[4];
char *p = mode; char *p = mode;
switch (flags & (O_RDONLY|O_WRONLY|O_RDWR)) { switch (flags & (O_RDONLY|O_WRONLY|O_RDWR)) {
@ -1517,11 +1516,12 @@ rb_file_sysopen_internal(io, fname, flags, mode)
OpenFile *fptr; OpenFile *fptr;
int fd; int fd;
char *m; char *m;
char mbuf[4];
MakeOpenFile(io, fptr); MakeOpenFile(io, fptr);
fd = rb_sysopen(fname, flags, mode); fd = rb_sysopen(fname, flags, mode);
m = rb_io_modestr(flags); m = rb_io_binmode_mode(flags, mbuf);
fptr->mode = rb_io_binmode_flags(flags); fptr->mode = rb_io_binmode_flags(flags);
fptr->f = rb_fdopen(fd, m); fptr->f = rb_fdopen(fd, m);
fptr->path = strdup(fname); fptr->path = strdup(fname);
@ -1760,10 +1760,14 @@ rb_io_popen(str, argc, argv, klass)
{ {
char *mode; char *mode;
VALUE pname, pmode, port; VALUE pname, pmode, port;
char mbuf[4];
if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) {
mode = "r"; mode = "r";
} }
else if (FIXNUM_P(pmode)) {
mode = rb_io_binmode_mode(FIX2INT(pmode), mbuf);
}
else { else {
mode = StringValuePtr(pmode); mode = StringValuePtr(pmode);
} }
@ -1817,7 +1821,7 @@ rb_open_file(argc, argv, io)
if (FIXNUM_P(vmode) || !NIL_P(perm)) { if (FIXNUM_P(vmode) || !NIL_P(perm)) {
flags = FIXNUM_P(vmode) ? NUM2INT(vmode) : rb_io_mode_binmode(StringValuePtr(vmode)); flags = FIXNUM_P(vmode) ? NUM2INT(vmode) : rb_io_mode_binmode(StringValuePtr(vmode));
fmode = NIL_P(perm) ? 0666 : NUM2INT(perm); fmode = NIL_P(perm) ? 0666 : NUM2INT(perm);
file = rb_file_sysopen_internal(io, path, flags, fmode); file = rb_file_sysopen_internal(io, path, flags, fmode);
} }
else { else {

View file

@ -214,30 +214,31 @@ flo_to_s(flt)
VALUE flt; VALUE flt;
{ {
char buf[24]; char buf[24];
char *s; char *fmt = "%.10g";
double value = RFLOAT(flt)->value; double value = RFLOAT(flt)->value;
double d1, d2;
if (isinf(value)) if (isinf(value))
return rb_str_new2(value < 0 ? "-Infinity" : "Infinity"); return rb_str_new2(value < 0 ? "-Infinity" : "Infinity");
else if(isnan(value)) else if(isnan(value))
return rb_str_new2("NaN"); return rb_str_new2("NaN");
else
sprintf(buf, "%-.10g", value); if (value < 1.0e-3) {
if (s = strchr(buf, ' ')) *s = '\0'; d1 = value;
s = buf; if (s[0] == '-') s++; while (d1 < 1.0) d1 *= 10.0;
if (strchr(s, '.') == 0) { d1 = modf(d1, &d2);
int len = strlen(buf); if (d1 == 0) fmt = "%.1e";
char *ind = strchr(buf, 'e'); }
else if (value >= 1.0e10) {
if (ind) { d1 = value;
memmove(ind+2, ind, len-(ind-buf)+1); while (d1 > 10.0) d1 /= 10.0;
ind[0] = '.'; d1 = modf(d1, &d2);
ind[1] = '0'; if (d1 == 0) fmt = "%.1e";
} }
else { else if ((d1 = modf(value, &d2)) == 0) {
strcat(buf, ".0"); fmt = "%.1f";
}
} }
sprintf(buf, fmt, value);
return rb_str_new2(buf); return rb_str_new2(buf);
} }

66
pack.c
View file

@ -656,16 +656,7 @@ pack_pack(ary, fmt)
float f; float f;
from = NEXTFROM; from = NEXTFROM;
switch (TYPE(from)) { f = RFLOAT(rb_Float(from))->value;
case T_FLOAT:
f = RFLOAT(from)->value;
break;
case T_STRING:
f = strtod(RSTRING(from)->ptr, 0);
default:
f = (float)NUM2INT(from);
break;
}
rb_str_buf_cat(res, (char*)&f, sizeof(float)); rb_str_buf_cat(res, (char*)&f, sizeof(float));
} }
break; break;
@ -676,16 +667,7 @@ pack_pack(ary, fmt)
FLOAT_CONVWITH(ftmp); FLOAT_CONVWITH(ftmp);
from = NEXTFROM; from = NEXTFROM;
switch (TYPE(from)) { f = RFLOAT(rb_Float(from))->value;
case T_FLOAT:
f = RFLOAT(from)->value;
break;
case T_STRING:
f = strtod(RSTRING(from)->ptr, 0);
default:
f = (float)NUM2INT(from);
break;
}
f = HTOVF(f,ftmp); f = HTOVF(f,ftmp);
rb_str_buf_cat(res, (char*)&f, sizeof(float)); rb_str_buf_cat(res, (char*)&f, sizeof(float));
} }
@ -697,16 +679,7 @@ pack_pack(ary, fmt)
DOUBLE_CONVWITH(dtmp); DOUBLE_CONVWITH(dtmp);
from = NEXTFROM; from = NEXTFROM;
switch (TYPE(from)) { d = RFLOAT(rb_Float(from))->value;
case T_FLOAT:
d = RFLOAT(from)->value;
break;
case T_STRING:
d = strtod(RSTRING(from)->ptr, 0);
default:
d = (double)NUM2INT(from);
break;
}
d = HTOVD(d,dtmp); d = HTOVD(d,dtmp);
rb_str_buf_cat(res, (char*)&d, sizeof(double)); rb_str_buf_cat(res, (char*)&d, sizeof(double));
} }
@ -718,16 +691,7 @@ pack_pack(ary, fmt)
double d; double d;
from = NEXTFROM; from = NEXTFROM;
switch (TYPE(from)) { d = RFLOAT(rb_Float(from))->value;
case T_FLOAT:
d = RFLOAT(from)->value;
break;
case T_STRING:
d = strtod(RSTRING(from)->ptr, 0);
default:
d = (double)NUM2INT(from);
break;
}
rb_str_buf_cat(res, (char*)&d, sizeof(double)); rb_str_buf_cat(res, (char*)&d, sizeof(double));
} }
break; break;
@ -738,16 +702,7 @@ pack_pack(ary, fmt)
FLOAT_CONVWITH(ftmp); FLOAT_CONVWITH(ftmp);
from = NEXTFROM; from = NEXTFROM;
switch (TYPE(from)) { f = RFLOAT(rb_Float(from))->value;
case T_FLOAT:
f = RFLOAT(from)->value;
break;
case T_STRING:
f = strtod(RSTRING(from)->ptr, 0);
default:
f = (float)NUM2INT(from);
break;
}
f = HTONF(f,ftmp); f = HTONF(f,ftmp);
rb_str_buf_cat(res, (char*)&f, sizeof(float)); rb_str_buf_cat(res, (char*)&f, sizeof(float));
} }
@ -759,16 +714,7 @@ pack_pack(ary, fmt)
DOUBLE_CONVWITH(dtmp); DOUBLE_CONVWITH(dtmp);
from = NEXTFROM; from = NEXTFROM;
switch (TYPE(from)) { d = RFLOAT(rb_Float(from))->value;
case T_FLOAT:
d = RFLOAT(from)->value;
break;
case T_STRING:
d = strtod(RSTRING(from)->ptr, 0);
default:
d = (double)NUM2INT(from);
break;
}
d = HTOND(d,dtmp); d = HTOND(d,dtmp);
rb_str_buf_cat(res, (char*)&d, sizeof(double)); rb_str_buf_cat(res, (char*)&d, sizeof(double));
} }

View file

@ -4177,7 +4177,7 @@ re_match(bufp, string_arg, size, pos, regs)
if (IS_A_LETTER(d)) break; if (IS_A_LETTER(d)) break;
else goto fail; else goto fail;
} }
if (AT_STRINGS_BEG(d)) { if (AT_STRINGS_END(d)) {
if (PREV_IS_A_LETTER(d)) break; if (PREV_IS_A_LETTER(d)) break;
else goto fail; else goto fail;
} }

79
ruby.c
View file

@ -60,7 +60,7 @@ static VALUE do_split = Qfalse;
static char *script; static char *script;
static int origargc, origarglen; static int origargc;
static char **origargv; static char **origargv;
static void static void
@ -667,11 +667,6 @@ proc_options(argc, argv)
} }
} }
if (e_script) {
argc++, argv--;
argv[0] = script;
}
if (version) { if (version) {
ruby_show_version(); ruby_show_version();
exit(0); exit(0);
@ -690,7 +685,9 @@ proc_options(argc, argv)
script = "-"; script = "-";
} }
else { else {
script = argv[0]; if (!e_script) {
script = argv[0];
}
if (script[0] == '\0') { if (script[0] == '\0') {
script = "-"; script = "-";
} }
@ -882,26 +879,13 @@ set_arg0(val, id)
{ {
char *s; char *s;
int i; int i;
int len = origarglen; static int len;
if (origargv == 0) rb_raise(rb_eRuntimeError, "$0 not initialized"); if (origargv == 0) rb_raise(rb_eRuntimeError, "$0 not initialized");
StringValue(val); StringValue(val);
s = RSTRING(val)->ptr; s = RSTRING(val)->ptr;
i = RSTRING(val)->len; i = RSTRING(val)->len;
#ifndef __hpux #ifdef __hpux
if (i >= len) {
memcpy(origargv[0], s, len);
origargv[0][len] = '\0';
}
else {
memcpy(origargv[0], s, i);
s = origargv[0]+i;
*s++ = '\0';
while (++i < len)
*s++ = ' ';
}
rb_progname = rb_tainted_str_new2(origargv[0]);
#else
if (i >= PST_CLEN) { if (i >= PST_CLEN) {
union pstun j; union pstun j;
j.pst_command = s; j.pst_command = s;
@ -916,7 +900,44 @@ set_arg0(val, id)
pstat(PSTAT_SETCMD, j, i, 0, 0); pstat(PSTAT_SETCMD, j, i, 0, 0);
} }
rb_progname = rb_tainted_str_new(s, i); rb_progname = rb_tainted_str_new(s, i);
#elif defined(HAVE_SETPROCTITLE)
setproctitle("%.*s", i, s);
rb_progname = rb_tainted_str_new(s, i);
#else
if (len == 0) {
char *s = origargv[0];
int i;
s += strlen(s);
/* See if all the arguments are contiguous in memory */
for (i = 1; i < origargc; i++) {
if (origargv[i] == s + 1) {
s++;
s += strlen(s); /* this one is ok too */
}
else {
break;
}
}
len = s - origargv[0];
}
if (i >= len) {
i = len;
memcpy(origargv[0], s, i);
origargv[0][i] = '\0';
}
else {
memcpy(origargv[0], s, i);
s = origargv[0]+i;
*s++ = '\0';
while (++i < len)
*s++ = ' ';
for (i = 1; i < origargc; i++)
origargv[i] = 0;
}
#endif #endif
rb_progname = rb_tainted_str_new2(origargv[0]);
} }
void void
@ -1014,19 +1035,7 @@ ruby_process_options(argc, argv)
char **argv; char **argv;
{ {
origargc = argc; origargv = argv; origargc = argc; origargv = argv;
#ifndef __hpux
if (origarglen == 0) {
int i;
char *s = origargv[0];
s += strlen(s);
/* See if all the arguments are contiguous in memory */
for (i = 1; i < origargc; i++) {
if (origargv[i] == s + 1)
s += strlen(++s); /* this one is ok too */
}
origarglen = s - origargv[0];
}
#endif
ruby_script(argv[0]); /* for the time being */ ruby_script(argv[0]); /* for the time being */
rb_argv0 = rb_progname; rb_argv0 = rb_progname;
#if defined(USE_DLN_A_OUT) #if defined(USE_DLN_A_OUT)

View file

@ -589,24 +589,7 @@ rb_f_sprintf(argc, argv)
int i, need = 6; int i, need = 6;
char fbuf[32]; char fbuf[32];
switch (TYPE(val)) { fval = RFLOAT(rb_Float(val))->value;
case T_FIXNUM:
fval = (double)FIX2LONG(val);
break;
case T_FLOAT:
fval = RFLOAT(val)->value;
break;
case T_BIGNUM:
fval = rb_big2dbl(val);
break;
case T_STRING:
fval = strtod(RSTRING(val)->ptr, 0);
break;
default:
fval = NUM2DBL(val);
break;
}
fmt_setup(fbuf, *p, flags, width, prec); fmt_setup(fbuf, *p, flags, width, prec);
need = 0; need = 0;
if (*p != 'e' && *p != 'E') { if (*p != 'e' && *p != 'E') {

View file

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.1" #define RUBY_VERSION "1.7.1"
#define RUBY_RELEASE_DATE "2001-09-01" #define RUBY_RELEASE_DATE "2001-09-03"
#define RUBY_VERSION_CODE 171 #define RUBY_VERSION_CODE 171
#define RUBY_RELEASE_CODE 20010901 #define RUBY_RELEASE_CODE 20010903