diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-11-24 07:13:53 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-11-24 07:13:53 +0000 |
commit | 9031679facdaf5fff73afc68683b53ae34fc3f44 (patch) | |
tree | a4a41211bac9c651e93bc4e8553ce4489eaac1a9 | |
parent | b1d45b805c22e9dba70400100aa080c515e0f2c9 (diff) |
19991124-1.4.3pre1
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_4@565 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 95 | ||||
-rw-r--r-- | dir.c | 167 | ||||
-rw-r--r-- | enum.c | 20 | ||||
-rw-r--r-- | error.c | 23 | ||||
-rw-r--r-- | ext/nkf/nkf.c | 26 | ||||
-rw-r--r-- | io.c | 22 | ||||
-rw-r--r-- | lib/pstore.rb | 42 | ||||
-rw-r--r-- | process.c | 14 |
8 files changed, 330 insertions, 79 deletions
@@ -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, @@ -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 @@ -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 { @@ -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 diff --git a/ext/nkf/nkf.c b/ext/nkf/nkf.c index 80d0d2e4be..b59688cb03 100644 --- a/ext/nkf/nkf.c +++ b/ext/nkf/nkf.c @@ -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; } @@ -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 diff --git a/lib/pstore.rb b/lib/pstore.rb index cc90207aa3..566de8d8f9 100644 --- a/lib/pstore.rb +++ b/lib/pstore.rb @@ -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 @@ -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; |