From 70475e65416b72cc4d34f9bc343801f88606492e Mon Sep 17 00:00:00 2001 From: knu Date: Tue, 24 Feb 2009 15:41:39 +0000 Subject: * 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. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@22603 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ README.EXT | 3 ++- README.EXT.ja | 7 ++++--- class.c | 6 ++++++ ext/socket/tcpserver.c | 8 +++----- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 72f76513f..df31271b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed Feb 25 00:41:21 2009 Akinori MUSHA + + * 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 * ext/curses/curses.c (curses_colors): new method added. a patch diff --git a/README.EXT b/README.EXT index 6844947fc..e5760c184 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 42f35249c..c4fd7dab4 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 := "&" ; イテレータブロックを取得するための ; 指定 -- diff --git a/class.c b/class.c index 7ba47e4e2..a75a789ce 100644 --- a/class.c +++ b/class.c @@ -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 85020c4bc..111babd27 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); } /* -- cgit