X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/d78e84f792e68c4db0e775a977c70e09871d23e1..2e8195083823ba5ba044343389bd39adc9f48072:/nt/cmdproxy.c diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c index 0ca57abb5c..631570b9d5 100644 --- a/nt/cmdproxy.c +++ b/nt/cmdproxy.c @@ -1,5 +1,6 @@ /* Proxy shell designed for use with Emacs on Windows 95 and NT. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008 Free Software Foundation, Inc. Accepts subset of Unix sh(1) command-line options, for compatability with elisp code written for Unix. When possible, executes external @@ -16,7 +17,7 @@ This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -26,8 +27,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #include @@ -158,6 +159,7 @@ get_next_token (char * buf, char ** pSrc) if (p[0] == escape_char && escape_char != '"') { escape_char_run++; + p++; continue; } else if (p[0] == '"') @@ -229,7 +231,7 @@ search_dir (char *dir, char *exec, int bufsize, char *buffer) int i, rc; /* Search the directory for the program. */ - for (i = 0; i < n_exts; i++) + for (i = 0; i < n_exts; i++) { rc = SearchPath (dir, exec, exts[i], bufsize, buffer, &dummy); if (rc > 0) @@ -239,7 +241,7 @@ search_dir (char *dir, char *exec, int bufsize, char *buffer) return 0; } -/* Return the absolute name of executable file PROG, including +/* Return the absolute name of executable file PROG, including any file extensions. If an absolute name for PROG cannot be found, return NULL. */ char * @@ -271,18 +273,18 @@ make_absolute (char *prog) return NULL; } - if (GetCurrentDirectory (MAX_PATH, curdir) <= 0) + if (GetCurrentDirectory (MAX_PATH, curdir) <= 0) return NULL; /* Relative path; search in current dir. */ - if (strpbrk (prog, "\\")) + if (strpbrk (prog, "\\")) { if (search_dir (curdir, prog, MAX_PATH, absname) > 0) return strdup (absname); - else + else return NULL; } - + /* Just filename; search current directory then PATH. */ path = alloca (strlen (getenv ("PATH")) + strlen (curdir) + 2); strcpy (path, curdir); @@ -303,7 +305,7 @@ make_absolute (char *prog) /* Move to the next directory. */ path = p + 1; - } + } return NULL; } @@ -321,7 +323,7 @@ setup_argv (void) char * cmdline = GetCommandLine (); int arg_bytes = 0; - + } #endif @@ -383,7 +385,7 @@ spawn (char * progname, char * cmdline, char * dir, int * retcode) sec_attrs.nLength = sizeof (sec_attrs); sec_attrs.lpSecurityDescriptor = NULL; sec_attrs.bInheritHandle = FALSE; - + memset (&start, 0, sizeof (start)); start.cb = sizeof (start); @@ -464,10 +466,20 @@ main (int argc, char ** argv) SetCurrentDirectory (modname); *progname = '\\'; + /* Due to problems with interaction between API functions that use "OEM" + codepage vs API functions that use the "ANSI" codepage, we need to + make things consistent by choosing one and sticking with it. */ + SetConsoleCP (GetACP()); + SetConsoleOutputCP (GetACP()); + /* Although Emacs always sets argv[0] to an absolute pathname, we might get run in other ways as well, so convert argv[0] to an - absolute name before comparing to the module name. */ + absolute name before comparing to the module name. Don't get + caught out by mixed short and long names. */ + GetShortPathName (modname, modname, sizeof (modname)); + path[0] = '\0'; if (!SearchPath (NULL, argv[0], ".exe", sizeof (path), path, &progname) + || !GetShortPathName (path, path, sizeof (path)) || stricmp (modname, path) != 0) { /* We are being used as a helper to run a DOS app; just pass @@ -521,7 +533,7 @@ main (int argc, char ** argv) if (cmdline) warn ("warning: %s ignored because of -c\n", *argv); } - else if (((*argv)[1] == 'e' || (*argv[1] == 'E')) && ((*argv)[2] == ':')) + else if (((*argv)[1] == 'e' || (*argv)[1] == 'E') && ((*argv)[2] == ':')) { int requested_envsize = atoi (*argv + 3); /* Enforce a reasonable minimum size, as above. */ @@ -694,3 +706,6 @@ main (int argc, char ** argv) return 0; } + +/* arch-tag: 88678d93-07ac-4e2f-ad63-d4a740ca69ac + (do not change this comment) */