justdoit149 / NJUSE-OS

(南京大学软件学院)计算机操作系统LAB
0 stars 0 forks source link

A bug in kernel/console.c #1

Open newclea opened 3 months ago

newclea commented 3 months ago
PUBLIC void findmodel(CONSOLE *p_con)
{                                                          // 搜索并标红
    u8 *p = (u8 *)(V_MEM_BASE + p_con->original_addr * 2); // 起始位置
    u8 *p_vmem = (u8 *)(V_MEM_BASE + p_con->cursor * 2);   // 当前显示地址的pos
    while (p < ESC_start_pos)
    {//搜索范围:从开头到开始ESC的位置。
        int same = 1;
        int len = p_vmem - ESC_start_pos;
        for(int i = 0; i < len; i += 2)
        {
            if (*(p + i) != *(ESC_start_pos + i))
            {
                same = 0;
                break;
            }
        }
        if (same)
        {//能匹配上,则从当前位置开始,把能匹配上的位置标红,同时向前推进指针
            for (int i = 0; i < len; i += 2, p = p + 2)
            {
                if (*p != '\t')
                {
                    *(p + 1) = DEFAULT_REDCHAR_COLOR;
                }
            }
        }
        else
        {//匹配不上,则指针向前推进,继续检查匹配情况。
            p = p + 2;
        }
    }
}

首先感谢你的分享,让我有了自己的思路。 在这里标注一个可能出现的bug(虽然不确定会不会有这样的样例) 上面这段代码,当进入搜索模式后直接按回车会无限循环,无法再退出,可以参考以下修改

    u8 *p_vmem = (u8 *)(V_MEM_BASE + p_con->cursor * 2);   // 当前显示地址的pos
    int len = p_vmem - ESC_start_pos;
    while (p < ESC_start_pos && len > 0)
    {//搜索范围:从开头到开始ESC的位置。
        int same = 1;
        for(int i = 0; i < len; i += 2)
        {
justdoit149 commented 3 months ago

非常感谢你的建议,确实是我考虑不周,已修改。祝学业顺利!