79 #define VALUE2ICONV(v) ((iconv_t)((VALUE)(v) ^ -1))
80 #define ICONV2VALUE(c) ((VALUE)(c) ^ -1)
117 static VALUE iconv_try _((iconv_t
cd,
const char **inptr,
size_t *inlen,
char **outptr,
size_t *outlen));
150 const char *slash = memchr(ptr,
'/', pend - ptr);
152 if (slash && slash < pend - 1 && slash[1] ==
'/') {
187 #define rb_sys_fail(s) rb_iconv_sys_fail(s)
194 VALUE toenc = 0, fromenc = 0;
210 while ((cd = iconv_open(tocode, fromcode)) == (iconv_t)-1) {
239 const char *s = inval ?
"invalid encoding " :
"iconv";
253 if (toopt || fromopt) {
257 if (toopt && fromopt) {
258 rb_warning(
"encoding option isn't portable: %s, %s",
262 rb_warning(
"encoding option isn't portable: %s",
268 #ifdef ICONV_SET_TRANSLITERATE
271 rb_warning(
"encoding option isn't portable: transliterate");
272 if (iconvctl(cd, ICONV_SET_TRANSLITERATE, (
void *)&flag))
276 #ifdef ICONV_SET_DISCARD_ILSEQ
279 rb_warning(
"encoding option isn't portable: discard_ilseq");
280 if (iconvctl(cd, ICONV_SET_DISCARD_ILSEQ, (
void *)&flag))
295 #define ICONV_FREE iconv_dfree
316 iconv_try(iconv_t
cd,
const char **inptr,
size_t *inlen,
char **outptr,
size_t *outlen)
318 #ifdef ICONV_INPTR_CONST
319 #define ICONV_INPTR_CAST
321 #define ICONV_INPTR_CAST (char **)
327 if (ret == (
size_t)-1) {
344 else if (*inlen > 0) {
354 #define FAILED_MAXLEN 16
385 *(env->
argv) = failed;
395 error =
iconv_fail(error, success, failed, env, mesg);
422 const char *inptr, *instart;
429 if (cd == (iconv_t)-1)
437 outlen =
sizeof(buffer);
438 error =
iconv_try(cd, &inptr, &inlen, &outptr, &outlen);
449 else if (!
NIL_P(str)) {
465 if (length < 0 || length > start + slen)
466 length = slen - start;
473 const char *tmpstart = inptr;
475 outlen =
sizeof(buffer);
478 error =
iconv_try(cd, &inptr, &inlen, &outptr, &outlen);
481 #
if SIGNEDNESS_OF_SIZE_T < 0
484 outlen <=
sizeof(buffer)) {
485 outlen =
sizeof(buffer) - outlen;
487 outlen > (size_t)(inptr - tmpstart) ||
488 (outlen < (size_t)(inptr - tmpstart) && inlen > 0) ||
489 memcmp(buffer, tmpstart, outlen))
500 ret =
rb_str_new(instart, tmpstart - instart);
509 inptr = tmpstart + outlen;
514 sprintf(errmsg,
"bug?(output length = %ld)", (
long)(
sizeof(buffer) - outlen));
525 else if (inptr > instart) {
540 else if (!
NIL_P(rescue)) {
551 else if (inptr > instart) {
577 #ifdef ICONV_SET_TRANSLITERATE
585 #ifdef ICONV_SET_DISCARD_ILSEQ
595 if (strcmp(s,
"transliterate") == 0) {
596 #ifdef ICONV_SET_TRANSLITERATE
603 if (strcmp(s,
"discard_ilseq") == 0) {
604 #ifdef ICONV_SET_DISCARD_ILSEQ
623 if (!
NIL_P(options)) {
628 #define iconv_ctl(self, func, val) (\
629 iconvctl(VALUE2ICONV(check_iconv(self)), func, (void *)&(val)) ? \
630 rb_sys_fail(#func) : (void)0)
704 0, -1, env->
toidx, env);
705 env->append(env->
ret, s);
711 env->append(env->
ret, s);
743 arg.
argc = argc -= 2;
779 #ifdef HAVE_ICONVLIST
780 struct iconv_name_list
782 unsigned int namescount;
783 const char *
const *
names;
788 list_iconv_i(
VALUE ptr)
790 struct iconv_name_list *
p = (
struct iconv_name_list *)ptr;
791 unsigned int i, namescount = p->namescount;
792 const char *
const *
names = p->names;
795 for (i = 0; i < namescount; i++) {
805 list_iconv(
unsigned int namescount,
const char *
const *names,
void *data)
808 struct iconv_name_list
list;
810 list.namescount = namescount;
818 #if defined(HAVE_ICONVLIST) || defined(HAVE___ICONV_FREE_LIST)
822 #ifdef HAVE_ICONVLIST
827 iconvlist(list_iconv, args);
828 state = *(
int *)args;
830 if (args[1])
return args[1];
831 #elif defined(HAVE___ICONV_FREE_LIST)
836 if (__iconv_get_list(&list, &sz))
return Qnil;
839 for (i = 0; i < sz; i++) {
842 __iconv_free_list(list, sz);
853 #define iconv_s_list rb_f_notimplement
880 if (!cd)
return Qnil;
916 long start = 0, length = 0, slen = 0;
924 if (
NIL_P(n1) || ((start =
NUM2LONG(n1)) < 0 ? (start += slen) >= 0 : start < slen)) {
928 if (start > 0 || length > 0) {
933 start = (ps =
rb_enc_nth(s, e, start, enc)) - s;
973 #ifdef ICONV_TRIVIALP
984 iconv_ctl(
self, ICONV_TRIVIALP, trivial);
985 if (trivial)
return Qtrue;
989 #define iconv_trivialp rb_f_notimplement
992 #ifdef ICONV_GET_TRANSLITERATE
1003 iconv_ctl(
self, ICONV_GET_TRANSLITERATE, trans);
1004 if (trans)
return Qtrue;
1008 #define iconv_get_transliterate rb_f_notimplement
1011 #ifdef ICONV_SET_TRANSLITERATE
1022 iconv_ctl(
self, ICONV_SET_TRANSLITERATE, trans);
1026 #define iconv_set_transliterate rb_f_notimplement
1029 #ifdef ICONV_GET_DISCARD_ILSEQ
1040 iconv_ctl(
self, ICONV_GET_DISCARD_ILSEQ, dis);
1041 if (dis)
return Qtrue;
1045 #define iconv_get_discard_ilseq rb_f_notimplement
1048 #ifdef ICONV_SET_DISCARD_ILSEQ
1058 int dis =
RTEST(discard_ilseq);
1059 iconv_ctl(
self, ICONV_SET_DISCARD_ILSEQ, dis);
1063 #define iconv_set_discard_ilseq rb_f_notimplement
1076 #ifdef ICONV_TRIVIALP
1079 #ifdef ICONV_GET_TRANSLITERATE
1082 #ifdef ICONV_SET_TRANSLITERATE
1085 #ifdef ICONV_GET_DISCARD_ILSEQ
1088 #ifdef ICONV_SET_DISCARD_ILSEQ
1185 static const char message[] =
1186 ": iconv will be deprecated in the future, use String#encode instead.\n";
1192 if (strncmp(
RSTRING_PTR(s),
"<internal:", 10) != 0) {
1201 rb_str_cat(msg, message,
sizeof(message) - 1);
static VALUE iconv_conv(int argc, VALUE *argv, VALUE self)
#define RSTRING_LEN(string)
static long NUM2LONG(VALUE x)
#define iconv_ctl(self, func, val)
static VALUE rb_eIconvInvalidChar
RUBY_EXTERN VALUE rb_cData
static VALUE iconv_s_ctlmethods(VALUE klass)
VALUE rb_ary_new4(long n, const VALUE *elts)
VALUE rb_str_length(VALUE)
VALUE rb_ary_entry(VALUE ary, long offset)
VALUE rb_str_equal(VALUE str1, VALUE str2)
size_t strlen(const char *)
static VALUE rb_eIconvOutOfRange
static VALUE iconv_fail_retry(VALUE error, VALUE success, VALUE failed, struct iconv_env_t *env, const char *mesg)
static VALUE iconv_free(VALUE cd)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
VALUE rb_str_cat(VALUE, const char *, long)
#define rb_block_call(arg1, arg2, arg3, arg4, arg5, arg6)
static VALUE iconv_failure_inspect(VALUE self)
static nkf_char(* iconv)(nkf_char c2, nkf_char c1, nkf_char c0)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rb_str_concat(VALUE, VALUE)
VALUE rb_str_plus(VALUE, VALUE)
VALUE rb_protect(VALUE(*proc)(VALUE), VALUE data, int *state)
#define RSTRING_PTR(string)
static VALUE iconv_s_conv(VALUE self, VALUE to, VALUE from, VALUE str)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
void rb_raise(VALUE exc, const char *fmt,...)
static iconv_t iconv_create(VALUE to, VALUE from, struct rb_iconv_opt_t *opt, int *idx)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
static VALUE iconv_iconv(int argc, VALUE *argv, VALUE self)
#define RARRAY_LEN(ARRAY)
VALUE rb_ary_new3(long n,...)
void rb_include_module(VALUE klass, VALUE module)
VALUE rb_range_beg_len(VALUE, long *, long *, long, int)
void rb_gc_register_address(VALUE *addr)
static VALUE strip_glibc_option(VALUE *code)
NORETURN(static void rb_iconv_sys_fail(const char *s))
static VALUE iconv_finish(VALUE self)
VALUE rb_str_buf_append(VALUE, VALUE)
static VALUE iconv_s_open(int argc, VALUE *argv, VALUE self)
static ID id_transliterate
static VALUE iconv_failure_failed(VALUE self)
char * rb_enc_nth(const char *, const char *, long, rb_encoding *)
VALUE rb_str_buf_cat(VALUE, const char *, long)
static const signed char trans[][0x100]
#define Data_Wrap_Struct(klass, mark, free, sval)
void rb_exc_raise(VALUE mesg)
static VALUE rb_eIconvIllegalSeq
VALUE rb_class_new_instance(int, VALUE *, VALUE)
static VALUE iconv_convert(iconv_t cd, VALUE str, long start, long length, int toidx, struct iconv_env_t *env)
int rb_block_given_p(void)
VALUE rb_str_substr(VALUE, long, long)
VALUE rb_str_cat2(VALUE, const char *)
VALUE rb_str_buf_cat2(VALUE, const char *)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
static ID id_discard_ilseq
#define iconv_set_transliterate
VALUE rb_enc_associate_index(VALUE obj, int idx)
static VALUE rb_eIconvFailure
VALUE rb_make_backtrace(void)
VALUE rb_str_resize(VALUE, long)
#define iconv_set_discard_ilseq
static void rb_iconv_sys_fail(const char *s)
VALUE rb_str_subseq(VALUE, long, long)
static VALUE get_iconv_opt_i(VALUE i, VALUE arg)
VALUE rb_funcall2(VALUE, ID, int, const VALUE *)
Calls a method.
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_ivar_set(VALUE, ID, VALUE)
static int options(unsigned char *cp)
static VALUE iconv_try(iconv_t cd, const char **inptr, size_t *inlen, char **outptr, size_t *outlen)
const char * rb_class2name(VALUE)
static VALUE iconv_s_convert(struct iconv_env_t *env)
register unsigned int len
VALUE rb_call_super(int, const VALUE *)
#define RARRAY_PTR(ARRAY)
VALUE rb_ensure(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*e_proc)(ANYARGS), VALUE data2)
VALUE rb_str_new_cstr(const char *)
int memcmp(const void *s1, const void *s2, size_t len)
void rb_jump_tag(int tag)
static VALUE iconv_initialize(int argc, VALUE *argv, VALUE self)
VALUE rb_define_module_under(VALUE outer, const char *name)
#define StringValueCStr(v)
static VALUE charset_map_get(void)
#define ENCODING_GET(obj)
rb_encoding * rb_enc_get(VALUE obj)
static VALUE iconv_s_iconv(int argc, VALUE *argv, VALUE self)
RUBY_EXTERN VALUE rb_stderr
static VALUE iconv_fail(VALUE error, VALUE success, VALUE failed, struct iconv_env_t *env, const char *mesg)
void rb_set_errinfo(VALUE err)
static VALUE rb_eIconvBrokenLibrary
#define iconv_get_transliterate
#define iconv_get_discard_ilseq
#define rb_str_set_len(str, length)
struct rb_encoding_entry * list
static VALUE iconv_failure_initialize(VALUE error, VALUE mesg, VALUE success, VALUE failed)
VALUE rb_io_puts(int, VALUE *, VALUE)
static VALUE iconv_s_allocate(VALUE klass)
void rb_notimplement(void)
VALUE rb_ary_new2(long capa)
static VALUE rb_eIconvInvalidEncoding
static VALUE rb_str_derive(VALUE str, const char *ptr, long len)
#define StringValuePtr(v)
static VALUE iconv_failure_success(VALUE self)
static char * map_charset(VALUE *code)
void rb_warning(const char *fmt,...)
int rb_enc_find_index(const char *name)
static void warn_deprecated(void)
static VALUE iconv_init_state(VALUE self)
static VALUE check_iconv(VALUE obj)
VALUE append _((VALUE, VALUE))
static void iconv_dfree(void *cd)
#define ENCODING_SET(obj, i)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_str_append(VALUE, VALUE)
VALUE rb_str_new2(const char *)
static void get_iconv_opt(struct rb_iconv_opt_t *opt, VALUE options)
VALUE rb_attr_get(VALUE, ID)
VALUE rb_str_new(const char *, long)