diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | README.EXT | 3 | ||||
-rw-r--r-- | README.EXT.ja | 7 | ||||
-rw-r--r-- | class.c | 6 | ||||
-rw-r--r-- | ext/socket/tcpserver.c | 8 |
5 files changed, 23 insertions, 9 deletions
@@ -1,3 +1,11 @@ +Wed Feb 25 00:41:21 2009 Akinori MUSHA <knu@iDaemons.org> + + * class.c (rb_scan_args): Allow specifying the number of trailing + mandatory arguments right after the number of optional arguments + only if the number of leading mandatory arguments is not omitted. + + * ext/socket/tcpserver.c (tcp_svr_init): Make use of it. + Wed Feb 25 00:15:15 2009 Yukihiro Matsumoto <matz@ruby-lang.org> * ext/curses/curses.c (curses_colors): new method added. a patch diff --git a/README.EXT b/README.EXT index 6844947fc9..e5760c184a 100644 --- a/README.EXT +++ b/README.EXT @@ -1081,9 +1081,10 @@ as follows: -- scan-arg-spec := param-arg-spec [block-arg-spec] -param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec +param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec / pre-opt-post-arg-spec pre-arg-spec := num-of-leading-mandatory-args [num-of-optional-args] post-arg-spec := sym-for-variable-length-args [num-of-trailing-mandatory-args] +pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args num-of-trailing-mandatory-args block-arg-spec := sym-for-block-arg num-of-leading-mandatory-args := DIGIT ; The number of leading diff --git a/README.EXT.ja b/README.EXT.ja index 42f35249c0..c4fd7dab4b 100644 --- a/README.EXT.ja +++ b/README.EXT.ja @@ -1180,16 +1180,17 @@ rb_scan_args(int argc, VALUE *argv, const char *fmt, ...) -- scan-arg-spec := param-arg-spec [block-arg-spec] -param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec +param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec / pre-opt-post-arg-spec pre-arg-spec := num-of-leading-mandatory-args [num-of-optional-args] post-arg-spec := sym-for-variable-length-args [num-of-trailing-mandatory-args] +pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args num-of-trailing-mandatory-args block-arg-spec := sym-for-block-arg -num-of-leading-mandatory-args := DIGIT ; 先頭に置かれる省略不可能な引数の数 +num-of-leading-mandatory-args := DIGIT ; 先頭に置かれる省略不能な引数の数 num-of-optional-args := DIGIT ; 続いて置かれる省略可能な引数の数 sym-for-variable-length-args := "*" ; 続いて置かれる可変長引数を ; Rubyの配列で取得するための指定 -num-of-trailing-mandatory-args := DIGIT ; 終端に置かれる省略不可能な引数の数 +num-of-trailing-mandatory-args := DIGIT ; 終端に置かれる省略不能な引数の数 sym-for-block-arg := "&" ; イテレータブロックを取得するための ; 指定 -- @@ -934,6 +934,11 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...) if (ISDIGIT(*p)) { n_opt = *p - '0'; p++; + if (ISDIGIT(*p)) { + n_trail = *p - '0'; + p++; + goto block_arg; + } } } if (*p == '*') { @@ -944,6 +949,7 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...) p++; } } + block_arg: if (*p == '&') { f_block = 1; p++; diff --git a/ext/socket/tcpserver.c b/ext/socket/tcpserver.c index 85020c4bc1..111babd274 100644 --- a/ext/socket/tcpserver.c +++ b/ext/socket/tcpserver.c @@ -26,12 +26,10 @@ static VALUE tcp_svr_init(int argc, VALUE *argv, VALUE sock) { - VALUE arg1, arg2; + VALUE hostname, port; - if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) - return init_inetsock(sock, arg1, arg2, Qnil, Qnil, INET_SERVER); - else - return init_inetsock(sock, Qnil, arg1, Qnil, Qnil, INET_SERVER); + rb_scan_args(argc, argv, "011", &hostname, &port); + return init_inetsock(sock, hostname, port, Qnil, Qnil, INET_SERVER); } /* |