diff options
| author | Adam Harrison <adamdharrison@gmail.com> | 2021-11-07 14:04:42 -0500 |
|---|---|---|
| committer | Adam Harrison <adamdharrison@gmail.com> | 2021-11-07 14:04:42 -0500 |
| commit | a184ec9cc326d3ced15b080d2d38ff8d2aed2a7b (patch) | |
| tree | a2ee6a5d1029f2cba82cc90c3269e74c4571698d | |
| parent | c1a5e6e16dae713fe7c61921c9faeacb83b754ea (diff) | |
| download | lite-xl-a184ec9cc326d3ced15b080d2d38ff8d2aed2a7b.tar.gz lite-xl-a184ec9cc326d3ced15b080d2d38ff8d2aed2a7b.zip | |
Improved heuristic to pay more attention to string length.
| -rw-r--r-- | src/api/system.c | 60 |
1 files changed, 18 insertions, 42 deletions
diff --git a/src/api/system.c b/src/api/system.c index bcd1b997..85d0db2a 100644 --- a/src/api/system.c +++ b/src/api/system.c @@ -591,56 +591,32 @@ static int f_exec(lua_State *L) { return 0; } - static int f_fuzzy_match(lua_State *L) { size_t strLen, ptnLen; const char *str = luaL_checklstring(L, 1, &strLen); const char *ptn = luaL_checklstring(L, 2, &ptnLen); - bool files = false; - if (lua_gettop(L) > 2 && lua_isboolean(L,3)) - files = lua_toboolean(L, 3); - - int score = 0; - int run = 0; - - // Match things *backwards*. This allows for better matching on filenames than the above + // If true match things *backwards*. This allows for better matching on filenames than the above // function. For example, in the lite project, opening "renderer" has lib/font_render/build.sh // as the first result, rather than src/renderer.c. Clearly that's wrong. - if (files) { - const char* strEnd = str + strLen - 1; - const char* ptnEnd = ptn + ptnLen - 1; - while (strEnd >= str && ptnEnd >= ptn) { - while (*strEnd == ' ') { strEnd--; } - while (*ptnEnd == ' ') { ptnEnd--; } - if (tolower(*strEnd) == tolower(*ptnEnd)) { - score += run * 10 - (*strEnd != *ptnEnd); - run++; - ptnEnd--; - } else { - score -= 10; - run = 0; - } - strEnd--; + bool files = lua_gettop(L) > 2 && lua_isboolean(L,3) && lua_toboolean(L, 3); + int score = 0, run = 0, increment = files ? -1 : 1; + const char* strTarget = files ? str + strLen - 1 : str; + const char* ptnTarget = files ? ptn + ptnLen - 1 : ptn; + while (*strTarget && *ptnTarget) { + while (*strTarget == ' ') { strTarget += increment; } + while (*ptnTarget == ' ') { ptnTarget += increment; } + if (tolower(*strTarget) == tolower(*ptnTarget)) { + score += run * 10 - (*strTarget != *ptnTarget); + run++; + ptnTarget += increment; + } else { + score -= 10; + run = 0; } - if (ptnEnd >= ptn) { return 0; } - } else { - while (*str && *ptn) { - while (*str == ' ') { str++; } - while (*ptn == ' ') { ptn++; } - if (tolower(*str) == tolower(*ptn)) { - score += run * 10 - (*str != *ptn); - run++; - ptn++; - } else { - score -= 10; - run = 0; - } - str++; - } - if (*ptn) { return 0; } + strTarget += increment; } - - lua_pushnumber(L, score - (int)strLen); + if (*ptnTarget) { return 0; } + lua_pushnumber(L, score - (int)strLen * 10); return 1; } |
