diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-04-08 09:22:04 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-04-08 09:22:04 +0000 |
commit | 1fbd9ee89ea5217e6074802c57a84d69c2e856ee (patch) | |
tree | a25f7469c6468ff739d8c71502cd5121be0b5d0b /ext | |
parent | 8d4fa5fe9edeb9ec7ae811407c9738d402a6dee0 (diff) | |
download | ruby-1fbd9ee89ea5217e6074802c57a84d69c2e856ee.tar.gz ruby-1fbd9ee89ea5217e6074802c57a84d69c2e856ee.tar.xz ruby-1fbd9ee89ea5217e6074802c57a84d69c2e856ee.zip |
* ext/iconv/iconv.c (iconv_s_list): return encoding list if no block
is given. [ruby-dev:23063]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@6122 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/iconv/iconv.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c index 096639abe..e21f625fd 100644 --- a/ext/iconv/iconv.c +++ b/ext/iconv/iconv.c @@ -650,6 +650,7 @@ iconv_s_conv struct iconv_name_list { unsigned int namescount; const char *const *names; + VALUE array; }; static VALUE @@ -669,6 +670,9 @@ list_iconv_i for (i = 0; i < namescount; i++) { rb_ary_push(ary, rb_str_new2(names[i])); } + if (p->array) { + return rb_ary_push(p->array, ary); + } return rb_yield(ary); } @@ -688,6 +692,7 @@ list_iconv list.namescount = namescount; list.names = names; + list.array = ((VALUE *)data)[1]; rb_protect(list_iconv_i, (VALUE)&list, state); return *state; } @@ -697,8 +702,14 @@ static VALUE iconv_s_list _((void)) { #ifdef HAVE_ICONVLIST - int state = 0; - iconvlist(list_iconv, &state); + int state; + VALUE args[2]; + + args[1] = rb_block_given_p() ? 0 : rb_ary_new(); + iconvlist(list_iconv, args); + state = *(int *)args; + if (state) rb_jump_tag(state); + if (args[1]) return args[1]; #else rb_notimplement(); #endif |