summaryrefslogtreecommitdiff
path: root/ext/iconv/iconv.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-04-08 09:22:04 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-04-08 09:22:04 +0000
commit51c8d62bff1c86990f6a705df45b8335864ce311 (patch)
treea25f7469c6468ff739d8c71502cd5121be0b5d0b /ext/iconv/iconv.c
parent8586deca95eea4634ebb2cdc18487b0197d4b070 (diff)
* ext/iconv/iconv.c (iconv_s_list): return encoding list if no block
is given. [ruby-dev:23063] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6122 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/iconv/iconv.c')
-rw-r--r--ext/iconv/iconv.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c
index 096639abe1..e21f625fd4 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