From be1fea072cd0d22788ef8a931c0c6b64a2503b5d Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 12 Oct 1999 04:53:36 +0000 Subject: 19991012 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@537 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 14 +++++++ Makefile.in | 17 +++++---- README.EXT | 4 ++ README.EXT.jp | 6 ++- ToDo | 3 +- defines.h | 2 +- error.c | 2 +- eval.c | 8 ++-- ext/socket/extconf.rb | 2 + ext/socket/socket.c | 6 +++ file.c | 16 ++++---- gc.c | 1 - hash.c | 1 + lib/cgi-lib.rb | 19 ++++++++-- lib/matrix.rb | 100 ++++++++++++++++++++++++++++++-------------------- lib/telnet.rb | 54 +++++++++++++++++---------- parse.y | 4 +- sample/mine.rb | 2 + signal.c | 26 ++++++++----- 19 files changed, 188 insertions(+), 99 deletions(-) diff --git a/ChangeLog b/ChangeLog index e7f5706162..900a94ea97 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Mon Oct 11 17:42:25 1999 Nobuyoshi Nakada + + * parse.y (rb_intern): should generate distinct ID_ATTRSET symbols + for the name with multiple `='s at the end. + + * Makefile.in (CPPFLAGS): separate cpp flags from CFLAGS. + +Mon Oct 11 07:27:05 1999 Yukihiro Matsumoto + + * eval.c (rb_eval): should not execute the `else' clause on the + case the exceptions are handled by the `rescue' clause. + + * signal.c (Init_signal): ignore SIGPIPE by default. + Mon Oct 4 12:42:32 1999 Kazuhiko Izawa * pack.c (pack_unpack): % in printf format should be %%. diff --git a/Makefile.in b/Makefile.in index 4b1f2696aa..e846d8d72f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -12,7 +12,8 @@ AUTOCONF = autoconf @SET_MAKE@ prefix = @prefix@ -CFLAGS = @CFLAGS@ -I. -I@srcdir@ -I@includedir@ +CFLAGS = @CFLAGS@ +CPPFLAGS = -I. -I@srcdir@ -I@includedir@ LDFLAGS = @STATIC@ $(CFLAGS) @LDFLAGS@ XLDFLAGS = @XLDFLAGS@ EXTLIBS = @@ -38,7 +39,7 @@ LIBRUBY_ALIASES= @LIBRUBY_ALIASES@ LIBRUBY = @LIBRUBY@ LIBRUBYARG = @LIBRUBYARG@ -EXTOBJS = dmyext.@OBJEXT@ +EXTOBJS = MAINOBJ = main.@OBJEXT@ @@ -83,20 +84,20 @@ OBJS = array.@OBJEXT@ \ all: miniruby$(EXEEXT) rbconfig.rb @./miniruby$(EXEEXT) -Xext extmk.rb @EXTSTATIC@ -miniruby$(EXEEXT): config.status $(LIBRUBY_A) $(MAINOBJ) $(EXTOBJS) +miniruby$(EXEEXT): config.status $(LIBRUBY_A) $(MAINOBJ) dmyext.@OBJEXT@ @rm -f $@ - $(PURIFY) $(CC) $(LDFLAGS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBY_A) $(LIBS) -o $@ + $(PURIFY) $(CC) $(LDFLAGS) $(MAINOBJ) dmyext.@OBJEXT@ $(LIBRUBY_A) $(LIBS) -o $@ $(PROGRAM): $(LIBRUBY) $(MAINOBJ) $(EXTOBJS) @rm -f $@ $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@ -$(LIBRUBY_A): $(OBJS) - @AR@ rcu $@ $(OBJS) +$(LIBRUBY_A): $(OBJS) dmyext.@OBJEXT@ + @AR@ rcu $@ $(OBJS) dmyext.@OBJEXT@ @-@RANLIB@ $@ 2> /dev/null || true -$(LIBRUBY_SO): $(OBJS) - $(LDSHARED) $(DLDFLAGS) $(SOLIBS) $(OBJS) -o $@ +$(LIBRUBY_SO): $(OBJS) dmyext.@OBJEXT@ + $(LDSHARED) $(DLDFLAGS) $(SOLIBS) $(OBJS) dmyext.@OBJEXT@ -o $@ @-./miniruby -e 'ARGV.each{|link| File.delete link if File.exist? link; \ File.symlink "$(LIBRUBY_SO)", link}' \ $(LIBRUBY_ALIASES) || true diff --git a/README.EXT b/README.EXT index f850f01097..68726b793d 100644 --- a/README.EXT +++ b/README.EXT @@ -874,6 +874,10 @@ Returns the name corresponding ID. Returns the name of the class. + int rb_respond_to(VALUE object, ID id) + +Returns true if the object reponds to the message specified by id. + ** Instance Variables VALUE rb_iv_get(VALUE obj, char *name) diff --git a/README.EXT.jp b/README.EXT.jp index 5305f92df4..6a049d0222 100644 --- a/README.EXT.jp +++ b/README.EXT.jp @@ -1013,7 +1013,7 @@ VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) VALUE rb_eval_string(char *str) - 文字列をRubyとスクリプトしてコンパイル・実行する. + 文字列をRubyスクリプトとしてコンパイル・実行する. ID rb_intern(char *name) @@ -1028,6 +1028,10 @@ char *rb_class2name(VALUE class) classの名前を返す(デバッグ用).classが名前を持たない時には, 祖先を遡って名前を持つクラスの名前を返す. +int rb_respond_to(VALUE obj, ID id) + + objがidで示されるメソッドを持つかどうかを返す。 + ** インスタンス変数 VALUE rb_iv_get(VALUE obj, char *name) diff --git a/ToDo b/ToDo index 1014ab51c7..45b463f34d 100644 --- a/ToDo +++ b/ToDo @@ -15,6 +15,7 @@ Language Spec. Hacking Interpreter +* hash[key] = nil may not remove entry; hashes may have nil as the value. * RUBYOPT environment variable * non-blocking open (e.g. named pipe) for thread * avoid blocking with gethostbyname/gethostbyaddr @@ -26,6 +27,7 @@ Hacking Interpreter Standard Libraries +* Array#{first,last,at} * Struct::new([name,]member,...) ?? * String#scanf(?) * Object#fmt(?) @@ -44,7 +46,6 @@ Extension Libraries Ruby Libraries -* net/pop.rb net/smtp.rb * httplib.rb, urllib.rb, nttplib.rb, etc. * format like perl's diff --git a/defines.h b/defines.h index a1558f4836..6485fd7a59 100644 --- a/defines.h +++ b/defines.h @@ -14,7 +14,7 @@ /* define RUBY_USE_EUC/SJIS for default kanji-code */ #ifndef DEFAULT_KCODE -#if defined(MSDOS) || defined(__CYGWIN32__) || defined(__human68k__) || defined(__MACOS__) || defined(__EMX__) || defined(OS2) +#if defined(MSDOS) || defined(__CYGWIN32__) || defined(__human68k__) || defined(__MACOS__) || defined(__EMX__) || defined(OS2) || defined(NT) #define DEFAULT_KCODE KCODE_SJIS #else #define DEFAULT_KCODE KCODE_EUC diff --git a/error.c b/error.c index 300c09fed0..6a48210b4e 100644 --- a/error.c +++ b/error.c @@ -330,7 +330,7 @@ exc_inspect(exc) str = rb_str_new2("#<"); klass = rb_class_path(klass); rb_str_concat(str, klass); - rb_str_cat(str, ":", 1); + rb_str_cat(str, ": ", 2); rb_str_concat(str, exc); rb_str_cat(str, ">", 1); diff --git a/eval.c b/eval.c index 7a6bff985c..f225bf47bd 100644 --- a/eval.c +++ b/eval.c @@ -2084,10 +2084,12 @@ rb_eval(self, node) resq = resq->nd_head; /* next rescue */ } } - if (state) JUMP_TAG(state); - if (node->nd_else) { /* no exception raised, else clause given */ - result = rb_eval(self, node->nd_else); + else if (node->nd_else) { /* else clause given */ + if (!state) { /* no exception raised */ + result = rb_eval(self, node->nd_else); + } } + if (state) JUMP_TAG(state); } break; diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb index f2eddc0bba..47addfeff8 100644 --- a/ext/socket/extconf.rb +++ b/ext/socket/extconf.rb @@ -149,6 +149,8 @@ EOF end have_header("sys/sysctl.h") +have_header("netinet/tcp.h") +have_header("netinet/udp.h") $getaddr_info_ok = false if try_run(< #include +#ifdef NETINET_TCP +# include +#endif +#ifdef NETINET_UDP +# include +#endif #include #endif #include diff --git a/file.c b/file.c index 182c6d0b42..b53c814211 100644 --- a/file.c +++ b/file.c @@ -1521,20 +1521,20 @@ rb_f_test(argc, argv) case '-': if (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) return Qtrue; - break; - + return Qfalse; + case '=': if (st1.st_mtime == st2.st_mtime) return Qtrue; - break; - + return Qfalse; + case '>': if (st1.st_mtime > st2.st_mtime) return Qtrue; - break; - + return Qfalse; + case '<': if (st1.st_mtime < st2.st_mtime) return Qtrue; - break; - } + return Qfalse; + } } /* unknown command */ rb_raise(rb_eArgError, "unknown command ?%c", cmd); diff --git a/gc.c b/gc.c index 7aa57d92b8..ed159a7ffd 100644 --- a/gc.c +++ b/gc.c @@ -10,7 +10,6 @@ ************************************************/ -#define RUBY_NO_INLINE #include "ruby.h" #include "rubysig.h" #include "st.h" diff --git a/hash.c b/hash.c index 608f85d72f..a0d11c06dd 100644 --- a/hash.c +++ b/hash.c @@ -264,6 +264,7 @@ rb_hash_s_create(argc, argv, klass) hash = rb_hash_new2(klass); for (i=0; itbl, argv[i], argv[i+1]); } diff --git a/lib/cgi-lib.rb b/lib/cgi-lib.rb index f599f772ce..bf04601238 100644 --- a/lib/cgi-lib.rb +++ b/lib/cgi-lib.rb @@ -117,6 +117,17 @@ class CGI < SimpleDelegator LF = "\012" EOL = CR + LF + RFC822_DAYS = %w[ Sun Mon Tue Wed Thu Fri Sat ] + RFC822_MONTHS = %w[ Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ] + + # make rfc1123 date string + def rfc1123_date(time) + t = time.clone.gmtime + return format("%s, %.2d %s %d %.2d:%.2d:%.2d GMT", + RFC822_DAYS[t.wday], t.day, RFC822_MONTHS[t.month-1], t.year, + t.hour, t.min, t.sec) + end + # escape url encode def escape(str) str.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) } @@ -132,7 +143,7 @@ class CGI < SimpleDelegator str.gsub(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/ column_size - 1 - nothing = true + exists = false break end end while a[i][k] == 0 - next if nothing - a[i], a[k] = a[k], a[i] - akk = a[k][k] + if exists + a[i], a[k] = a[k], a[i] + akk = a[k][k] + else + i = k + exists = true + begin + if (i += 1) > row_size - 1 + exists = false + break + end + end while a[k][i] == 0 + if exists + k.upto(column_size - 1) do + |j| + a[j][k], a[j][i] = a[j][i], a[j][k] + end + akk = a[k][k] + else + next + end + end end (k + 1).upto(row_size - 1) do |i| @@ -806,10 +827,10 @@ class Vector private_class_method :new def Vector.[](*array) - new(:init_elements, array, copy = false) + new(:init_elements, array, copy = FALSE) end - def Vector.elements(array, copy = true) + def Vector.elements(array, copy = TRUE) new(:init_elements, array, copy) end @@ -854,7 +875,7 @@ class Vector # COMPARING def ==(other) - return false unless Vector === other + return FALSE unless Vector === other other.compare_by(@elements) end @@ -874,11 +895,11 @@ class Vector # ARITHMETIC - def *(x) # is matrix or number + def *(x) "is matrix or number" case x when Numeric els = @elements.collect{|e| e * x} - Vector.elements(els, false) + Vector.elements(els, FALSE) when Matrix self.covector * x else @@ -895,7 +916,7 @@ class Vector |v1, v2| v1 + v2 } - Vector.elements(els, false) + Vector.elements(els, FALSE) when Matrix Matrix.column_vector(self) + v else @@ -912,7 +933,7 @@ class Vector |v1, v2| v1 - v2 } - Vector.elements(els, false) + Vector.elements(els, FALSE) when Matrix Matrix.column_vector(self) - v else @@ -939,7 +960,7 @@ class Vector |v| yield v } - Vector.elements(els, false) + Vector.elements(els, FALSE) end alias map collect @@ -948,7 +969,7 @@ class Vector |v1, v2| yield v1, v2 } - Vector.elements(els, false) + Vector.elements(els, FALSE) end def r @@ -999,4 +1020,3 @@ class Vector str = "Vector"+@elements.inspect end end - diff --git a/lib/telnet.rb b/lib/telnet.rb index b161ae8c6c..b6623513e0 100644 --- a/lib/telnet.rb +++ b/lib/telnet.rb @@ -1,11 +1,11 @@ =begin -$Date: 1999/09/21 21:24:07 $ +$Date: 1999/10/04 22:51:26 $ == SIMPLE TELNET CLIANT LIBRARY telnet.rb -Version 0.50 +Version 1.00 Wakou Aoyama @@ -155,6 +155,15 @@ of cource, set sync=true or flush is necessary. == HISTORY +=== Version 1.00 + +1999/10/04 22:51:26 + +- bug fix: waitfor(preprocess) method + thanks to Shin-ichiro Hara +- add simple support for AO, DM, IP, NOP, SB, SE +- COUTION! TimeOut --> TimeoutError + === Version 0.50 1999/09/21 21:24:07 @@ -331,7 +340,6 @@ require "socket" require "delegate" require "thread" require "timeout" -TimeOut = TimeoutError class Telnet < SimpleDelegator @@ -405,8 +413,8 @@ class Telnet < SimpleDelegator EOL = CR + LF v = $-v $-v = false - VERSION = "0.50" - RELEASE_DATE = "$Date: 1999/09/21 21:24:07 $" + VERSION = "1.00" + RELEASE_DATE = "$Date: 1999/10/04 22:51:26 $" $-v = v def initialize(options) @@ -456,7 +464,7 @@ $-v = v } end rescue TimeoutError - raise TimeOut, "timed-out; opening of the host" + raise TimeoutError, "timed-out; opening of the host" rescue @log.write($!.to_s + "\n") if @options.key?("Output_log") @dumplog.write($!.to_s + "\n") if @options.key?("Dump_log") @@ -502,10 +510,10 @@ $-v = v str.gsub!(/#{EOL}/no, "\n") unless @options["Binmode"] str.gsub!(/#{IAC}( - #{IAC}| - #{AYT}| + [#{IAC}#{AO}#{AYT}#{DM}#{IP}#{NOP}]| [#{DO}#{DONT}#{WILL}#{WONT}] - [#{OPT_BINARY}-#{OPT_NEW_ENVIRON}#{OPT_EXOPL}] + [#{OPT_BINARY}-#{OPT_NEW_ENVIRON}#{OPT_EXOPL}]| + #{SB}[^#{IAC}]*#{IAC}#{SE} )/xno){ if IAC == $1 # handle escaped IAC characters IAC @@ -539,6 +547,8 @@ $-v = v self.write(IAC + DONT + OPT_SGA) end '' + else + '' end } @@ -551,7 +561,7 @@ $-v = v if options.kind_of?(Hash) prompt = if options.key?("Match") - options["Match"] + options["Match"] elsif options.key?("Prompt") options["Prompt"] elsif options.key?("String") @@ -569,24 +579,30 @@ $-v = v line = '' buf = '' + rest = '' until(prompt === line and not IO::select([@sock], nil, nil, waittime)) unless IO::select([@sock], nil, nil, time_out) - raise TimeOut, "timed-out; wait for the next data" + raise TimeoutError, "timed-out; wait for the next data" end begin c = @sock.sysread(1024 * 1024) @dumplog.print(c) if @options.key?("Dump_log") - buf.concat c if @options["Telnetmode"] - buf = preprocess(buf) - if /#{IAC}.?\z/no === buf - next - end - end + if Integer(c.rindex(/#{IAC}#{SE}/no)) < + Integer(c.rindex(/#{IAC}#{SB}/no)) + buf = preprocess(rest + c[0 ... c.rindex(/#{IAC}#{SB}/no)]) + rest = c[c.rindex(/#{IAC}#{SB}/no) .. -1] + elsif pt = c.rindex(/#{IAC}[^#{IAC}#{AO}#{AYT}#{DM}#{IP}#{NOP}]?\z/no) + buf = preprocess(rest + c[0 ... pt]) + rest = c[pt .. -1] + else + buf = preprocess(c) + rest = '' + end + end @log.print(buf) if @options.key?("Output_log") - yield buf if iterator? line.concat(buf) - buf = '' + yield buf if iterator? rescue EOFError # End of file reached if line == '' line = nil diff --git a/parse.y b/parse.y index 1108539909..5e516d2751 100644 --- a/parse.y +++ b/parse.y @@ -4420,11 +4420,11 @@ rb_intern(name) strncpy(buf, name, last); buf[last] = '\0'; id = rb_intern(buf); - if (id > LAST_TOKEN) { + if (id > LAST_TOKEN && !is_attrset_id(id)) { id = rb_id_attrset(id); goto id_regist; } - id |= ID_ATTRSET; + id = ID_ATTRSET; } else if (ISUPPER(name[0])) { id = ID_CONST; diff --git a/sample/mine.rb b/sample/mine.rb index fd326482a5..7d02e5bfc9 100644 --- a/sample/mine.rb +++ b/sample/mine.rb @@ -1,3 +1,5 @@ +#! /usr/bin/ruby -Ke + class Board def clr print "\e[2J" diff --git a/signal.c b/signal.c index 857aa8a453..6489760bc6 100644 --- a/signal.c +++ b/signal.c @@ -294,6 +294,13 @@ posix_signal(signum, handler) sigact.sa_handler = handler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; +#ifdef SA_RESTART + sigact.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */ +#endif +#ifdef SA_NOCLDWAIT + if (signum == SIGCHLD && handler == (RETSIGTYPE)SIG_IGN) + sigact.sa_flags |= SA_NOCLDWAIT; +#endif sigaction(signum, &sigact, 0); } #define ruby_signal(sig,handle) posix_signal((sig),(handle)) @@ -313,9 +320,6 @@ signal_exec(sig) #ifndef NT case SIGHUP: #endif -#ifdef SIGPIPE - case SIGPIPE: -#endif #ifdef SIGQUIT case SIGQUIT: #endif @@ -345,7 +349,7 @@ sighandle(sig) rb_bug("trap_handler: Bad signal %d", sig); } -#if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL) +#if !defined(BSD_SIGNAL) ruby_signal(sig, sighandle); #endif @@ -508,9 +512,6 @@ trap(arg) #endif #ifdef SIGUSR2 case SIGUSR2: -#endif -#ifdef SIGPIPE - case SIGPIPE: #endif func = sighandle; break; @@ -523,6 +524,11 @@ trap(arg) case SIGSEGV: func = sigsegv; break; +#endif +#ifdef SIGPIPE + case SIGPIPE: + func = SIG_IGN; + break; #endif } } @@ -614,9 +620,6 @@ Init_signal() #ifndef NT ruby_signal(SIGHUP, sighandle); #endif -#ifdef SIGPIPE - ruby_signal(SIGPIPE, sighandle); -#endif #ifdef SIGQUIT ruby_signal(SIGQUIT, sighandle); #endif @@ -636,5 +639,8 @@ Init_signal() #ifdef SIGSEGV ruby_signal(SIGSEGV, sigsegv); #endif +#ifdef SIGPIPE + ruby_signal(SIGPIPE, SIG_IGN); +#endif #endif /* MACOS_UNUSE_SIGNAL */ } -- cgit v1.2.3