diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index e8ea2c3ab..6480e4a78 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -1359,6 +1359,29 @@ str_b(mrb_state *mrb, mrb_value self) return str; } +static mrb_value +str_force_encoding(mrb_state *mrb, mrb_value self) +{ + mrb_value enc; + + mrb_get_args(mrb, "S", &enc); + + struct RString *s = mrb_str_ptr(self); + if (ENC_COMP_P(enc, ENC_ASCII_8BIT) || + ENC_COMP_P(enc, ENC_BINARY)) { + s->flags |= MRB_STR_BINARY; + } +#ifdef MRB_UTF8_STRING + else if (ENC_COMP_P(enc, ENC_UTF8)) { + s->flags &= ~MRB_STR_BINARY; + } +#endif + else { + mrb_raisef(mrb, E_ARGUMENT_ERROR, "unknown encoding name - %v", enc); + } + return self; +} + void mrb_mruby_string_ext_gem_init(mrb_state* mrb) { @@ -1400,6 +1423,7 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb) mrb_define_method_id(mrb, s, MRB_SYM_Q(valid_encoding), str_valid_enc_p, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_SYM_Q(ascii_only), str_ascii_only_p, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_SYM(b), str_b, MRB_ARGS_NONE()); + mrb_define_method_id(mrb, s, MRB_SYM(force_encoding), str_force_encoding, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, s, MRB_SYM(__lines), str_lines, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_SYM(__codepoints), str_codepoints, MRB_ARGS_NONE());