rb_encoding* rb_nkf_enc_get(const char *name) { #if 0 int idx = rb_enc_find_index(name); if (idx < 0) { nkf_encoding *nkf_enc = nkf_enc_find(name); idx = rb_enc_find_index(nkf_enc_name(nkf_enc_to_base_encoding(nkf_enc))); if (idx < 0) { idx = rb_define_dummy_encoding(name); } else { rb_encoding *rb_enc = rb_enc_from_index(idx); idx = rb_enc_replicate(name, rb_enc); } } return rb_enc_from_index(idx); #else struct nkf_osx_name_enc_table { const char* name; CFStringEncoding enc; }; static struct nkf_osx_name_enc_table table[] = { { "BINARY", kCFStringEncodingNonLossyASCII }, { "US-ASCII", kCFStringEncodingASCII }, { "ISO-2022-JP", kCFStringEncodingISO_2022_JP }, { "ISO-2022-JP-1", kCFStringEncodingISO_2022_JP_1 }, { "ISO-2022-JP-2", kCFStringEncodingISO_2022_JP_2 }, { "ISO-2022-JP-3", kCFStringEncodingISO_2022_JP_3 }, { "EUC-JP", kCFStringEncodingEUC_JP }, { "Shift_JIS", kCFStringEncodingShiftJIS }, { "UTF-8", kCFStringEncodingUTF8 }, { "UTF-16", kCFStringEncodingUTF16 }, { "UTF-16BE", kCFStringEncodingUTF16BE }, { "UTF-16LE", kCFStringEncodingUTF16LE }, { "UTF-32", kCFStringEncodingUTF32 }, { "UTF-32BE", kCFStringEncodingUTF32BE }, { "UTF-32LE", kCFStringEncodingUTF32LE }, { NULL, kCFStringEncodingNonLossyASCII } }; struct nkf_osx_name_enc_table* ptr = table; while (ptr->name) { if (strcmp(name, ptr->name) == 0) return &(ptr->enc); ptr++; } return &(ptr->enc); #endif }
rb_encoding* rb_nkf_enc_get(const char *name) { int idx = rb_enc_find_index(name); if (idx < 0) { nkf_encoding *nkf_enc = nkf_enc_find(name); idx = rb_enc_find_index(nkf_enc_name(nkf_enc_to_base_encoding(nkf_enc))); if (idx < 0) { idx = rb_define_dummy_encoding(name); } else { rb_encoding *rb_enc = rb_enc_from_index(idx); idx = rb_enc_replicate(name, rb_enc); } } return rb_enc_from_index(idx); }
static VALUE rb_nkf_convert(VALUE obj, VALUE opt, VALUE src) { reinit(); StringValue(opt); nkf_split_options(RSTRING_PTR(opt)); if (!output_encoding) rb_raise(rb_eArgError, "no output encoding given"); switch (nkf_enc_to_index(output_encoding)) { case UTF_8_BOM: output_encoding = nkf_enc_from_index(UTF_8); break; case UTF_16BE_BOM: output_encoding = nkf_enc_from_index(UTF_16BE); break; case UTF_16LE_BOM: output_encoding = nkf_enc_from_index(UTF_16LE); break; case UTF_32BE_BOM: output_encoding = nkf_enc_from_index(UTF_32BE); break; case UTF_32LE_BOM: output_encoding = nkf_enc_from_index(UTF_32LE); break; } output_bom_f = FALSE; incsize = INCSIZE; input_ctr = 0; StringValue(src); input = (unsigned char *)RSTRING_PTR(src); i_len = RSTRING_LEN(src); result = rb_str_new(0, i_len*3 + 10); output_ctr = 0; output = (unsigned char *)RSTRING_PTR(result); o_len = RSTRING_LEN(result); *output = '\0'; kanji_convert(NULL); rb_str_set_len(result, output_ctr); OBJ_INFECT(result, src); rb_enc_associate(result, rb_nkf_enc_get(nkf_enc_name(output_encoding))); return result; }