Hi Eric,
On 3/24/22 14:46, Eric Pouech wrote:
Signed-off-by: Eric Pouech eric.pouech@gmail.com
programs/cmd/batch.c | 279 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 273 insertions(+), 6 deletions(-)
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c index 9a262c5fec5..934cbcc7a39 100644 --- a/programs/cmd/batch.c +++ b/programs/cmd/batch.c @@ -227,6 +227,211 @@ WCHAR *WCMD_parameter (WCHAR *s, int n, WCHAR **start, BOOL raw, return WCMD_parameter_with_delims (s, n, start, raw, wholecmdline, L" \t,=;"); }
+struct completion_info +{
- WCHAR** subfiles;
- DWORD index_search;
- DWORD num_results;
+};
+/* gets directory name out of 'path', appends 'in' and surround with quotes if needed */ +static WCHAR* dup_quoted(const WCHAR* path, const WCHAR* in) +{
- const WCHAR* last = wcsrchr(path, L'/');
- size_t dirlen;
- size_t len;
- WCHAR* ret;
- if (last)
- {
WCHAR* last1 = wcschr(last + 1, L'\\');
if (last1) last = last1;
- }
- else last = wcsrchr(path, L'\');
- dirlen = last ? (last - path) + 1 : 0;
I think that last1 should use wcsrchr as well? Or maybe even replace the whole dirlen logic with a simple loop.
+static BOOL init_completion(struct completion_info* ci, const WCHAR* from, DWORD len, BOOL forward) +{
- WCHAR* ptr;
- HANDLE hff;
- WIN32_FIND_DATAW fd;
- BOOL in_quotes = FALSE;
- DWORD i, j = 0;
- ptr = malloc((len + 1 + 1) * sizeof(WCHAR));
- if (!ptr) return FALSE;
- for (i = 0; i < len; i++)
- {
switch (from[i])
{
case L'"':
in_quotes = !in_quotes;
continue;
case L'\\':
if (!in_quotes && i + 1 < len && wcschr(L" \t\"\\", from[i + 1]) != NULL)
++i;
break;
case L' ':
case L'\t':
/* shouldn't happen, as 'from' should contain a single argument */
if (!in_quotes)
{
free(ptr);
return FALSE;
}
break;
}
ptr[j++] = from[i];
- }
- ptr[j] = L'*';
- ptr[j + 1] = L'\0';
- hff = FindFirstFileW(ptr, &fd);
- ci->num_results = 0;
- ci->subfiles = NULL;
- if (hff != INVALID_HANDLE_VALUE)
- {
do
{
WCHAR** new;
if (!wcscmp(fd.cFileName, L".") || !wcscmp(fd.cFileName, L".."))
continue;
new = realloc(ci->subfiles, (ci->num_results + 1) * sizeof(*ci->subfiles));
if (!new)
{
FindClose(hff);
free(ptr);
return FALSE;
}
ci->subfiles = new;
if (!(ci->subfiles[ci->num_results++] = dup_quoted(ptr, fd.cFileName)))
{
FindClose(hff);
free(ptr);
return FALSE;
}
} while (FindNextFileW(hff, &fd));
FindClose(hff);
- }
- free(ptr);
- if (!ci->num_results) return FALSE;
- ci->index_search = forward ? 0 : ci->num_results - 1;
- return TRUE;
+}
If I read it correctly, if another process creates a file when completion is already initialized, we will not take that into account. Is that intended?
Thanks,
Jacek