summaryrefslogtreecommitdiff
path: root/src/emacs.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2013-12-07 14:00:10 +0200
committerEli Zaretskii <eliz@gnu.org>2013-12-07 14:00:10 +0200
commit94ae1542354539a0660b21cf3b7a5143139b8375 (patch)
tree89148c0daaa32bb971351cefa5540ec33a00026d /src/emacs.c
parent17788cb3da557d2d5c2dda8f7dedb80999a48242 (diff)
downloademacs-94ae1542354539a0660b21cf3b7a5143139b8375.tar.gz
Tested subprogram invocation, fixed decode_env_path.
Diffstat (limited to 'src/emacs.c')
-rw-r--r--src/emacs.c33
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);