Signed-off-by: Fabian Maurer dark.shadow4@web.de --- v3: Fix test error --- programs/find/tests/find.c | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
diff --git a/programs/find/tests/find.c b/programs/find/tests/find.c index b8345034b5..55896baeaf 100644 --- a/programs/find/tests/find.c +++ b/programs/find/tests/find.c @@ -264,6 +264,47 @@ static void run_find_unicode_(const BYTE *input, int input_len, const BYTE *out_ run_find_stdin_(wstr_quoted_test, input, input_len, out_expected_mangled, out_expected_mangled_len, exitcode_expected, file, line); }
+static void run_find_file_multi(void) +{ + char path_temp_file1[MAX_PATH]; + char path_temp_file2[MAX_PATH]; + char path_temp_dir[MAX_PATH]; + HANDLE handle_file; + WCHAR commandline_new[MAX_PATH]; + char out_expected[500]; + const char* input = "ab\nbd"; + + GetTempPathA(ARRAY_SIZE(path_temp_dir), path_temp_dir); + GetTempFileNameA(path_temp_dir, "", 0, path_temp_file1); + GetTempFileNameA(path_temp_dir, "", 0, path_temp_file2); + handle_file = CreateFileA(path_temp_file1, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + write_to_handle(handle_file, (BYTE*)input, strlen(input)); + CloseHandle(handle_file); + handle_file = CreateFileA(path_temp_file2, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + write_to_handle(handle_file, (BYTE*)input, strlen(input)); + CloseHandle(handle_file); + + wsprintfW(commandline_new, L""b" C:\doesnotexist1 %hs C:\doesnotexist1 %hs C:\doesnotexist1", path_temp_file1, path_temp_file2); + + CharUpperA(path_temp_file1); + CharUpperA(path_temp_file2); + wsprintfA(out_expected, + "File not found - C:\DOESNOTEXIST1\r\n" + "\r\n---------- %s\r\n" + "ab\r\nbd\r\n" + "File not found - C:\DOESNOTEXIST1\r\n" + "\r\n---------- %s\r\n" + "ab\r\nbd\r\n" + "File not found - C:\DOESNOTEXIST1\r\n", + path_temp_file1, path_temp_file2); + + todo_wine + run_find_stdin_(commandline_new, (BYTE*)"", 0, (BYTE*)out_expected, strlen(out_expected), 0, __FILE__, __LINE__); + + DeleteFileA(path_temp_file1); + DeleteFileA(path_temp_file2); +} + static void test_errors(void) { run_find_stdin_str("", "", "FIND: Parameter format not correct\r\n", 2); @@ -411,6 +452,7 @@ START_TEST(find) else { test_errors(); + run_find_file_multi(); } test_singleline_without_switches(); test_multiline(); -- 2.25.1
Signed-off-by: Fabian Maurer dark.shadow4@web.de --- v2: Add error check v3: Simplify error check --- programs/find/find.c | 65 ++++++++++++++++++++++++++++++++------ programs/find/find.rc | 1 + programs/find/resources.h | 1 + programs/find/tests/find.c | 19 ----------- 4 files changed, 58 insertions(+), 28 deletions(-)
diff --git a/programs/find/find.c b/programs/find/find.c index 34ca2801eb..90d8a52fed 100644 --- a/programs/find/find.c +++ b/programs/find/find.c @@ -147,7 +147,9 @@ int __cdecl wmain(int argc, WCHAR *argv[]) WCHAR *tofind = NULL; int i; int exitcode; - HANDLE input; + int file_paths_len = 0; + int file_paths_max = 1; + WCHAR** file_paths = heap_alloc(sizeof(WCHAR*));
TRACE("running find:"); for (i = 0; i < argc; i++) @@ -156,8 +158,6 @@ int __cdecl wmain(int argc, WCHAR *argv[]) } TRACE("\n");
- input = GetStdHandle(STD_INPUT_HANDLE); - for (i = 1; i < argc; i++) { if (argv[i][0] == '/') @@ -171,8 +171,12 @@ int __cdecl wmain(int argc, WCHAR *argv[]) } else { - FIXME("Searching files not supported yet\n"); - return 1000; + if (file_paths_len >= file_paths_max) + { + file_paths_max *= 2; + file_paths = heap_realloc(file_paths, sizeof(WCHAR*) * file_paths_max); + } + file_paths[file_paths_len++] = argv[i]; } }
@@ -183,13 +187,56 @@ int __cdecl wmain(int argc, WCHAR *argv[]) }
exitcode = 1; - while ((line = read_line_from_handle(input)) != NULL) + + if (file_paths_len > 0) { - if (run_find_for_line(line, tofind)) - exitcode = 0; + for (i = 0; i < file_paths_len; i++) + { + HANDLE input; + WCHAR file_path_upper[MAX_PATH]; + + wcscpy(file_path_upper, file_paths[i]); + CharUpperW(file_path_upper); + + input = CreateFileW(file_paths[i], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + + if (!input) + { + WCHAR buffer_message[64]; + WCHAR message[300]; + + LoadStringW(GetModuleHandleW(NULL), IDS_FILE_NOT_FOUND, buffer_message, ARRAY_SIZE(buffer_message)); + + wsprintfW(message, buffer_message, file_path_upper); + write_to_stdout(message); + continue; + }
- heap_free(line); + write_to_stdout(L"\r\n---------- "); + write_to_stdout(file_path_upper); + write_to_stdout(L"\r\n"); + while ((line = read_line_from_handle(input)) != NULL) + { + if (run_find_for_line(line, tofind)) + exitcode = 0; + + heap_free(line); + } + CloseHandle(input); + } + } + else + { + HANDLE input = GetStdHandle(STD_INPUT_HANDLE); + while ((line = read_line_from_handle(input)) != NULL) + { + if (run_find_for_line(line, tofind)) + exitcode = 0; + + heap_free(line); + } }
+ heap_free(file_paths); return exitcode; } diff --git a/programs/find/find.rc b/programs/find/find.rc index 8c358c8677..b7376b6d11 100644 --- a/programs/find/find.rc +++ b/programs/find/find.rc @@ -22,4 +22,5 @@ STRINGTABLE { IDS_INVALID_PARAMETER "FIND: Parameter format not correct\r\n" IDS_INVALID_SWITCH "FIND: Invalid switch\r\n" + IDS_FILE_NOT_FOUND "File not found - %s\r\n" } diff --git a/programs/find/resources.h b/programs/find/resources.h index 2ebe197b7d..bdcc2802b5 100644 --- a/programs/find/resources.h +++ b/programs/find/resources.h @@ -23,5 +23,6 @@
#define IDS_INVALID_PARAMETER 1000 #define IDS_INVALID_SWITCH 1001 +#define IDS_FILE_NOT_FOUND 1002
#endif /* __WINE_FIND_RESOURCES_H */ diff --git a/programs/find/tests/find.c b/programs/find/tests/find.c index 55896baeaf..37c21658ad 100644 --- a/programs/find/tests/find.c +++ b/programs/find/tests/find.c @@ -298,7 +298,6 @@ static void run_find_file_multi(void) "File not found - C:\DOESNOTEXIST1\r\n", path_temp_file1, path_temp_file2);
- todo_wine run_find_stdin_(commandline_new, (BYTE*)"", 0, (BYTE*)out_expected, strlen(out_expected), 0, __FILE__, __LINE__);
DeleteFileA(path_temp_file1); @@ -313,7 +312,6 @@ static void test_errors(void) todo_wine /* Quotes are not properly passed into wine yet */ run_find_stdin_str(""test", "", "FIND: Parameter format not correct\r\n", 2); run_find_stdin_str(""test" /XYZ", "", "FIND: Invalid switch\r\n", 2); - todo_wine run_find_stdin_str(""test" C:\doesnotexist.dat", "", "File not found - C:\DOESNOTEXIST.DAT\r\n", 1); }
@@ -389,19 +387,12 @@ static void test_unicode_support_stdin(void)
static void test_file_search(void) { - todo_wine run_find_file_str("""", "test", "", 1); - todo_wine run_find_file_str(""test"", "", "", 1); - todo_wine run_find_file_str(""test"", "test", "test\r\n", 0); - todo_wine run_find_file_str(""test"", "test2", "test2\r\n", 0); - todo_wine run_find_file_str(""test"", "test\r2", "test\r2\r\n", 0); - todo_wine run_find_file_str(""test2"", "test", "", 1); - todo_wine run_find_file_str(""test"", "test\nother\ntest2\ntest3", "test\r\ntest2\r\ntest3\r\n", 0); }
@@ -410,31 +401,21 @@ static void test_unicode_support_file(void) /* Test unicode support on files */
/* Test UTF-8 BOM */ - todo_wine run_find_file_unicode(str_en_utf8_nobom, str_en_utf8_nobom, 0); - todo_wine run_find_file_unicode(str_en_utf8_bom, str_en_utf8_bom, 0);
/* Test russian characters */ - todo_wine run_find_file_unicode(str_rus_utf8_bom, str_rus_utf8_bom, 0); - todo_wine run_find_file_unicode(str_rus_utf8_nobom, str_rus_utf8_nobom, 0);
/* Test japanese characters */ - todo_wine run_find_file_unicode(str_jap_utf8_nobom, str_jap_utf8_nobom, 0); - todo_wine run_find_file_unicode(str_jap_utf8_bom, str_jap_utf8_bom, 0); - todo_wine run_find_file_unicode(str_jap_shiftjis, str_jap_shiftjis, 0);
/* Test unsupported encodings */ - todo_wine run_find_file_unicode(str_jap_utf16le_nobom, str_empty, 1); - todo_wine run_find_file_unicode(str_jap_utf16be_bom, str_empty, 1); - todo_wine run_find_file_unicode(str_jap_utf16be_nobom, str_empty, 1);
/* Test utf16le */ -- 2.25.1
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=65383
Your paranoid android.
=== debian10 (32 bit report) ===
Report validation errors: find.exe:find is missing some failure messages
=== debian10 (32 bit French report) ===
Report validation errors: find.exe:find is missing some failure messages
=== debian10 (32 bit Japanese:Japan report) ===
Report validation errors: find.exe:find is missing some failure messages
=== debian10 (32 bit Chinese:China report) ===
Report validation errors: find.exe:find is missing some failure messages
=== debian10 (32 bit WoW report) ===
Report validation errors: find.exe:find is missing some failure messages
=== debian10 (64 bit WoW report) ===
Report validation errors: find.exe:find is missing some failure messages
Hi Fabian,
On 18/02/2020 18:21, Fabian Maurer wrote:
input = CreateFileW(file_paths[i], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (!input)
{
WCHAR buffer_message[64];
WCHAR message[300];
LoadStringW(GetModuleHandleW(NULL), IDS_FILE_NOT_FOUND, buffer_message, ARRAY_SIZE(buffer_message));
wsprintfW(message, buffer_message, file_path_upper);
write_to_stdout(message);
continue;
}
Doesn't CreateFileW return INVALID_HANDLE_VALUE on error instead of NULL? (which is -1, not zero)
Also I think you should check GetLastError to make sure the file was not found, instead of some other error, unless native find behaves as if all errors mean "file not found", of course. And display the error message appropriately.
Doesn't CreateFileW return INVALID_HANDLE_VALUE on error instead of NULL? (which is -1, not zero)
Also I think you should check GetLastError to make sure the file was not found, instead of some other error, unless native find behaves as if all errors mean "file not found", of course. And display the error message appropriately.
Of course, you're right. I added a test and fixed that check, thank you.
Regards, Fabian Maurer