From 94ae1542354539a0660b21cf3b7a5143139b8375 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 7 Dec 2013 14:00:10 +0200 Subject: [PATCH] Tested subprogram invocation, fixed decode_env_path. --- src/emacs.c | 33 +++++++++++++++++++++++++++++++-- src/w32.c | 2 +- src/w32proc.c | 2 +- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/emacs.c b/src/emacs.c index 3e9635fd22..9f41bc251e 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -36,6 +36,7 @@ along with GNU Emacs. If not, see . */ #ifdef WINDOWSNT #include #include +#include #include "w32.h" #include "w32heap.h" #endif @@ -2205,8 +2206,36 @@ decode_env_path (const char *evarname, const char *defalt) char *path_copy; #ifdef WINDOWSNT - path_copy = alloca (MAX_UTF8_PATH); - filename_from_ansi (path, path_copy); + char *path_utf8, *q, *d; + int cnv_result; + + /* Convert each element of PATH to UTF-8. */ + p = path_copy = alloca (strlen (path) + 1); + strcpy (path_copy, path); + d = path_utf8 = alloca (4 * strlen (path) + 1); + *d = '\0'; + do { + q = _mbschr (p, SEPCHAR); + if (q) + *q = '\0'; + cnv_result = filename_from_ansi (p, d); + if (q) + { + *q++ = SEPCHAR; + p = q; + /* If conversion of this PATH elements fails, make sure + destination pointer will stay put, thus effectively + ignoring the offending element. */ + if (cnv_result == 0) + { + d += strlen (d); + *d++ = SEPCHAR; + } + } + else if (cnv_result != 0 && d > path_utf8) + d[-1] = '\0'; /* remove last semi-colon and null-terminate PATH */ + } while (q); + path_copy = path_utf8; #else /* MSDOS */ path_copy = alloca (strlen (path) + 1); strcpy (path_copy, path); diff --git a/src/w32.c b/src/w32.c index 47c4f04b15..0f13703b93 100644 --- a/src/w32.c +++ b/src/w32.c @@ -2020,7 +2020,7 @@ normalize_filename (register char *fp, char path_sep) while (*fp) { - if (*fp == '/' || *fp == '\\') + if ((*fp == '/' || *fp == '\\') && *fp != path_sep) *fp = path_sep; fp++; } diff --git a/src/w32proc.c b/src/w32proc.c index 76d8bb19cf..d2751d5068 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -1619,7 +1619,7 @@ sys_spawnve (int mode, char *cmdname, char **argv, char **envp) return -1; } /* From here on, CMDNAME is an ANSI-encoded string. */ - cmdname = cmdname_a + cmdname = cmdname_a; argv[0] = cmdname; /* Determine whether program is a 16-bit DOS executable, or a 32-bit Windows -- 2.20.1