/*******************************************************************************
* Copyright (c) 2010 Ericsson 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:
* Ericsson - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.command.output;
import java.util.ArrayList;
import java.util.List;
/**
* -trace-list-variables
*
* ^done,trace-variables={nr_rows="1",nr_cols="3",
* hdr=[{width="15",alignment="-1",col_name="name",colhdr="Name"},
* {width="11",alignment="-1",col_name="initial",colhdr="Initial"},
* {width="11",alignment="-1",col_name="current",colhdr="Current"}],
* body=[variable={name="$trace_timestamp",initial="0"}
* variable={name="$foo",initial="10",current="15"}]}
*
* @since 3.0
*/
public class MITraceListVariablesInfo extends MIInfo {
public class MITraceVariableInfo {
private String fName;
private String fInitialValue;
private String fCurrentValue;
public String getName() {
return fName;
}
public String getCurrentValue() {
return fCurrentValue;
}
public String getInitialValue() {
return fInitialValue;
}
}
private MITraceVariableInfo[] fVariables;
public MITraceListVariablesInfo(MIOutput out) {
super(out);
parse();
}
public MITraceVariableInfo[] getTraceVariables() {
return fVariables;
}
private void parse() {
List<MITraceVariableInfo> aList = new ArrayList<MITraceVariableInfo>(1);
if (isDone()) {
MIOutput out = getMIOutput();
MIResultRecord rr = out.getMIResultRecord();
if (rr != null) {
MIResult[] results = rr.getMIResults();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
if (var.equals("trace-variables")) { //$NON-NLS-1$
parseTable(results[i].getMIValue(), aList);
}
}
}
}
fVariables = aList.toArray(new MITraceVariableInfo[aList.size()]);
}
private void parseTable(MIValue val, List<MITraceVariableInfo> aList) {
if (val instanceof MITuple) {
MIResult[] table = ((MITuple)val).getMIResults();
for (int i = 0; i < table.length; i++) {
String variable = table[i].getVariable();
if (variable.equals("body")) { //$NON-NLS-1$
parseBody(table[i].getMIValue(), aList);
}
}
}
}
private void parseBody(MIValue body, List<MITraceVariableInfo> aList) {
if (body instanceof MIList) {
MIResult[] vars = ((MIList)body).getMIResults();
for (int i = 0; i < vars.length; i++) {
String variable = vars[i].getVariable();
if (variable.equals("variable")) { //$NON-NLS-1$
parseVariable(vars[i].getMIValue(), aList);
}
}
}
}
private void parseVariable(MIValue variable, List<MITraceVariableInfo> aList) {
if (variable instanceof MITuple) {
MIResult[] results = ((MITuple)variable).getMIResults();
MITraceVariableInfo info = new MITraceVariableInfo();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue value = results[i].getMIValue();
String str = ""; //$NON-NLS-1$
if (value != null && value instanceof MIConst) {
str = ((MIConst)value).getCString();
}
if (var.equals("name")) { //$NON-NLS-1$
info.fName = str;
} else if (var.equals("initial")) { //$NON-NLS-1$
info.fInitialValue = str;
} else if (var.equals("current")) { //$NON-NLS-1$
info.fCurrentValue = str;
}
}
aList.add(info);
}
}
}