Created
April 18, 2016 16:59
-
-
Save Elizaveta239/736366d046cc7fe814202cdd8a5f3737 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def str_to_args_windows(args): | |
# see http:#msdn.microsoft.com/en-us/library/a1y7w461.aspx | |
result = [] | |
DEFAULT = 0 | |
ARG = 1 | |
IN_DOUBLE_QUOTE = 2 | |
state = DEFAULT | |
backslashes = 0 | |
buf = '' | |
args_len = len(args) | |
for i in xrange(args_len): | |
ch = args[i] | |
if (ch == '\\'): | |
backslashes += 1 | |
continue | |
elif (backslashes != 0): | |
if ch == '"': | |
while backslashes >= 2: | |
backslashes -= 2 | |
buf += '\\' | |
if (backslashes == 1): | |
if (state == DEFAULT): | |
state = ARG | |
buf += '"' | |
backslashes = 0 | |
continue | |
# else fall through to switch | |
else: | |
# false alarm, treat passed backslashes literally... | |
if (state == DEFAULT): | |
state = ARG | |
while backslashes > 0: | |
backslashes -= 1 | |
buf += '\\' | |
# fall through to switch | |
if ch in (' ', '\t'): | |
if (state == DEFAULT): | |
# skip | |
continue | |
elif (state == ARG): | |
state = DEFAULT | |
result.append(buf) | |
buf = '' | |
continue | |
if state in (DEFAULT, ARG): | |
if ch == '"': | |
state = IN_DOUBLE_QUOTE | |
else: | |
state = ARG | |
buf += ch | |
elif state == IN_DOUBLE_QUOTE: | |
if ch == '"': | |
if (i + 1 < args_len and args[i + 1] == '"'): | |
# Undocumented feature in Windows: | |
# Two consecutive double quotes inside a double-quoted argument are interpreted as | |
# a single double quote. | |
buf += '"' | |
i += 1 | |
elif len(buf) == 0: | |
# empty string on Windows platform. Account for bug in constructor of | |
# JDK's java.lang.ProcessImpl. | |
result.append("\"\"") | |
state = DEFAULT | |
else: | |
state = ARG | |
else: | |
buf += ch | |
else: | |
raise RuntimeError('Illegal condition') | |
if len(buf) > 0 or state != DEFAULT: | |
result.append(buf) | |
return result |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment