diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-05 16:04:12 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-05 16:04:12 +0000 |
commit | f8748a181f809613b5a4e2100dbe5ac9216fdf80 (patch) | |
tree | 1fc393178f422fa21d2187d10164d7cf4c1782b4 /ext/iconv | |
parent | 36d9fbafe2996e9ba00d4fa8d826cf8aede69a9d (diff) | |
download | ruby-f8748a181f809613b5a4e2100dbe5ac9216fdf80.tar.gz ruby-f8748a181f809613b5a4e2100dbe5ac9216fdf80.tar.xz ruby-f8748a181f809613b5a4e2100dbe5ac9216fdf80.zip |
* ext/iconv/iconv.c (iconv_s_list): support NetBSD/Citrus iconv.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@14115 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/iconv')
-rw-r--r-- | ext/iconv/extconf.rb | 1 | ||||
-rw-r--r-- | ext/iconv/iconv.c | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/ext/iconv/extconf.rb b/ext/iconv/extconf.rb index 6e2339684..9632bf4db 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 844b79220..fbbca7e3b 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 |