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;
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 628 #define iconv_ctl(self, func, val) (\ 629 iconvctl(VALUE2ICONV(check_iconv(self)), func, (void *)&(val)) ? \ 630 rb_sys_fail(#func) : (void)0) 702 for (;
env->argc > 0; --
env->argc, ++
env->argv) {
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);
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 1008 #define iconv_get_transliterate rb_f_notimplement 1011 #ifdef ICONV_SET_TRANSLITERATE 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) {
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.
static VALUE iconv_fail _((VALUE error, VALUE success, VALUE failed, struct iconv_env_t *env, const char *mesg))
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)
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 *)
static nkf_char(* iconv)(nkf_char c2, nkf_char c1, nkf_char c0)
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)