annotate lisp/win32-native.el @ 5576:071b810ceb18

Declare labels as line where appropriate; use #'labels, not #'flet, tests. lisp/ChangeLog addition: 2011-10-03 Aidan Kehoe <kehoea@parhasard.net> * simple.el (handle-pre-motion-command-current-command-is-motion): Implement #'keysyms-equal with #'labels + (declare (inline ...)), instead of abusing macrolet to the same end. * specifier.el (let-specifier): * mule/mule-cmds.el (describe-language-environment): * mule/mule-cmds.el (set-language-environment-coding-systems): * mule/mule-x-init.el (x-use-halfwidth-roman-font): * faces.el (Face-frob-property): * keymap.el (key-sequence-list-description): * lisp-mode.el (construct-lisp-mode-menu): * loadhist.el (unload-feature): * mouse.el (default-mouse-track-check-for-activation): Declare various labels inline in dumped files when that reduces the size of the dumped image. Declaring labels inline is normally only worthwhile for inner loops and so on, but it's reasonable exercise of the related code to have these changes in core. tests/ChangeLog addition: 2011-10-03 Aidan Kehoe <kehoea@parhasard.net> * automated/case-tests.el (uni-mappings): * automated/database-tests.el (delete-database-files): * automated/hash-table-tests.el (iterations): * automated/lisp-tests.el (test1): * automated/lisp-tests.el (a): * automated/lisp-tests.el (cl-floor): * automated/lisp-tests.el (foo): * automated/lisp-tests.el (list-nreverse): * automated/lisp-tests.el (needs-lexical-context): * automated/mule-tests.el (featurep): * automated/os-tests.el (original-string): * automated/os-tests.el (with): * automated/symbol-tests.el (check-weak-list-unique): Replace #'flet with #'labels where appropriate in these tests, following my own advice on style in the docstrings of those functions.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 03 Oct 2011 20:16:14 +0100
parents 308d34e9f07d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
1 ;;; win32-native.el --- Lisp routines when running on native MS Windows.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
3 ;; Copyright (C) 1994 Free Software Foundation, Inc.
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
4 ;; Copyright (C) 2000, 2004 Ben Wing.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
5
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
6 ;; Maintainer: XEmacs Development Team
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
7 ;; Keywords: mouse, dumped
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
8
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
10
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
11 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
12 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
13 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
14 ;; option) any later version.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
15
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
16 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
17 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
18 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
19 ;; for more details.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
20
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2367
diff changeset
22 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
23
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
24 ;;; Synched up with: Not in FSF.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
25 ;;; (FSF has stuff in w32-fns.el and term/w32-win.el.)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
26
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
27 ;;; Commentary:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
28
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
29 ;; This file is dumped with XEmacs for MS Windows (without cygwin).
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
30 ;; It is for stuff that is used specifically when `system-type' eq
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
31 ;; `windows-nt' (i.e. also applies to MinGW), and has nothing to do
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
32 ;; with the `mswindows' device type. Thus, it probably applies in
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
33 ;; non-interactive mode as well, and it DOES NOT APPLY to Cygwin.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
34
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
35 ;; Based (originally) on NT Emacs version by Geoff Voelker
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
36 ;; (voelker@cs.washington.edu)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
37 ;; Ported to XEmacs by Marc Paquette <marcpa@cam.org>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
38 ;; Largely modified by Kirill M. Katsnelson <kkm@kis.ru>
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
39 ;; Rewritten from scratch by Ben Wing <ben@xemacs.org>. No code in common
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
40 ;; with FSF.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
41
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
42 ;;; Code:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
43
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
44 ;; For appending suffixes to directories and files in shell
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
45 ;; completions. This screws up cygwin users so we leave it out for
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
46 ;; now. Uncomment this if you only ever want to use cmd.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
47
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
48 ;(defun nt-shell-mode-hook ()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
49 ; (setq comint-completion-addsuffix '("\\" . " ")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
50 ; comint-process-echoes t))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
51 ;(add-hook 'shell-mode-hook 'nt-shell-mode-hook)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
52
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
53 ;; Use ";" instead of ":" as a path separator (from files.el).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
54 (setq path-separator ";")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
55
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
56 ;; Set the grep regexp to match entries with drive letters.
776
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 611
diff changeset
57 (defvar grep-regexp-alist)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
58 (setq grep-regexp-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
59 '(("^\\(\\([a-zA-Z]:\\)?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 3)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
60
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
61 (defvar mswindows-system-shells '("cmd" "cmd.exe" "command" "command.com"
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
62 "4nt" "4nt.exe" "4dos" "4dos.exe"
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
63 "ndos" "ndos.exe")
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
64 "List of strings recognized as Windows NT/9X system shells.
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
65 These are shells with native semantics, e.g. they use `/c', not '-c',
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
66 to pass a command in.")
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
67
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
68 (defun mswindows-system-shell-p (shell-name)
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
69 (member (downcase (file-name-nondirectory shell-name))
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
70 mswindows-system-shells))
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
71
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
72 (defun init-mswindows-at-startup ()
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
73 ;; shell-file-name is initialized in the C code (callproc.c) from
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
74 ;; SHELL or COMSPEC.
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
75 ;; #### If only shell-command-switch could be a function. But there
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
76 ;; is code littered around that uses it.
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
77 ;; #### Maybe we should set a symbol-value handler on `shell-file-name'
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
78 ;; that automatically sets shell-command-switch?
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
79 (if (mswindows-system-shell-p shell-file-name)
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
80 (setq shell-command-switch "/c")))
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
81
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
82 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
83 ;; ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
84 ;; Quoting process args ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
85 ;; ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
86 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
87
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
88 ;; Converting a bunch of args into a single command line or vice-versa is
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
89 ;; extremely hairy due to the quoting conventions needed. There is in fact
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
90 ;; code that does this in the CRT, and perhaps we should look at it and
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
91 ;; follow the logic.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
92
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
93 ;; Here is some further info from MSDN, discovered *AFTER* the actual code
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
94 ;; below was written, and hence the code may not follow what it should.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
95 ;; !!#### But this is definitely something to be fixed up. The article is
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
96 ;; called "Parsing C++ Command-Line Arguments", Visual Tools and Langs ->
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
97 ;; Visual Studio -> Visual C++ -> Reference -> C/C++ Lang and ... -> C++
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
98 ;; Lang Ref -> Basic Concepts -> Startup and Termination -> Program
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
99 ;; Startup: the main Function.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
100
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
101 ;; Microsoft Specific
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
102 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
103 ;; Microsoft C/C++ startup code uses the following rules when interpreting
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
104 ;; arguments given on the operating system command line:
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
105 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
106 ;; Arguments are delimited by white space, which is either a space or a tab.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
107 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
108 ;; The caret character (^) is not recognized as an escape character or
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
109 ;; delimiter. The character is handled completely by the command-line parser
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
110 ;; in the operating system before being passed to the argv array in the
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
111 ;; program.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
112 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
113 ;; A string surrounded by double quotation marks ("string") is interpreted as
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
114 ;; a single argument, regardless of white space contained within. A quoted
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
115 ;; string can be embedded in an argument.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
116 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
117 ;; A double quotation mark preceded by a backslash ( \") is interpreted as a
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
118 ;; literal double quotation mark character (").
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
119 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
120 ;; Backslashes are interpreted literally, unless they immediately precede a
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
121 ;; double quotation mark.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
122 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
123 ;; If an even number of backslashes is followed by a double quotation mark,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
124 ;; one backslash is placed in the argv array for every pair of backslashes,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
125 ;; and the double quotation mark is interpreted as a string delimiter.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
126 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
127 ;; If an odd number of backslashes is followed by a double quotation mark, one
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
128 ;; backslash is placed in the argv array for every pair of backslashes, and
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
129 ;; the double quotation mark is "escaped" by the remaining backslash,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
130 ;; causing a literal double quotation mark (") to be placed in argv.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
131 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
132 ;; The following program demonstrates how command-line arguments are passed:
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
133 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
134 ;; include <iostream.h>
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
135 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
136 ;; void main( int argc, // Number of strings in array argv
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
137 ;; char *argv[], // Array of command-line argument strings
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
138 ;; char *envp[] ) // Array of environment variable strings
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
139 ;; {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
140 ;; int count;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
141 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
142 ;; // Display each command-line argument.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
143 ;; cout << "\nCommand-line arguments:\n";
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
144 ;; for( count = 0; count < argc; count++ )
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
145 ;; cout << " argv[" << count << "] "
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
146 ;; << argv[count] << "\n";
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
147 ;; }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
148 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
149 ;; Table 2.2 shows example input and expected output, demonstrating the rules
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
150 ;; in the preceding list.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
151 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
152 ;; Table 2.2
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
153 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
154 ;; Command-Line Input argv[1] argv[2] argv[3]
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
155 ;; ------------------------------------------
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
156 ;; "abc" d e abc d e
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
157 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
158 ;; a\\\b d"e f"g h a\\\b de fg h
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
159 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
160 ;; a\\\"b c d a\"b c d
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
161 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
162 ;; a\\\\"b c" d e a\\b c d e
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
163 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
164 ;; END Microsoft Specific
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
165 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
166 ;; note: for pulling apart an arg:
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
167 ;; each arg consists of either
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
168
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
169 ;; something surrounded by single quotes
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
170
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
171 ;; or
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
172
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
173 ;; one or more of
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
174
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
175 ;; 1. a non-ws, non-" char
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
176 ;; 2. a section of double-quoted text
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
177 ;; 3. a section of double-quoted text with end-of-string instead of the final
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
178 ;; quote.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
179
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
180 ;; 2 and 3 get handled together.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
181
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
182 ;; quoted text is one of
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
183 ;;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
184 ;; 1. quote + even number of backslashes + quote, or
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
185 ;; 2. quote + non-greedy anything + non-backslash + even number of
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
186 ;; backslashes + quote.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
187
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
188 ;; we need to separate the two because we unfortunately have no non-greedy
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
189 ;; ? operator. (urk! we actually do, but it wasn't documented.) --ben
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
190
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
191 ;; if you want to mess around, keep this test case in mind:
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
192
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
193 ;; this string
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
194
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
195 ;; " as'f 'FOO BAR' '' \"\" \"asdf \\ \\\" \\\\\\\" asdfasdf\\\\\" foo\" "
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
196
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
197 ;; should tokenize into this:
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
198
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
199 ;; (" " "as'f" " " "'FOO BAR' " "'' " "\"\"" " " "\"asdf \\ \\\" \\\\\\\" asdfasdf\\\\\"" " " "foo" "\" ")
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 1695
diff changeset
200
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
201
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
202 (defvar debug-mswindows-process-command-lines nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
203 "If non-nil, output debug information about the command lines constructed.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
204 This can be useful if you are getting process errors where the arguments
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
205 to the process appear to be getting passed incorrectly.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
206
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
207 ;; properly quotify one arg for the vc runtime argv constructor.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
208 (defun mswindows-quote-one-vc-runtime-arg (arg &optional quote-shell)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
209 ;; we mess with any arg with whitespace, quotes, or globbing chars in it.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
210 ;; we also include shell metachars if asked.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
211 ;; note that \ is NOT included! it's perfectly OK to include an
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
212 ;; arg like c:\ or c:\foo.
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
213 (cond ((equal arg "") "\"\"")
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
214 ((string-match
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
215 (if quote-shell "[ \t\n\r\f*?\"<>|&^%]" "[ \t\n\r\f*?\"]")
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
216 arg)
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
217 ;; handle nested quotes, possibly preceded by backslashes
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
218 (setq arg (replace-in-string arg "\\([\\]*\\)\"" "\\1\\1\\\\\""))
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
219 ;; handle trailing backslashes
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
220 (setq arg (replace-in-string arg "\\([\\]+\\)$" "\\1\\1"))
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
221 (concat "\"" arg "\""))
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
222 (t arg)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
223
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
224 (defun mswindows-quote-one-simple-arg (arg &optional quote-shell)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
225 ;; just put double quotes around args with spaces (and maybe shell
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
226 ;; metachars).
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
227 (cond ((equal arg "") "\"\"")
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
228 ((string-match
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
229 (if quote-shell "[ \t\n\r\f*?\"<>|&^%]" "[ \t\n\r\f*?]")
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
230 arg)
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
231 (concat "\"" arg "\""))
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
232 (t arg)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
233
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
234 (defun mswindows-quote-one-command-arg (arg)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
235 ;; quote an arg to get it past COMMAND.COM/CMD.EXE: need to quote shell
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
236 ;; metachars with ^.
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
237 (cond ((equal arg "") "\"\"")
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
238 (t (replace-in-string "[<>|&^%]" "^\\1" arg))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
239
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
240 (defun mswindows-construct-verbatim-command-line (program args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
241 (mapconcat #'identity args " "))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
242
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
243 ;; for use with either standard VC++ compiled programs or Cygwin programs,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
244 ;; which emulate the same behavior.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
245 (defun mswindows-construct-vc-runtime-command-line (program args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
246 (mapconcat #'mswindows-quote-one-vc-runtime-arg args " "))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
247
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
248 ;; this regexp actually separates the arg into individual args, like a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
249 ;; shell (such as sh) does, but using vc-runtime rules. it's easy to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
250 ;; derive the tokenizing regexp from it, and that's exactly what i did.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
251 ;; but oh was it hard to get this first regexp right. --ben
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
252 ;(defvar mswindows-match-one-cmd-exe-arg-regexp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
253 ; (concat
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
254 ; "^\\("
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
255 ; "'\\([\\]*\\)\\2'" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
256 ; "'.*?[^\\]\\(\\([\\]*\\)\\4'\\)" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
257 ; "\\("
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
258 ; "[^ \t\n\r\f\v\"]" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
259 ; "\"\\([\\]*\\)\\6\"" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
260 ; "\".*?[^\\]\\(\\([\\]*\\)\\8\"\\|$\\)"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
261 ; "\\)+"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
262 ; "\\)"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
263 ; "\\([ \t\n\r\f\v]+\\|$\\)"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
264
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
265 (defvar mswindows-match-one-cmd-exe-token-regexp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
266 (concat
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
267 "^\\("
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
268 "[ \t\n\r\f\v]+" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
269 "'\\([\\]*\\)\\2'" "\\([ \t\n\r\f\v]+\\|$\\)" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
270 "'.*?[^\\]\\(\\([\\]*\\)\\5'\\)" "\\([ \t\n\r\f\v]+\\|$\\)" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
271 "[^ \t\n\r\f\v\"]+" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
272 "\"\\([\\]*\\)\\7\"" "\\|"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
273 "\".*?[^\\]\\(\\([\\]*\\)\\9\"\\|$\\)"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
274 "\\)"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
275
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
276 (defun mswindows-construct-command-command-line (program args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
277 ;; for use with COMMAND.COM and CMD.EXE:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
278 ;; for each arg, tokenize it into quoted and non-quoted sections;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
279 ;; then quote all the shell meta-chars with ^; then put everything
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
280 ;; back together. the truly hard part is the tokenizing -- typically
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
281 ;; we get a single argument (the command to execute) and we have to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
282 ;; worry about quotes that are backslash-quoted and such.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
283 (mapconcat
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
284 #'(lambda (arg)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
285 (mapconcat
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
286 #'(lambda (part)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
287 (if (string-match "^'" part)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
288 (replace-in-string part "\\([<>|^&%]\\)" "^\\1")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
289 part))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
290 (let (parts)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
291 (while (and (> (length arg) 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
292 (string-match
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
293 mswindows-match-one-cmd-exe-token-regexp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
294 arg))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
295 (push (match-string 0 arg) parts)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
296 (setq arg (substring arg (match-end 0))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
297 (if (> (length arg) 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
298 (push arg parts))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
299 (nreverse parts))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
300 ""))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
301 args " "))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
302
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
303 (defvar mswindows-construct-process-command-line-alist
611
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
304 '(
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
305 ;; at one point (pre-1.0), this was required for Cygwin bash.
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
306 ;; evidently, Cygwin changed its arg handling to work just like
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
307 ;; any standard VC program, so we no longer need it.
38db05db9cb5 [xemacs-hg @ 2001-06-08 12:21:09 by ben]
ben
parents: 464
diff changeset
308 ;;("[\\/].?.?sh\\." . mswindows-construct-verbatim-command-line)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
309 ("[\\/]command\\.com$" . mswindows-construct-command-command-line)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
310 ("[\\/]cmd\\.exe$" . mswindows-construct-command-command-line)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
311 ("" . mswindows-construct-vc-runtime-command-line))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
312 "An alist for determining proper argument quoting given executable
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
313 file name. Car of each cons should be a string, a regexp against
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
314 which the file name is matched. Matching is case-insensitive but does
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
315 include the directory, so you should begin your regexp with [\\\\/] if
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
316 you don't want the directory to matter. Alternatively, the car can be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
317 a function of one arg, which is called with the executable's name and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
318 should return t if this entry should be processed. Cdr is a function
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
319 symbol, which is called with two args, the executable name and a list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
320 of the args passed to it. It should return a string, which includes
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
321 the executable's args (but not the executable name itself) properly
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
322 quoted and pasted together. The list is matched in order, and the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
323 first matching entry specifies how the processing will happen.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
324
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
325 (defun mswindows-construct-process-command-line (args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
326 ;;Properly quote process ARGS for executing (car ARGS).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
327 ;;Called from the C code.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
328 (let ((fname (car args))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
329 (alist mswindows-construct-process-command-line-alist)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
330 (case-fold-search t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
331 (return-me nil)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
332 (assoc nil))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
333 (while (and alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
334 (null return-me))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
335 (setq assoc (pop alist))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
336 (if (if (stringp (car assoc))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
337 (string-match (car assoc) fname)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
338 (funcall (car assoc) fname))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
339 (setq return-me (cdr assoc))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
340 (let* ((called-fun (or return-me
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
341 #'mswindows-construct-vc-runtime-command-line))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
342 (retval
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
343 (let ((str (funcall called-fun fname (cdr args)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
344 (quoted-fname (mswindows-quote-one-simple-arg fname)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
345 (if (and str (> (length str) 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
346 (concat quoted-fname " " str)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
347 quoted-fname))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
348 (when debug-mswindows-process-command-lines
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
349 (debug-print "mswindows-construct-process-command-line called:\n")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
350 (debug-print "received args: \n%s"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
351 (let ((n -1))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
352 (mapconcat #'(lambda (arg)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
353 (incf n)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
354 (format " %d %s\n" n arg))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
355 args
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
356 "")))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
357 (debug-print "called fun %s\n" called-fun)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
358 (debug-print "resulting command line: %s\n" retval))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
359 retval)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
360
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
361 ;;; win32-native.el ends here