Linux VI编辑器中搜索功能背后的算法是什么
即使当我打开一个新文件时,search命令的运行速度也非常快,即使是在一个非常大的文件上? 用于实现它的算法是什么Linux VI编辑器中搜索功能背后的算法是什么,linux,vi,Linux,Vi,即使当我打开一个新文件时,search命令的运行速度也非常快,即使是在一个非常大的文件上? 用于实现它的算法是什么 我只是好奇?这只是您常规的正则表达式实现 首先,将模式编译成正则表达式(vim_regcomp) 接下来,使用vim_regexec{u multi,{u nl,{u both}执行它。它通过一步一步地处理各种原子来实现(有一个明确的回溯堆栈) 现在,正则表达式的叶节点仅由以下函数处理 vim\u strbyte vim\u strchr cstrhr;作为一个例子,这说明了实现
我只是好奇?这只是您常规的正则表达式实现 首先,将模式编译成正则表达式(
vim_regcomp
)
接下来,使用vim_regexec{u multi,{u nl,{u both}
执行它。它通过一步一步地处理各种原子来实现(有一个明确的回溯堆栈)
现在,正则表达式的叶节点仅由以下函数处理
vim\u strbyte
vim\u strchr
;作为一个例子,这说明了实现是多么的“简单”(特别是,如果你看一个更简单的例子,没有定义cstrhr
)FEAT_MBYTE
- 涉及regex实现(因为它支持许多特性,比如Unicode大小写折叠)
中的实现运行5966 LoC(7652包括注释和空格)src/regexp.c
grep
的源代码,而不是…:)
所有计数都基于debian软件包归档中的vim-7.3.547,这只是您的常规正则表达式实现 首先,将模式编译成正则表达式(
vim_regcomp
)
接下来,使用vim_regexec{u multi,{u nl,{u both}
执行它。它通过一步一步地处理各种原子来实现(有一个明确的回溯堆栈)
现在,正则表达式的叶节点仅由以下函数处理
vim\u strbyte
vim\u strchr
;作为一个例子,这说明了实现是多么的“简单”(特别是,如果你看一个更简单的例子,没有定义cstrhr
)FEAT_MBYTE
- 涉及regex实现(因为它支持许多特性,比如Unicode大小写折叠)
中的实现运行5966 LoC(7652包括注释和空格)src/regexp.c
grep
的源代码,而不是…:)
所有计数基于debian软件包归档中的vim-7.3.547
/*
* cstrchr: This function is used a lot for simple searches, keep it fast!
*/
static char_u *
cstrchr(s, c)
char_u *s;
int c;
{
char_u *p;
int cc;
if (!ireg_ic
#ifdef FEAT_MBYTE
|| (!enc_utf8 && mb_char2len(c) > 1)
#endif
)
return vim_strchr(s, c);
/* tolower() and toupper() can be slow, comparing twice should be a lot
* faster (esp. when using MS Visual C++!).
* For UTF-8 need to use folded case. */
#ifdef FEAT_MBYTE
if (enc_utf8 && c > 0x80)
cc = utf_fold(c);
else
#endif
if (MB_ISUPPER(c))
cc = MB_TOLOWER(c);
else if (MB_ISLOWER(c))
cc = MB_TOUPPER(c);
else
return vim_strchr(s, c);
#ifdef FEAT_MBYTE
if (has_mbyte)
{
for (p = s; *p != NUL; p += (*mb_ptr2len)(p))
{
if (enc_utf8 && c > 0x80)
{
if (utf_fold(utf_ptr2char(p)) == cc)
return p;
}
else if (*p == c || *p == cc)
return p;
}
}
else
#endif
/* Faster version for when there are no multi-byte characters. */
for (p = s; *p != NUL; ++p)
if (*p == c || *p == cc)
return p;
return NULL;
}