void test_path_win32__absolute_from_relative(void) { #ifdef GIT_WIN32 char cwd_backup[MAX_PATH]; cl_must_pass(p_getcwd(cwd_backup, MAX_PATH)); cl_must_pass(p_chdir("C:/")); test_utf8_to_utf16("Foo", L"\\\\?\\C:\\Foo"); test_utf8_to_utf16("..\\..\\Foo", L"\\\\?\\C:\\Foo"); test_utf8_to_utf16("Foo\\..", L"\\\\?\\C:\\"); test_utf8_to_utf16("Foo\\..\\..", L"\\\\?\\C:\\"); test_utf8_to_utf16("", L"\\\\?\\C:\\"); cl_must_pass(p_chdir("C:/Windows")); test_utf8_to_utf16("Foo", L"\\\\?\\C:\\Windows\\Foo"); test_utf8_to_utf16("Foo\\Bar", L"\\\\?\\C:\\Windows\\Foo\\Bar"); test_utf8_to_utf16("..\\Foo", L"\\\\?\\C:\\Foo"); test_utf8_to_utf16("Foo\\..\\Bar", L"\\\\?\\C:\\Windows\\Bar"); test_utf8_to_utf16("", L"\\\\?\\C:\\Windows"); cl_must_pass(p_chdir(cwd_backup)); #endif }
char * u_find_exe(const char *argv0) { char *wkspc = p_wkspc.c; int i = 0; if (!argv0) return 0; while (argv0[i] && argv0[i]!='/') i++; if (!argv0[i]) { /* search for argv0 on PATH environment variable */ char *path = getenv("PATH"); char c = path? path[0] : 0; int s, j, k=0; while (c) { while (c && c!=':') c = path[k++]; if (k > 1) { for (j=0 ; j<k-1 && j<P_WKSIZ ; j++) wkspc[j] = path[j]; if (wkspc[j-1] == '/') s = 0; else s = 1, wkspc[j] = '/'; for (; j<k+i && j<P_WKSIZ ; j++) wkspc[j+s] = argv0[j-k+1]; if (access(wkspc, X_OK) >= 0) break; } path += k; k = 0; c = path[0]; } return k? wkspc : 0; } if (i) { /* argv0 refers to subdirectory of cwd */ wkspc = p_getcwd(); if (wkspc) { int j; for (j=0 ; wkspc[j] ; j++); if (j && wkspc[j-1] != '/') wkspc[j++] = '/'; while (argv0[0]=='.' && argv0[1]=='/') argv0 += 2; for (i=j ; argv0[i-j] && i<P_WKSIZ ; i++) wkspc[i] = argv0[i-j]; } else { i = 0; wkspc = p_wkspc.c; } } else { /* argv0 is absolute pathname */ for (i=0 ; argv0[i] && i<P_WKSIZ ; i++) wkspc[i] = argv0[i]; } wkspc[i] = '\0'; return (access(wkspc, X_OK) >= 0)? wkspc : 0; }