in com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/DebugUtility.java [604:674]
private static List<String> parseArgumentsNonWindows(String args) {
// man sh, see topic QUOTING
List<String> result = new ArrayList<>();
final int DEFAULT = 0;
final int ARG = 1;
final int IN_DOUBLE_QUOTE = 2;
final int IN_SINGLE_QUOTE = 3;
int state = DEFAULT;
StringBuilder buf = new StringBuilder();
int len = args.length();
for (int i = 0; i < len; i++) {
char ch = args.charAt(i);
if (Character.isWhitespace(ch)) {
if (state == DEFAULT) {
// skip
continue;
} else if (state == ARG) {
state = DEFAULT;
result.add(buf.toString());
buf.setLength(0);
continue;
}
}
switch (state) {
case DEFAULT:
case ARG:
if (ch == '"') {
state = IN_DOUBLE_QUOTE;
} else if (ch == '\'') {
state = IN_SINGLE_QUOTE;
} else if (ch == '\\' && i + 1 < len) {
state = ARG;
ch = args.charAt(++i);
buf.append(ch);
} else {
state = ARG;
buf.append(ch);
}
break;
case IN_DOUBLE_QUOTE:
if (ch == '"') {
state = ARG;
} else if (ch == '\\' && i + 1 < len && (args.charAt(i + 1) == '\\' || args.charAt(i + 1) == '"')) {
ch = args.charAt(++i);
buf.append(ch);
} else {
buf.append(ch);
}
break;
case IN_SINGLE_QUOTE:
if (ch == '\'') {
state = ARG;
} else {
buf.append(ch);
}
break;
default:
throw new IllegalStateException();
}
}
if (buf.length() > 0 || state != DEFAULT) {
result.add(buf.toString());
}
return result;
}