~ chicken-core (chicken-5) 295b484337017be94f5acd29d22fe961b9bc4162
commit 295b484337017be94f5acd29d22fe961b9bc4162 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Wed Apr 16 16:18:54 2025 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Wed Apr 16 17:22:58 2025 +0200 some attempts at improving use of wide-char OS API diff --git a/chicken.h b/chicken.h index 3ad970e9..5779c03d 100644 --- a/chicken.h +++ b/chicken.h @@ -1775,7 +1775,7 @@ C_varextern int C_varextern C_uword C_heap_growth, C_heap_shrinkage; -C_varextern C_WCHAR +C_varextern C_char **C_main_argv, #ifdef SEARCH_EXE_PATH *C_main_exe, @@ -1792,7 +1792,7 @@ C_varextern C_word (*C_get_unbound_variable_value_hook)(C_word sym); C_BEGIN_C_DECLS C_fctexport void C_register_debug_info(C_DEBUG_INFO *); -C_fctexport int CHICKEN_main(int argc, C_WCHAR *argv[], void *toplevel); +C_fctexport int CHICKEN_main(int argc, C_char *argv[], void *toplevel); C_fctexport int CHICKEN_initialize(int heap, int stack, int symbols, void *toplevel); C_fctexport C_word CHICKEN_run(void *toplevel); C_fctexport C_word CHICKEN_continue(C_word k); diff --git a/posixwin.scm b/posixwin.scm index 3d5e0f9d..9c47dcbf 100644 --- a/posixwin.scm +++ b/posixwin.scm @@ -353,7 +353,7 @@ get_user_name() Returns: pid, zero return value indicates failure. */ static DWORD -C_process(const char *app, const char *cmdlin, const char **env, +C_process(const char *app, C_word cmdlin, const char **env, int *phandle, int *pstdin_fd, int *pstdout_fd, int *pstderr_fd, int params) { @@ -415,7 +415,7 @@ C_process(const char *app, const char *cmdlin, const char **env, wchar_t* pb = (wchar_t*)envblk; for (p = env; *p; ++p) { - wchar_t *u = C_utf16(*p, 0); + wchar_t *u = C_utf16(*p, 0); /* BOGUS! */ int n = wcslen(*u); C_memcpy(pb, *u, n + 1); pb += n + 1; @@ -433,7 +433,7 @@ C_process(const char *app, const char *cmdlin, const char **env, if (success) { PROCESS_INFORMATION pi; - STARTUPINFO si; + STARTUPINFOW si; ZeroMemory(&pi,sizeof pi); ZeroMemory(&si,sizeof si); @@ -510,12 +510,12 @@ static int set_file_mtime(C_word filename, C_word atime, C_word mtime) return _wutime(fn, &tb); } -#define C_u_i_execvp(f, a) C_fix(_wexecvp(C_c_string(f), (void *)C_c_pointer_vector_or_null(a))) -#define C_u_i_execve(f,a,e) C_fix(_wexecve(C_c_string(f), (void *)C_c_pointer_vector_or_null(a), (void *)C_c_pointer_vector_or_null(e))) +#define C_u_i_execvp(f, a) C_fix(_wexecvp(C_utf16(f, 0), (void *)C_c_pointer_vector_or_null(a))) +#define C_u_i_execve(f,a,e) C_fix(_wexecve(C_utf16(f, 0), (void *)C_c_pointer_vector_or_null(a), (void *)C_c_pointer_vector_or_null(e))) /* MS replacement for the fork-exec pair */ -#define C_u_i_spawnvp(m,f,a) C_fix(_wspawnvp(C_unfix(m), C_c_string(f), (void *)C_c_pointer_vector_or_null(a))) -#define C_u_i_spawnvpe(m,f,a,e) C_fix(_wspawnvpe(C_unfix(m), C_c_string(f), (void *)C_c_pointer_vector_or_null(a), (void *)C_c_pointer_vector_or_null(e))) +#define C_u_i_spawnvp(m,f,a) C_fix(_wspawnvp(C_unfix(m), C_utf16(f, 0), (void *)C_c_pointer_vector_or_null(a))) +#define C_u_i_spawnvpe(m,f,a,e) C_fix(_wspawnvpe(C_unfix(m), C_utf16(f, 0), (void *)C_c_pointer_vector_or_null(a), (void *)C_c_pointer_vector_or_null(e))) <# @@ -737,7 +737,7 @@ static int set_file_mtime(C_word filename, C_word atime, C_word mtime) (foreign-lambda* c-pointer ((scheme-object o)) "char *ptr = C_malloc(C_header_size(o) * sizeof(wchar_t)); \n" "if (ptr != NULL) {\n" - " wchar_t *u = C_utf16(C_data_pointer(o), 0); \n" + " wchar_t *u = C_utf16(o, 0); \n" " C_memcpy(ptr, u, wcslen(u) + 1); \n" "}\n" "C_return(ptr);")) @@ -815,7 +815,7 @@ static int set_file_mtime(C_word filename, C_word atime, C_word mtime) (define process-impl ;; XXX TODO: When environment is implemented, check for embedded NUL bytes! (let ([c-process - (foreign-lambda bool "C_process" c-string c-string c-pointer + (foreign-lambda bool "C_process" c-string scheme-object c-pointer (c-pointer int) (c-pointer int) (c-pointer int) (c-pointer int) int)]) ; The environment list must be sorted & include current directory ; information for the system drives. i.e !C:=... @@ -829,7 +829,7 @@ static int set_file_mtime(C_word filename, C_word atime, C_word mtime) (let-location ([handle int -1] [stdin_fd int -1] [stdout_fd int -1] [stderr_fd int -1]) (let ([res - (c-process cmd cmdlin #f + (c-process cmd (##sys#slot cmdlin 0) #f (location handle) (location stdin_fd) (location stdout_fd) (location stderr_fd) (+ (if stdinf 0 1) (if stdoutf 0 2) (if stderrf 0 4)))]) @@ -849,7 +849,7 @@ static int set_file_mtime(C_word filename, C_word atime, C_word mtime) ;; TODO: See if this can be moved to posix-common (let ((%process - (lambda (loc cmd args env exactf enc) + (lambda (loc err? cmd args env exactf enc) (let ((chkstrlst (lambda (lst) (##sys#check-list lst loc) @@ -865,10 +865,10 @@ static int set_file_mtime(C_word filename, C_word atime, C_word mtime) (process-impl loc cmd args env #t #t err? exactf enc))))) (set! chicken.process#process (lambda (cmd #!optional args env (enc 'utf-8) exactf) - (%process 'process cmd args env exactf enc) )) + (%process 'process #f cmd args env exactf enc) )) (set! chicken.process#process* (lambda (cmd #!optional args env (enc 'utf-8) exactf) - (%process 'process* cmd args env exactf enc) )) ) + (%process 'process* #t cmd args env exactf enc) )) ) (define-foreign-variable _exstatus int "C_exstatus") diff --git a/runtime.c b/runtime.c index e8d747e1..6e331d6d 100644 --- a/runtime.c +++ b/runtime.c @@ -356,7 +356,7 @@ time_t C_startup_time_sec, C_startup_time_msec, profile_frequency = 10000; -char +C_char **C_main_argv, #ifdef SEARCH_EXE_PATH *C_main_exe = NULL, @@ -604,7 +604,7 @@ C_dbg(C_char *prefix, C_char *fstr, ...) /* Startup code: */ -int CHICKEN_main(int argc, C_WCHAR *argv[], void *toplevel) +int CHICKEN_main(int argc, char *argv[], void *toplevel) { C_word h, s, n; @@ -627,7 +627,7 @@ int CHICKEN_main(int argc, C_WCHAR *argv[], void *toplevel) panic(C_text("cannot allocate argument-list buffer")); for(i = 0; i < argc; ++i) { - arg = C_utf8(argv[ i ]); + arg = argv[ i ]; n = strlen(arg); aptr = (C_char *)malloc(n + 1); @@ -1367,10 +1367,10 @@ C_word C_resize_pending_finalizers(C_word size) { /* Parse runtime options from command-line: */ -void CHICKEN_parse_command_line(int argc, char *argv[], C_word *heap, C_word *stack, C_word *symbols) +void CHICKEN_parse_command_line(int argc, C_char *argv[], C_word *heap, C_word *stack, C_word *symbols) { int i; - char *ptr; + C_char *ptr; C_word x; C_main_argc = argc;Trap