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:
parent
b1d45b805c
commit
9031679fac
8 changed files with 330 additions and 79 deletions
95
ChangeLog
95
ChangeLog
|
@ -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
167
dir.c
|
@ -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
20
enum.c
|
@ -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
23
error.c
|
@ -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
|
||||
|
||||
|
|
|
@ -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
22
io.c
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
14
process.c
14
process.c
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue