/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.command;
/**
*
* Represents a MI command.
*/
public class MICommand extends Command {
final static String[] empty = new String[0];
String[] fOptions = empty;
String[] fParameters = empty;
String fOperation = new String();
String fMIVersion;
public MICommand(String miVersion, String oper) {
this(miVersion, oper, empty);
}
public MICommand(String miVersion, String oper, String[] params) {
this(miVersion, oper, empty, params);
}
public MICommand(String miVersion, String oper, String[] opt, String[] params) {
fMIVersion = miVersion;
fOperation = oper;
fOptions = opt;
fParameters = params;
}
/**
* Return the MI version for this command
* @return
*/
public String getMIVersion() {
return fMIVersion;
}
/**
* Set the MI version for this command
* @param miVersion
*/
public void setMIVersion(String miVersion) {
fMIVersion = miVersion;
}
/**
* whether the MI version is "mi1"
* @return
*/
public boolean isMI1() {
return MIVersion.MI1.equalsIgnoreCase(fMIVersion);
}
/**
* whether the MI version is "mi2"
* @return
*/
public boolean isMI2() {
return MIVersion.MI2.equalsIgnoreCase(fMIVersion);
}
/**
* Returns the operation of this command.
*
* @return the operation of this command
*/
public String getOperation() {
return fOperation;
}
protected void setOperation(String op) {
fOperation = op;
}
/**
* Returns an array of command's options. An empty collection is
* returned if there are no options.
*
* @return an array of command's options
*/
public String[] getOptions() {
return fOptions;
}
public void setOptions(String[] opt) {
fOptions = opt;
}
/**
* Returns an array of command's parameters. An empty collection is
* returned if there are no parameters.
*
* @return an array of command's parameters
*/
public String[] getParameters() {
return fParameters;
}
public void setParameters(String[] p) {
fParameters = p;
}
protected String optionsToString() {
String[] options = getOptions();
StringBuffer sb = new StringBuffer();
if (options != null && options.length > 0) {
for (int i = 0; i < options.length; i++) {
String option = options[i];
// If the option argument contains " or \ it must be escaped
if (option.indexOf('"') != -1 || option.indexOf('\\') != -1) {
StringBuffer buf = new StringBuffer();
for (int j = 0; j < option.length(); j++) {
char c = option.charAt(j);
if (c == '"' || c == '\\') {
buf.append('\\');
}
buf.append(c);
}
option = buf.toString();
}
// If the option contains a space according to
// GDB/MI spec we must surround it with double quotes.
if (option.indexOf('\t') != -1 || option.indexOf(' ') != -1) {
sb.append(' ').append('"').append(option).append('"');
} else {
sb.append(' ').append(option);
}
}
}
return sb.toString().trim();
}
protected String parametersToString() {
String[] parameters = getParameters();
String[] options = getOptions();
StringBuffer buffer = new StringBuffer();
if (parameters != null && parameters.length > 0) {
// According to GDB/MI spec
// Add a "--" separator if any parameters start with "-"
if (options != null && options.length > 0) {
for (int i = 0; i < parameters.length; i++) {
if (parameters[i].startsWith("-")) { //$NON-NLS-1$
buffer.append('-').append('-');
break;
}
}
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < parameters.length; i++) {
// We need to escape the double quotes and the backslash.
sb.setLength(0);
String param = parameters[i];
for (int j = 0; j < param.length(); j++) {
char c = param.charAt(j);
if (c == '"' || c == '\\') {
sb.append('\\');
}
sb.append(c);
}
// If the string contains spaces instead of escaping
// surround the parameter with double quotes.
if (containsWhitespace(param)) {
sb.insert(0, '"');
sb.append('"');
}
buffer.append(' ').append(sb);
}
}
return buffer.toString().trim();
}
public String toString() {
StringBuffer command = new StringBuffer(getToken() + getOperation());
String opt = optionsToString();
if (opt.length() > 0) {
command.append(' ').append(opt);
}
String p = parametersToString();
if (p.length() > 0) {
command.append(' ').append(p);
}
command.append('\n');
return command.toString();
}
protected boolean containsWhitespace(String s) {
for (int i = 0; i < s.length(); i++) {
if (Character.isWhitespace(s.charAt(i))) {
return true;
}
}
return false;
}
}