static int enc_register_at(int index, const char *name, rb_encoding *encoding) { struct rb_encoding_entry *ent = &enc_table.list[index]; VALUE list; if (!valid_encoding_name_p(name)) return -1; if (!ent->name) { ent->name = name = strdup(name); } else if (STRCASECMP(name, ent->name)) { return -1; } if (!ent->enc) { ent->enc = xmalloc(sizeof(rb_encoding)); } if (encoding) { *ent->enc = *encoding; } else { memset(ent->enc, 0, sizeof(*ent->enc)); } encoding = ent->enc; encoding->name = name; encoding->ruby_encoding_index = index; st_insert(enc_table.names, (st_data_t)name, (st_data_t)index); list = rb_encoding_list; if (list && NIL_P(rb_ary_entry(list, index))) { /* initialize encoding data */ rb_ary_store(list, index, enc_new(encoding)); } return index; }
ERL_NIF_TERM encode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { jiffy_st* st = (jiffy_st*) enif_priv_data(env); Encoder* e; ERL_NIF_TERM opts; ERL_NIF_TERM val; ERL_NIF_TERM tmp_argv[3]; if(argc != 2) { return enif_make_badarg(env); } e = enc_new(env); if(e == NULL) { return make_error(st, env, "internal_error"); } tmp_argv[0] = enif_make_resource(env, e); tmp_argv[1] = enif_make_list(env, 1, argv[0]); tmp_argv[2] = enif_make_list(env, 0); enif_release_resource(e); opts = argv[1]; if(!enif_is_list(env, opts)) { return enif_make_badarg(env); } while(enif_get_list_cell(env, opts, &val, &opts)) { if(enif_compare(val, e->atoms->atom_uescape) == 0) { e->uescape = 1; } else if(enif_compare(val, e->atoms->atom_pretty) == 0) { e->pretty = 1; } else if(enif_compare(val, e->atoms->atom_escape_forward_slashes) == 0) { e->escape_forward_slashes = 1; } else if(enif_compare(val, e->atoms->atom_use_nil) == 0) { e->use_nil = 1; } else if(enif_compare(val, e->atoms->atom_force_utf8) == 0) { // Ignore, handled in Erlang } else if(get_bytes_per_iter(env, val, &(e->bytes_per_red))) { continue; } else if(get_bytes_per_red(env, val, &(e->bytes_per_red))) { continue; } else { return enif_make_badarg(env); } } return encode_iter(env, 3, tmp_argv); }
static int enc_register_at(mrb_state *mrb, int index, const char *name, mrb_encoding *encoding) { struct mrb_encoding_entry *ent = &enc_table.list[index]; mrb_value list; mrb_value ref_ary; if (!valid_encoding_name_p(name)) return -1; if (!ent->name) { ent->name = name = strdup(name); } else if (STRCASECMP(name, ent->name)) { return -1; } if (!ent->enc) { ent->enc = xmalloc(sizeof(mrb_encoding)); } if (encoding) { *ent->enc = *encoding; } else { memset(ent->enc, 0, sizeof(*ent->enc)); } encoding = ent->enc; encoding->name = name; encoding->ruby_encoding_index = index; st_insert(enc_table.names, (st_data_t)name, (st_data_t)index); list = mrb_encoding_list; //if (list && mrb_nil_p((mrb_ary_ref(mrb, list, index)))) { if (list.tt) { ref_ary = mrb_ary_ref(mrb, list, index); if mrb_nil_p(ref_ary) { /* initialize encoding data */ mrb_ary_set(mrb, list, index, enc_new(mrb, encoding));//rb_ary_store(list, index, enc_new(encoding)); } }