- traditional argument vector argv[0], argv[1], etc. Again, to
- break it into argument items, any spaces must be quoted using
- double quote thus
- cmd "this is arg 1" "this is arg 2"
-
-What if an argument itself contains double-quotes? (File names can't
-can't, on Windows.) Then the quote must be escaped with a backslash.
-If we call Create Process with this lpArgument:
- cmd "Foo=\"baz\"" arg2
-then cmd will see argv[1] as
- Foo="baz"
-However, experiments show that backslashes themselves must *not* be escaped.
-That is, to get a backslash in an argument, just put backslash, even inside
-quotes. For eaxmple, this works fine to show the contents of the file
-foo\baz
- cat "foo\baz"
-If you escape the backslash, thus
- cat "foo\\baz"
-then @cat@ will see argument foo\\baz, and on WinME/98/95 you'll get
-"can't find file foo\\baz". (As it happens, WinNT/XP commands don't
-mind double backslashes, but it's still a bug, given rawSystem's claim
-to pass exactly args to the command.)
-
-BOTTOM LINE:
- 1 We wrap the command, and each argument, in quotes
- 2 Inside the quotes, we escape any double-quote characters
- (but nothing else)
- 3 Then concatenate all these quoted things together, separated with
- spaces
-
-Steps 1,2 are done by the function 'translate' below.
-
-The exact rules used by the C runtime to unscramble quoted argumets
-are quite complex. For example, how do you get the string \" into an
-argument? You can find the rules in MSDN, here:
- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/progs_12.asp
+ traditional argument vector argv[0], argv[1], etc. It does this
+ using a complex and arcane set of rules which are described here:
+
+ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/progs_12.asp
+
+ (if this URL stops working, you might be able to find it by
+ searching for "Parsing C Command-Line Arguments" on MSDN. Also,
+ the code in the Microsoft C runtime that does this translation
+ is shipped with VC++).
+
+
+Our goal in rawSystem is to take a command filename and list of
+arguments, and construct a string which inverts the translatsions
+described above, such that the program at the other end sees exactly
+the same arguments in its argv[] that we passed to rawSystem.
+
+This inverse translation is implemented by 'translate' below.