1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

[263924] - fixed windows command line parsing

This commit is contained in:
Alena Laskavaia 2009-02-09 21:40:58 +00:00
parent ea1399cf07
commit cbe4c97b64
2 changed files with 168 additions and 3 deletions

View file

@ -11,6 +11,12 @@ public class CommandLineUtilTest extends TestCase {
}
private String[] parse(String line) {
return CommandLineUtil.argumentsToArrayUnixStyle(line);
}
private String[] parseWin(String line) {
return CommandLineUtil.argumentsToArrayWindowsStyle(line);
}
private String[] parseU(String line) {
return CommandLineUtil.argumentsToArray(line);
}
@ -166,4 +172,43 @@ public class CommandLineUtilTest extends TestCase {
assertEquals(1, args.length);
assertEquals("a\nb", args[0]);
}
public void testArgumentsToArraySimpleWin() {
String[] args = parseWin("A=B C");
assertEquals(2, args.length);
assertEquals("A=B", args[0]);
assertEquals("C", args[1]);
}
public void testArgumentsToArrayWindowsFiles() {
String[] args = parseWin("my\\file\\path");
assertEquals(1, args.length);
assertEquals("my\\file\\path", args[0]);
}
public void testArgumentsToArrayWindowsSpaces() {
String[] args = parseWin("\"my\\file\\path space\"");
assertEquals(1, args.length);
assertEquals("my\\file\\path space", args[0]);
}
public void testArgumentsToArrayWindowsEmpty() {
String[] args = parseWin("\"\"");
assertEquals(1, args.length);
assertEquals("", args[0]);
}
public void testArgumentsToArrayWindowsQuotes() {
String[] args = parseWin("\\\"a b\\\"");
assertEquals(2, args.length);
assertEquals("\"a", args[0]);
assertEquals("b\"", args[1]);
}
public void testArgumentsToArraySimpleUniversal() {
String[] args = parseU("A=B C D");
assertEquals(3, args.length);
assertEquals("A=B", args[0]);
assertEquals("C", args[1]);
assertEquals("D", args[2]);
}
}

View file

@ -2,6 +2,8 @@ package org.eclipse.cdt.utils;
import java.util.ArrayList;
import org.eclipse.osgi.service.environment.Constants;
/**
* Utilities to work with command line, parse arguments, etc.
* @noextend This class is not intended to be subclassed by clients.
@ -10,6 +12,19 @@ import java.util.ArrayList;
*/
public class CommandLineUtil {
public static String[] argumentsToArray(String line) {
boolean osWin;
try {
osWin = Platform.getOS().equals(Constants.OS_WIN32);
} catch (Exception e) {
osWin = false;
}
if (osWin) {
return argumentsToArrayWindowsStyle(line);
} else {
return argumentsToArrayUnixStyle(line);
}
}
/**
* Parsing arguments in a shell style.
* i.e.
@ -23,7 +38,7 @@ public class CommandLineUtil {
* @param line
* @return array of arguments, or empty array if line is null or empty
*/
public static String[] argumentsToArray(String line) {
public static String[] argumentsToArrayUnixStyle(String line) {
final int INITIAL = 0;
final int IN_DOUBLE_QUOTES = 1;
final int IN_DOUBLE_QUOTES_ESCAPED = 2;
@ -122,4 +137,109 @@ public class CommandLineUtil {
}
return aList.toArray(new String[aList.size()]);
}
/**
* Parsing arguments in a cmd style.
* i.e.
* <code>
* ["a b c" d] -> [[a b c],[d]]
* [a d] -> [[a],[d]]
* ['"quoted"'] -> [['quoted']]
* [\\ \" \a] -> [[\\],["],[\a]]
* ["str\\str\a"] -> [[str\\str\a]]
* </code>
* @param line
* @return array of arguments, or empty array if line is null or empty
*/
public static String[] argumentsToArrayWindowsStyle(String line) {
final int INITIAL = 0;
final int IN_DOUBLE_QUOTES = 1;
final int IN_DOUBLE_QUOTES_ESCAPED = 2;
final int ESCAPED = 3;
final int IN_ARG = 5;
if (line == null) {
line = ""; //$NON-NLS-1$
}
char[] array = line.trim().toCharArray();
ArrayList<String> aList = new ArrayList<String>();
StringBuilder buffer = new StringBuilder();
int state = INITIAL;
for (int i = 0; i < array.length; i++) {
char c = array[i];
switch (state) {
case IN_ARG:
// fall through
case INITIAL:
if (Character.isWhitespace(c)) {
if (state == INITIAL) break; // ignore extra spaces
// add argument
state = INITIAL;
String arg = buffer.toString();
buffer = new StringBuilder();
aList.add(arg);
} else {
switch (c) {
case '\\':
state = ESCAPED;
break;
case '\"':
state = IN_DOUBLE_QUOTES;
break;
default:
state = IN_ARG;
buffer.append(c);
break;
}
}
break;
case IN_DOUBLE_QUOTES:
switch (c) {
case '\\':
state = IN_DOUBLE_QUOTES_ESCAPED;
break;
case '\"':
state = IN_ARG;
break;
default:
buffer.append(c);
break;
}
break;
case IN_DOUBLE_QUOTES_ESCAPED:
switch (c) {
case '\"':
buffer.append(c);
break;
default:
buffer.append('\\');
buffer.append(c);
break;
}
state = IN_DOUBLE_QUOTES;
break;
case ESCAPED:
state = IN_ARG;
switch (c) {
case ' ':
case '\"':
buffer.append(c);
break;
default:
buffer.append('\\');
buffer.append(c);
break;
}
break;
}
}
if (state != INITIAL) { // this allow to process empty string as an argument
aList.add(buffer.toString());
}
return aList.toArray(new String[aList.size()]);
}
}