diff options
author | Eli Zaretskii <eliz@gnu.org> | 2013-12-07 14:00:10 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2013-12-07 14:00:10 +0200 |
commit | 94ae1542354539a0660b21cf3b7a5143139b8375 (patch) | |
tree | 89148c0daaa32bb971351cefa5540ec33a00026d /src/emacs.c | |
parent | 17788cb3da557d2d5c2dda8f7dedb80999a48242 (diff) | |
download | emacs-94ae1542354539a0660b21cf3b7a5143139b8375.tar.gz |
Tested subprogram invocation, fixed decode_env_path.
Diffstat (limited to 'src/emacs.c')
-rw-r--r-- | src/emacs.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/emacs.c b/src/emacs.c index 3e9635fd229..9f41bc251ea 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -36,6 +36,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #ifdef WINDOWSNT #include <fcntl.h> #include <sys/socket.h> +#include <mbstring.h> #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); |