linux-0.11调试教程,rl_insert_text函数和the_line[]数组

rl_dispatch()
    rl_insert()
        rl_insert_text()

rl_display()

    update_line()


KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {

...

  { ISFUNC, rl_insert },    /* a */

...
};



下面是rl_insert_text()函数之前的rl_point和rl_end的值和rl_insert_text()函数之后rl_point和rl_end的值

还有之后the_line[]数组的变化。

下面update_line()处下断点的情形,0x17:0x6340c是参数old,0x17:0x59c0c是参数new。


static
update_line (old, new, current_line)
     register char *old, *new;
     int current_line;
{


实际上是visible_line的地址和invisible_line的地址。

rl_redisplay ()
{

...

      for (linenum = 0; linenum <= inv_botlin; linenum++)
        update_line (linenum > vis_botlin ? ""
             : &visible_line[linenum * screenwidth],
             &invisible_line[linenum * screenwidth],
             linenum);

...

}



rl_redisplay ()
{

...

  strncpy (line + out,  prompt_this_line, strlen (prompt_this_line));

...

}


下面是strncpy()断点处的情况,提示符是9个字符:[/root]# 

linux-0.11调试教程,rl_insert_text函数和the_line[]数组_第1张图片

rl_redisplay ()
{

  register char *line = invisible_line;

...

  for (in = 0; in < rl_end; in++)
    {
 


    }


...

}


这里的for循环是把the_line[]数组的内容拷贝到line[]数组中,既invisible_line[]数组中。

the_line[]数组的内容就是提示符之后的内容。

invisible_line[]数组是当前的内容,既提示符的内容和the_line[]数组的内容之和。

visible_line[]数组是上次的invisible_line[]数组因为redisplay()函数最后会交换invisible_linevisible_line的值

第一块是[/root]# abc  按下d键时,update_line()处下断点时的情形

第一块是[/root]# abcd    按下e键时,update_line()处下断点时的情形

linux-0.11调试教程,rl_insert_text函数和the_line[]数组_第2张图片


visible_line[]数组:屏幕上看到的东西对应的内容

invisible_line[]数组:改变之后的内容,比如按下字符键。

你可能感兴趣的:(linux-0.11调试教程,rl_insert_text函数和the_line[]数组)