summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-05 16:04:12 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-05 16:04:12 +0000
commit46d6af3a9ca883ac2b68f11f8e2ad23e494510be (patch)
tree1fc393178f422fa21d2187d10164d7cf4c1782b4 /ext
parent360a674fe5ae9f03a8ef4c1a425808069b8a9510 (diff)
* ext/iconv/iconv.c (iconv_s_list): support NetBSD/Citrus iconv.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14115 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/iconv/extconf.rb1
-rw-r--r--ext/iconv/iconv.c18
2 files changed, 19 insertions, 0 deletions
diff --git a/ext/iconv/extconf.rb b/ext/iconv/extconf.rb
index 6e23396843..9632bf4db9 100644
--- a/ext/iconv/extconf.rb
+++ b/ext/iconv/extconf.rb
@@ -24,6 +24,7 @@ if have_func("iconv", "iconv.h") or
$defs.push('-DICONV_INPTR_CONST')
end
have_func("iconvlist", "iconv.h")
+ have_func("__iconv_free_list", "iconv.h")
if conf
prefix = '$(srcdir)'
prefix = $nmake ? "{#{prefix}}" : "#{prefix}/"
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c
index 844b792208..fbbca7e3b9 100644
--- a/ext/iconv/iconv.c
+++ b/ext/iconv/iconv.c
@@ -741,6 +741,24 @@ iconv_s_list(void)
state = *(int *)args;
if (state) rb_jump_tag(state);
if (args[1]) return args[1];
+#elif defined(HAVE___ICONV_FREE_LIST)
+ char **list;
+ size_t sz, i;
+ VALUE ary;
+
+ if (__iconv_get_list(&list, &sz)) return Qnil;
+
+ ary = rb_ary_new2(sz);
+ for (i = 0; i < sz; i++) {
+ rb_ary_push(ary, rb_str_new2(list[i]));
+ }
+ __iconv_free_list(list, sz);
+
+ if (!rb_block_given_p())
+ return ary;
+ for (i = 0; i < RARRAY_LEN(ary); i++) {
+ rb_yield(RARRAY_PTR(ary)[i]);
+ }
#else
rb_notimplement();
#endif