On Fri, Sep 28, 2018 at 02:44:11PM +0300, Gabriel Ivăncescu wrote:
@@ -229,6 +231,54 @@ static LRESULT change_selection(IAutoCompleteImpl *ac, HWND hwnd, UINT key) return 0; }
+static void aclist_expand(IAutoCompleteImpl *ac, WCHAR *txt) +{ + /* call IACList::Expand only when needed + '/' is allowed as a delim for unix paths */ + WCHAR c, *p, *last_delim, *old_txt = ac->txtbackup; + size_t i = 0; + + /* skip the shared prefix */ + while ((c = tolowerW(txt[i])) == tolowerW(old_txt[i])) + { + if (c == '\0') return; + i++; + } + + /* they differ at this point, check for a delim further in txt */ + last_delim = NULL; + for (p = &txt[i]; *p != '\0'; p++) + if (*p == '\\' || *p == '/') + last_delim = p; + if (last_delim) + goto expand; + + /* txt has no delim after i, check for a delim further in old_txt */ + for (p = &old_txt[i]; *p != '\0'; p++) + if (*p == '\\' || *p == '/') + { + /* find the delim before i (if any) */ + while (i--) + { + if (txt[i] == '\\' || txt[i] == '/') + { + last_delim = &txt[i]; + goto expand; + } + } + break; /* Windows doesn't expand without a delim */ + } + + /* they differ, but without any different delims, so no need to expand */ + return; + +expand: + c = last_delim[1]; + last_delim[1] = '\0'; + IACList_Expand(ac->aclist, txt); + last_delim[1] = c; +}
This is going to need some work; trying to follow this code is just too hard. Huw.