summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--README.EXT3
-rw-r--r--README.EXT.ja7
-rw-r--r--class.c6
-rw-r--r--ext/socket/tcpserver.c8
5 files changed, 23 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 72f76513fe..df31271b1c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 := "&" ; イテレータブロックを取得するための
; 指定
--
diff --git a/class.c b/class.c
index 7ba47e4e26..a75a789ce9 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 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);
}
/*