readline.c: str_subpos
* ext/readline/readline.c (str_subpos): make string instance only if necessary. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56820 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
998d1c6c30
commit
d3d9903dc2
@ -686,6 +686,16 @@ readline_s_insert_text(VALUE self, VALUE str)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_RL_DELETE_TEXT)
|
#if defined(HAVE_RL_DELETE_TEXT)
|
||||||
|
static const char *
|
||||||
|
str_subpos(const char *ptr, const char *end, long beg, long *sublen, rb_encoding *enc)
|
||||||
|
{
|
||||||
|
VALUE str = rb_enc_str_new_static(ptr, end-ptr, enc);
|
||||||
|
OBJ_FREEZE(str);
|
||||||
|
ptr = rb_str_subpos(str, beg, sublen);
|
||||||
|
rb_gc_force_recycle(str);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* Readline.delete_text([start[, length]]) -> self
|
* Readline.delete_text([start[, length]]) -> self
|
||||||
@ -703,20 +713,20 @@ readline_s_delete_text(int argc, VALUE *argv, VALUE self)
|
|||||||
{
|
{
|
||||||
rb_check_arity(argc, 0, 2);
|
rb_check_arity(argc, 0, 2);
|
||||||
if (rl_line_buffer) {
|
if (rl_line_buffer) {
|
||||||
char *p, *ptr = rl_line_buffer;
|
const char *p, *ptr = rl_line_buffer;
|
||||||
long beg = 0, len = strlen(rl_line_buffer);
|
long beg = 0, len = strlen(ptr);
|
||||||
VALUE str = rb_enc_str_new_static(ptr, len, rb_locale_encoding());
|
const char *end = ptr + len;
|
||||||
OBJ_FREEZE(str);
|
rb_encoding *enc = rb_locale_encoding();
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
beg = NUM2LONG(argv[0]);
|
beg = NUM2LONG(argv[0]);
|
||||||
len = NUM2LONG(argv[1]);
|
len = NUM2LONG(argv[1]);
|
||||||
num_pos:
|
num_pos:
|
||||||
p = rb_str_subpos(str, beg, &len);
|
p = str_subpos(ptr, end, beg, &len, enc);
|
||||||
if (!p) rb_raise(rb_eArgError, "invalid index");
|
if (!p) rb_raise(rb_eArgError, "invalid index");
|
||||||
beg = p - ptr;
|
beg = p - ptr;
|
||||||
}
|
}
|
||||||
else if (argc == 1) {
|
else if (argc == 1) {
|
||||||
len = rb_str_strlen(str);
|
len = rb_enc_strlen(ptr, ptr + len, enc);
|
||||||
if (!rb_range_beg_len(argv[0], &beg, &len, len, 1)) {
|
if (!rb_range_beg_len(argv[0], &beg, &len, len, 1)) {
|
||||||
beg = NUM2LONG(argv[0]);
|
beg = NUM2LONG(argv[0]);
|
||||||
goto num_pos;
|
goto num_pos;
|
||||||
@ -2081,3 +2091,9 @@ Init_readline(void)
|
|||||||
rb_gc_register_address(&readline_instream);
|
rb_gc_register_address(&readline_instream);
|
||||||
rb_gc_register_address(&readline_outstream);
|
rb_gc_register_address(&readline_outstream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local variables:
|
||||||
|
* indent-tabs-mode: nil
|
||||||
|
* end:
|
||||||
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user