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

19991124-1.4.3pre1

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_4@565 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1999-11-24 07:13:53 +00:00
parent b1d45b805c
commit 9031679fac
8 changed files with 330 additions and 79 deletions

View file

@ -1,8 +1,103 @@
Thu Nov 18 16:18:27 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* lib/pstore.rb: mutual lock by flock(2).
Thu Nov 18 11:44:13 1999 Masahiro Tomita <tommy@tmtm.org>
* io.c (read_all): should check bytes too.
Mon Nov 15 16:50:34 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* enum.c (enum_grep): grep with block returns collection of
evaluated values of block over matched elements.
Mon Nov 15 04:50:33 1999 Koji Arai <JCA02266@nifty.ne.jp>
* re.c (rb_reg_source): should not call rb_reg_expr_str()
everytime.
Fri Nov 12 23:52:19 1999 Katsuyuki Komatsu <komatsu@sarion.co.jp>
* process.c (rb_f_system): argument check for NT, __EMX__, DJGPP.
Wed Nov 10 21:54:11 1999 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
* hash.c (rb_any_cmp): Fixed return without value.
Tue Nov 9 13:21:04 1999 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
* configure.in: AC_MINIX move to before AC_EXEEXT and AC_OBJEXT.
Mon Nov 8 19:52:29 1999 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
* configure.in: Renamed AC_CHAR_UNSIGNED to AC_C_CHAR_UNSIGNED.
* configure.in: Added default to AC_CHECK_SIZEOF().
Mon Nov 8 14:28:18 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* eval.c (rb_f_eval): fake outer scope when eval() called without
bindings.
* eval.c (rb_f_binding): should copy last_class in the outer frame too.
Sun Nov 7 18:31:04 1999 Yasuhiro Fukuma <yasuf@big.or.jp>
* eval.c (is_defined): last_class may be 0.
Sat Nov 6 19:26:55 1999 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
* Makefile.in: Added depend entry make parse.@OBJEXT@ from parse.c
for UCB make
Wed Nov 3 08:52:57 1999 Masaki Fukushima <fukusima@goto.info.waseda.ac.jp>
* io.c (Init_IO): forgot to use INT2FIX() around SEEK_SET, etc.
Wed Nov 3 00:25:20 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* string.c (rb_str_split_method): use mbclen2() to handle kcode
option of regexp objects.
Sun Oct 31 13:12:42 1999 WATANABE Hirofumi <eban@os.rim.or.jp>
* regex.c (re_compile_pattern): wrong [\W] match.
Thu Oct 28 13:35:40 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* string.c (rb_str_split_method): should be mbchar aware with
single char separators.
Wed Oct 27 12:57:21 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* random.c (rb_f_srand): random seed should be unsigned.
Tue Oct 26 19:20:54 1999 Koji Arai <JCA02266@nifty.ne.jp>
* marshal.c (r_object): should register class/module objects.
Sat Oct 23 15:59:39 1999 Takaaki Tateishi <ttate@jaist.ac.jp>
* process.c (rb_f_system): should require at least one argument.
Thu Oct 21 16:14:19 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* dir.c (fnmatch): use eban's fnmatch; do not depend on systems's
fnmatch (which may have portability problem) anymore.
Wed Oct 20 15:14:24 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* marshal.c (marshal_load): should protect the generated object
table (arg->data) from GC.
Mon Oct 18 16:15:52 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* ext/nkf/nkf.c (rb_nkf_kconv): output should be NUL terminated.
Fri Oct 15 22:50:41 1999 WATANABE Hirofumi <eban@os.rim.or.jp>
* error.c (sys_nerr): on CYGWIN, it is _sys_nerr.
Fri Oct 15 01:32:31 1999 WATANABE Hirofumi <eban@os.rim.or.jp>
* ext/Win32API/Win32API.c (Win32API_Call): need to use NUM2ULONG,

167
dir.c
View file

@ -47,12 +47,6 @@
# endif
#endif
#ifdef HAVE_FNMATCH_H
#include <fnmatch.h>
#else
#include "missing/fnmatch.h"
#endif
#include <errno.h>
#ifdef USE_CWGUSI
# include <sys/errno.h>
@ -66,6 +60,167 @@ char *getenv();
char *strchr _((char*,char));
#endif
#include <ctype.h>
#define FNM_NOESCAPE 0x01
#define FNM_PATHNAME 0x02
#define FNM_PERIOD 0x04
#define FNM_NOCASE 0x08
#define FNM_NOMATCH 1
#define FNM_ERROR 2
#define downcase(c) (nocase && isupper(c) ? tolower(c) : (c))
#if defined DOSISH
#define isdirsep(c) ((c) == '/' || (c) == '\\')
static char *
find_dirsep(s)
char *s;
{
while (*s) {
if (isdirsep(*s))
return s;
s++;
}
return 0;
}
#else
#define isdirsep(c) ((c) == '/')
#define find_dirsep(s) strchr(s, '/')
#endif
static char *
range(pat, test, flags)
char *pat;
char test;
int flags;
{
int not, ok = 0;
int nocase = flags & FNM_NOCASE;
int escape = !(flags & FNM_NOESCAPE);
not = *pat == '!' || *pat == '^';
if (not)
pat++;
test = downcase(test);
while (*pat) {
int cstart, cend;
cstart = cend = *pat++;
if (cstart == ']')
return ok == not ? 0 : pat;
else if (escape && cstart == '\\')
cstart = cend = *pat++;
if (*pat == '-' && pat[1] != ']') {
if (escape && pat[1] == '\\')
pat++;
cend = pat[1];
if (!cend)
return 0;
pat += 2;
}
if (downcase(cstart) <= test && test <= downcase(cend))
ok = 1;
}
return 0;
}
#define PERIOD(s) (period && *(s) == '.' && \
((s) == string || pathname && isdirsep(*(s))))
static int
fnmatch(pat, string, flags)
char *pat;
char *string;
int flags;
{
int c;
int test;
char *s = string;
int escape = !(flags & FNM_NOESCAPE);
int pathname = flags & FNM_PATHNAME;
int period = flags & FNM_PERIOD;
int nocase = flags & FNM_NOCASE;
while (c = *pat++) {
switch (c) {
case '?':
if (!*s || pathname && isdirsep(*s) || PERIOD(s))
return FNM_NOMATCH;
s++;
break;
case '*':
while ((c = *pat++) == '*')
;
if (PERIOD(s))
return FNM_NOMATCH;
if (!c) {
if (pathname && find_dirsep(s))
return FNM_NOMATCH;
else
return 0;
}
else if (pathname && isdirsep(c)) {
s = find_dirsep(s);
if (s)
break;
return FNM_NOMATCH;
}
test = escape && c == '\\' ? *pat : c;
test = downcase(test);
pat--;
while (*s) {
if ((c == '[' || downcase(*s) == test) &&
!fnmatch(pat, s, flags & ~FNM_PERIOD))
return 0;
else if (pathname && isdirsep(*s))
break;
s++;
}
return FNM_NOMATCH;
case '[':
if (!*s || pathname && isdirsep(*s) || PERIOD(s))
return FNM_NOMATCH;
pat = range(pat, *s, flags);
if (!pat)
return FNM_NOMATCH;
s++;
break;
case '\\':
if (escape
#if defined DOSISH
&& *pat && strchr("*?[\\", *pat)
#endif
) {
c = *pat;
if (!c)
c = '\\';
else
pat++;
}
/* FALLTHROUGH */
default:
#if defined DOSISH
if (pathname && isdirsep(c) && isdirsep(*s))
;
else
#endif
if(downcase(c) != downcase(*s))
return FNM_NOMATCH;
s++;
break;
}
}
return !*s ? 0 : FNM_NOMATCH;
}
VALUE rb_cDir;
static void

20
enum.c
View file

@ -33,11 +33,11 @@ grep_i(i, arg)
}
static VALUE
grep_iter_i(i, pat)
VALUE i, pat;
grep_iter_i(i, arg)
VALUE i, *arg;
{
if (RTEST(rb_funcall(pat, id_eqq, 1, i))) {
rb_yield(i);
if (RTEST(rb_funcall(arg[0], id_eqq, 1, i))) {
rb_ary_push(arg[1], rb_yield(i));
}
return Qnil;
}
@ -46,19 +46,17 @@ static VALUE
enum_grep(obj, pat)
VALUE obj, pat;
{
VALUE tmp, arg[2];
arg[0] = pat; arg[1] = tmp = rb_ary_new();
if (rb_iterator_p()) {
rb_iterate(rb_each, obj, grep_iter_i, pat);
return obj;
rb_iterate(rb_each, obj, grep_iter_i, (VALUE)arg);
}
else {
VALUE tmp, arg[2];
arg[0] = pat; arg[1] = tmp = rb_ary_new();
rb_iterate(rb_each, obj, grep_i, (VALUE)arg);
if (RARRAY(tmp)->len == 0) return Qnil;
return tmp;
}
return tmp;
}
struct find_arg {

23
error.c
View file

@ -26,8 +26,11 @@
int sys_nerr = 256;
#endif
#if defined __CYGWIN__ && defined _sys_nerr
#define sys_nerr _sys_nerr
#if defined __CYGWIN__
# include <cygwin/version.h>
# if (CYGWIN_VERSION_API_MAJOR > 0) || (CYGWIN_VERSION_API_MINOR >= 8)
# define sys_nerr _sys_nerr
# endif
#endif
int ruby_nerrs;
@ -38,14 +41,20 @@ err_snprintf(buf, len, fmt, args)
int len;
va_list args;
{
int n;
if (!ruby_sourcefile) {
vsnprintf(buf, len, fmt, args);
return;
}
else if (ruby_sourceline == 0) {
n = snprintf(buf, len, "%s: ", ruby_sourcefile);
}
else {
int n = snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline);
if (len > n) {
vsnprintf((char*)buf+n, len-n, fmt, args);
}
n = snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline);
}
if (len > n) {
vsnprintf((char*)buf+n, len-n, fmt, args);
}
}
@ -436,7 +445,7 @@ static const syserr_index_entry syserr_index[]= {
static VALUE *syserr_list;
#endif
#ifndef NT
#if !defined NT && !defined sys_nerr
extern int sys_nerr;
#endif

View file

@ -31,14 +31,12 @@ rb_nkf_putchar(c)
{
if (output_ctr >= o_len) {
o_len += incsize;
rb_str_cat(dst, "", incsize);
rb_str_cat(dst, 0, incsize);
output = RSTRING(dst)->ptr;
incsize *= 2;
}
output[output_ctr++] = c;
/*
printf("[[%c][%c][%d]]\n", c, output[output_ctr - 1], output_ctr);
*/
return c;
}
@ -51,6 +49,7 @@ rb_nkf_kconv(obj, opt, src)
{
int i;
char *opt_ptr, *opt_end;
volatile VALUE v;
reinit();
opt_ptr = str2cstr(opt, &i);
@ -66,7 +65,8 @@ rb_nkf_kconv(obj, opt, src)
input_ctr = 0;
input = str2cstr(src, &i_len);
dst = rb_str_new(0, i_len*3 + 10); /* large enough? */
dst = rb_str_new(0, i_len*3 + 10);
v = dst;
output_ctr = 0;
output = RSTRING(dst)->ptr;
@ -78,18 +78,8 @@ rb_nkf_kconv(obj, opt, src)
}
kanji_convert(NULL);
if (output_ctr > 0) output_ctr--;
if (output[output_ctr] == '\0') {
/*
printf("([%c][%d])\n", output[output_ctr], output_ctr);
*/
RSTRING(dst)->len = output_ctr;
} else {
/*
printf("<[%c][%d]>\n", output[output_ctr], output_ctr);
*/
RSTRING(dst)->len = output_ctr + 1;
}
RSTRING(dst)->ptr[output_ctr] = '\0';
RSTRING(dst)->len = output_ctr;
return dst;
}

22
io.c
View file

@ -426,7 +426,7 @@ read_all(port)
TRAP_BEG;
n = fread(RSTRING(str)->ptr+bytes, 1, siz-bytes, fptr->f);
TRAP_END;
if (n == 0) {
if (n == 0 && bytes == 0) {
if (feof(fptr->f)) return Qnil;
rb_sys_fail(fptr->path);
}
@ -1092,7 +1092,7 @@ VALUE
rb_io_binmode(io)
VALUE io;
{
#if defined(NT) || defined(DJGPP) || defined(__CYGWIN32__)\
#if defined(NT) || defined(DJGPP) || defined(__CYGWIN__)\
|| defined(__human68k__) || defined(USE_CWGUSI) || defined(__EMX__)
OpenFile *fptr;
@ -1338,7 +1338,7 @@ rb_file_sysopen(fname, flags, mode)
return rb_file_sysopen_internal(rb_cFile, fname, flags, mode);
}
#if defined (NT) || defined(DJGPP) || defined(__CYGWIN32__) || defined(__human68k__)
#if defined (NT) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__)
static struct pipe_list {
OpenFile *fptr;
struct pipe_list *next;
@ -1397,7 +1397,7 @@ static void
pipe_finalize(fptr)
OpenFile *fptr;
{
#if !defined (__CYGWIN32__)
#if !defined (__CYGWIN__)
if (fptr->f != NULL) {
pclose(fptr->f);
}
@ -1528,7 +1528,7 @@ pipe_open(pname, mode)
if (fptr->f) fptr->f2 = f;
else fptr->f = f;
}
#if defined (__CYGWIN32__)
#if defined (__CYGWIN__)
fptr->finalize = pipe_finalize;
pipe_add_fptr(fptr);
#endif
@ -2287,13 +2287,13 @@ next_argv()
fstat(fileno(fr), &st);
if (*ruby_inplace_mode) {
str = rb_str_new2(fn);
#if defined(MSDOS) || defined(__CYGWIN32__) || defined(NT)
#if defined(MSDOS) || defined(__CYGWIN__) || defined(NT)
ruby_add_suffix(str, ruby_inplace_mode);
#else
rb_str_cat(str, ruby_inplace_mode,
strlen(ruby_inplace_mode));
#endif
#if defined(MSDOS) || defined(__BOW__) || defined(__CYGWIN32__) || defined(NT) || defined(__human68k__) || defined(__EMX__)
#if defined(MSDOS) || defined(__BOW__) || defined(__CYGWIN__) || defined(NT) || defined(__human68k__) || defined(__EMX__)
(void)fclose(fr);
(void)unlink(RSTRING(str)->ptr);
(void)rename(fn, RSTRING(str)->ptr);
@ -2308,7 +2308,7 @@ next_argv()
#endif
}
else {
#if !defined(MSDOS) && !defined(__BOW__) && !defined(__CYGWIN32__) && !defined(NT) && !defined(__human68k__)
#if !defined(MSDOS) && !defined(__BOW__) && !defined(__CYGWIN__) && !defined(NT) && !defined(__human68k__)
if (unlink(fn) < 0) {
rb_warn("Can't remove %s: %s, skipping file",
fn, strerror(errno));
@ -2320,7 +2320,7 @@ next_argv()
#endif
}
fw = rb_fopen(fn, "w");
#if !defined(MSDOS) && !defined(__CYGWIN32__) && !(NT) && !defined(__human68k__) && !defined(USE_CWGUSI) && !defined(__BEOS__) && !defined(__EMX__)
#if !defined(MSDOS) && !defined(__CYGWIN__) && !(NT) && !defined(__human68k__) && !defined(USE_CWGUSI) && !defined(__BEOS__) && !defined(__EMX__)
fstat(fileno(fw), &st2);
fchmod(fileno(fw), st.st_mode);
if (st.st_uid!=st2.st_uid || st.st_gid!=st2.st_gid) {
@ -2673,7 +2673,7 @@ rb_io_ctl(io, req, arg, io_p)
fd = fileno(fptr->f);
#ifdef HAVE_FCNTL
TRAP_BEG;
# ifdef USE_CWGUSI
# if defined(USE_CWGUSI) || defined(__CYGWIN__)
retval = io_p?ioctl(fd, cmd, (void*) narg):fcntl(fd, cmd, narg);
# else
retval = io_p?ioctl(fd, cmd, narg):fcntl(fd, cmd, narg);
@ -3334,7 +3334,7 @@ Init_IO()
rb_define_virtual_variable("$-i", opt_i_get, opt_i_set);
#if defined (NT) || defined(DJGPP) || defined(__CYGWIN32__) || defined(__human68k__)
#if defined (NT) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__)
atexit(pipe_atexit);
#endif

View file

@ -13,6 +13,7 @@
# end
require "marshal"
require "ftools"
class PStore
class Error < StandardError
@ -77,22 +78,19 @@ class PStore
raise PStore::Error, "nested transaction" if @transaction
begin
@transaction = true
value = file = nil
lock = @filename + ".lock"
loop do
begin
File::symlink("pstore::#$$", lock)
break
rescue Errno::EEXIST
rescue
sleep 1
end
value = nil
backup = @filename+"~"
if File::exist?(@filename)
file = File::open(@filename, "r+")
orig = true
else
file = File::open(@filename, "w+")
end
begin
File::open(@filename, "r") do |file|
@table = Marshal.load(file)
end
rescue Errno::ENOENT
file.flock(File::LOCK_EX)
if orig
File::copy @filename, backup
@table = Marshal::load(file)
else
@table = {}
end
begin
@ -105,16 +103,10 @@ class PStore
ensure
unless @abort
begin
File::rename @filename, @filename+"~"
rescue Errno::ENOENT
no_orig = true
end
begin
File::open(@filename, "w") do |file|
Marshal::dump(@table, file)
end
file.rewind
Marshal::dump(@table, file)
rescue
File::rename @filename+"~", @filename unless no_orig
File::rename backup, @filename if File::exist?(backup)
end
end
@abort = false
@ -122,7 +114,7 @@ class PStore
ensure
@table = nil
@transaction = false
File::unlink(lock)
file.close
end
value
end

View file

@ -600,6 +600,13 @@ rb_f_system(argc, argv)
VALUE cmd;
int state;
fflush(stdout);
fflush(stderr);
if (argc == 0) {
rb_last_status = INT2FIX(0);
rb_raise(rb_eArgError, "wrong # of arguments");
}
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
rb_raise(rb_eArgError, "wrong first argument");
@ -619,6 +626,11 @@ rb_f_system(argc, argv)
VALUE cmd;
int state;
if (argc == 0) {
rb_last_status = INT2FIX(0);
rb_raise(rb_eArgError, "wrong # of arguments");
}
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
rb_raise(rb_eArgError, "wrong first argument");
@ -667,7 +679,7 @@ rb_f_system(argc, argv)
#if defined(USE_CWGUSI)
rb_notimplement();
#else
volatile VALUE prog = 0;
volatile VALUE prog = 0;
int pid;
int i;