~ chicken-core (chicken-5) 15b5e61de07728cc0d312259021177d8c67d4ab4
commit 15b5e61de07728cc0d312259021177d8c67d4ab4 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Aug 4 19:00:59 2025 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Aug 4 19:00:59 2025 +0100 convert paths from getcwd and readdir to use slashes, also handle executable-path diff --git a/file.scm b/file.scm index 045ac615..f3e62d13 100644 --- a/file.scm +++ b/file.scm @@ -82,8 +82,13 @@ static C_word C_rename(C_word old, C_word new) { static C_word C_foundfile(C_word e,C_word b,C_word l) { C_char *s = C_utf8(((struct _wdirent *)C_block_item(e, 0))->d_name); + C_char *p = s; + while(*p != 0) { + *p = *p == '\\' ? '/' : *p; + ++p; + } C_strlcpy(C_c_string(b), s, C_unfix(l)); - return(C_fix(strlen(s))); + return(C_fix(C_strlen(s))); } # define C_readdir(h,e) C_set_block_item(e, 0, (C_word) _wreaddir((_WDIR *)C_block_item(h, 0))) # define C_closedir(h) (_wclosedir((_WDIR *)C_block_item(h, 0)), C_SCHEME_UNDEFINED) diff --git a/library.scm b/library.scm index a95817a2..fd2b0620 100644 --- a/library.scm +++ b/library.scm @@ -6902,9 +6902,30 @@ EOF ;;; Accessing process information (cwd, environ, etc.) #> +#if defined(_WIN32) && !defined(__CYGWIN__) +#include <direct.h> -#define C_chdir(str) C_fix(chdir(C_c_string(str))) -#define C_curdir(buf, size) (getcwd(C_c_string(buf), size) ? C_fix(strlen(C_c_string(buf))) : C_SCHEME_FALSE) +static C_word C_chdir(C_word str) { + return C_fix(_wchdir(C_utf16(str, 0))); +} + +static C_word C_curdir(C_word buf, C_word size) { + C_WCHAR *cwd = _wgetcwd((C_WCHAR *)C_c_string(buf), C_unfix(size)); + if(cwd == NULL) return C_SCHEME_FALSE; + C_char *up = C_utf8(cwd); + C_char *p = up; + while(*p) { + *p = *p == '\\' ? '/' : *p; + ++p; + } + int len = C_strlen(up); + C_memcpy(cwd, up, len + 1); + return C_fix(len); +} +#else +# define C_chdir(str) C_fix(chdir(C_c_string(str))) +# define C_curdir(buf, size) (getcwd(C_c_string(buf), size) ? C_fix(strlen(C_c_string(buf))) : C_SCHEME_FALSE) +#endif <# diff --git a/runtime.c b/runtime.c index 00cd6677..084c7a4f 100644 --- a/runtime.c +++ b/runtime.c @@ -12825,11 +12825,7 @@ C_executable_dirname() { if((path = C_executable_pathname()) == NULL) return NULL; -#if defined(_WIN32) && !defined(__CYGWIN__) - for(len = C_strlen(path); len >= 0 && path[len] != '\\'; len--); -#else - for(len = C_strlen(path); len >= 0 && path[len] != '/'; len--); -#endif + for(len = C_strlen(path); len >= 0 && path[len] != '/' && path[len] != '\\'; len--); path[len] = '\0'; return path; @@ -12866,6 +12862,11 @@ C_resolve_executable_pathname(C_char *fname) C_char *buf2 = C_strdup(C_utf8(buffer)); C_free(buffer); + C_char *p = buf2; + while(*p) { + *p = *p == '\\' ? '/' : *p; + ++p; + } return buf2; #elif defined(C_MACOSX) C_char buf[C_MAX_PATH];Trap