mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 22:10:33 +00:00
This commit is contained in:
@@ -1045,15 +1045,12 @@ proc expandTilde*(path: string): string {.
|
||||
# TODO: handle `~bob` and `~bob/` which means home of bob
|
||||
result = path
|
||||
|
||||
# TODO: consider whether quoteShellPosix, quoteShellWindows, quoteShell, quoteShellCommand
|
||||
# belong in `strutils` instead; they are not specific to paths
|
||||
proc quoteShellWindows*(s: string): string {.noSideEffect, rtl, extern: "nosp$1".} =
|
||||
## Quote `s`, so it can be safely passed to Windows API.
|
||||
##
|
||||
## Based on Python's `subprocess.list2cmdline`.
|
||||
## See `this link <http://msdn.microsoft.com/en-us/library/17w5ykft.aspx>`_
|
||||
## for more details.
|
||||
|
||||
let needQuote = {' ', '\t'} in s or s.len == 0
|
||||
result = ""
|
||||
var backslashBuff = ""
|
||||
@@ -1064,8 +1061,8 @@ proc quoteShellWindows*(s: string): string {.noSideEffect, rtl, extern: "nosp$1"
|
||||
if c == '\\':
|
||||
backslashBuff.add(c)
|
||||
elif c == '\"':
|
||||
result.add(backslashBuff)
|
||||
result.add(backslashBuff)
|
||||
for i in 0..<backslashBuff.len*2:
|
||||
result.add('\\')
|
||||
backslashBuff.setLen(0)
|
||||
result.add("\\\"")
|
||||
else:
|
||||
@@ -1074,9 +1071,13 @@ proc quoteShellWindows*(s: string): string {.noSideEffect, rtl, extern: "nosp$1"
|
||||
backslashBuff.setLen(0)
|
||||
result.add(c)
|
||||
|
||||
if backslashBuff.len > 0:
|
||||
result.add(backslashBuff)
|
||||
if needQuote:
|
||||
result.add(backslashBuff)
|
||||
result.add("\"")
|
||||
|
||||
|
||||
proc quoteShellPosix*(s: string): string {.noSideEffect, rtl, extern: "nosp$1".} =
|
||||
## Quote ``s``, so it can be safely passed to POSIX shell.
|
||||
const safeUnixChars = {'%', '+', '-', '.', '/', '_', ':', '=', '@',
|
||||
|
||||
@@ -622,7 +622,18 @@ block: # quoteShellWindows
|
||||
doAssert quoteShellWindows("aaa\"") == "aaa\\\""
|
||||
doAssert quoteShellWindows("") == "\"\""
|
||||
|
||||
block: # quoteShellWindows
|
||||
block: # quoteShellCommand
|
||||
when defined(windows):
|
||||
doAssert quoteShellCommand(["a b c", "d", "e"]) == """"a b c" d e"""
|
||||
doAssert quoteShellCommand(["""ab"c""", r"\", "d"]) == """ab\"c \ d"""
|
||||
doAssert quoteShellCommand(["""ab"c""", """ \""", "d"]) == """ab\"c " \\" d"""
|
||||
doAssert quoteShellCommand(["""a\\\b""", """de fg""", "h"]) == """a\\\b "de fg" h"""
|
||||
doAssert quoteShellCommand(["""a\"b""", "c", "d"]) == """a\\\"b c d"""
|
||||
doAssert quoteShellCommand(["""a\\b c""", "d", "e"]) == """"a\\b c" d e"""
|
||||
doAssert quoteShellCommand(["""a\\b\ c""", "d", "e"]) == """"a\\b\ c" d e"""
|
||||
doAssert quoteShellCommand(["ab", ""]) == """ab """""
|
||||
|
||||
block: # quoteShellPosix
|
||||
doAssert quoteShellPosix("aaa") == "aaa"
|
||||
doAssert quoteShellPosix("aaa a") == "'aaa a'"
|
||||
doAssert quoteShellPosix("") == "''"
|
||||
|
||||
Reference in New Issue
Block a user