1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

more work on the parser

This commit is contained in:
Alain Magloire 2002-08-04 04:44:37 +00:00
parent f63d52130f
commit ec210de636
25 changed files with 857 additions and 145 deletions

View file

@ -9,6 +9,7 @@ Note this is an interim the document and subject to changes.
****
This MI implementation is base on GDB/MI 5.2.1.
* Command/Response channels
To create an MISession an InputStream and OutputStream are
needed(assuming this the pipe connected to gdb).
MISession MIPlugin.createSession(InputStream, OutputStream);
@ -26,6 +27,57 @@ for a synchronous response(MIResultRecord). Any out-of-band
responses(MIOOBRecord) are dispatch, clients interested in those
notifications should register to MISession.
* MI Parsing
There is a generic MI parser (MIParser) constructing an Abstract
Syntax Tree. For example, a ResultRecord response after a
break-insert, the parser will generate this AST:
-break-insert main
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x08048468",func="main",file="hello.c",line="4",times="0"}
- MIOutput
- MIOOBRecord[0]
- MIResutRecord
- token = 0
- ResultClass = "done"
- MIResult[1]
- MIResult[0]
- variable = "bkpt"
- value = MITuple
- MIResult[9]
- MiResult[0]
- variable = "number"
- MIConst = "1"
- MiResult[1]
- variable = "type"
- MIConst = "breakpoint"
- MiResult[2]
- variable = "disp"
- MIConst = "keep"
- MiResult[3]
- variable = "enabled"
- MIConst = "y"
- MiResult[4]
- variable = "addr"
- MIConst = "0x08048468"
- MiResult[5]
- variable = "func"
- MIConst = "main"
- MiResult[6]
- variable = "file"
- MIConst = "hello.c"
- MiResult[7]
- variable = "line"
- MIConst = "4"
- MiResult[8]
- variable = "times"
- MIConst = "0"
MICommands will do there own parsing:
session = MISession(in, out);
MIBreakInsert cmd = new MIBreakInsert("main");
session.postCommand(cmd); // sent to gdb.
MIBreakInsertInfo info = cmd.getBreakInsertInfo(); // Parsing of the Result Record.
****
MI <==> CDI Adapters
@ -33,4 +85,4 @@ MI <==> CDI Adapters
To do.
</pre>
</body>
</html>
</html>

View file

@ -2,7 +2,6 @@ package org.eclipse.cdt.debug.mi.core;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.output.MIOutput;
@ -13,8 +12,8 @@ import org.eclipse.cdt.debug.mi.core.output.MIParser;
*/
public class MISession {
InputStream in;
OutputStream out;
InputStream inChannel;
OutputStream outChannel;
Thread txThread;
Thread rxThread;
@ -22,9 +21,9 @@ public class MISession {
Queue txQueue;
Queue rxQueue;
Reader consoleStream = null;
Reader targetStream = null;
Reader logStream = null;
OutputStream consoleStream = null;
OutputStream targetStream = null;
OutputStream logStream = null;
CommandFactory factory;
@ -34,8 +33,8 @@ public class MISession {
* The constructor.
*/
MISession(InputStream i, OutputStream o) {
in = i;
out = o;
inChannel = i;
outChannel= o;
factory = new CommandFactory();
parser = new MIParser();
txQueue = new Queue();
@ -49,21 +48,21 @@ public class MISession {
/**
* Set Console Stream.
*/
public void setConsoleStream(Reader console) {
public void setConsoleStream(OutputStream console) {
consoleStream = console;
}
/**
* Set Target Stream.
*/
public void setTargetStreamOutput(Reader target) {
public void setTargetStreamOutput(OutputStream target) {
targetStream = target;
}
/**
* Set Log Stream
*/
public void setLogStreamOutput(Reader log) {
public void setLogStreamOutput(OutputStream log) {
logStream = log;
}
@ -103,12 +102,12 @@ public class MISession {
return rxQueue;
}
InputStream getInputStream() {
return in;
InputStream getChannelInputStream() {
return inChannel;
}
OutputStream getOutputStream() {
return out;
OutputStream getChannelOutputStream() {
return outChannel;
}
MIOutput parse(String buffer) {

View file

@ -33,7 +33,7 @@ public class RxThread extends Thread {
*/
public void run () {
BufferedReader reader =
new BufferedReader(new InputStreamReader(session.getInputStream()));
new BufferedReader(new InputStreamReader(session.getChannelInputStream()));
StringBuffer buffer = new StringBuffer();
try {
while (true) {

View file

@ -39,7 +39,7 @@ public class TxThread extends Thread {
// - Remove from the TxQueue
// - Move to the RxQueue
if (cmd != null) {
OutputStream out = session.getOutputStream();
OutputStream out = session.getChannelOutputStream();
cmd.setToken(token);
//System.out.println("Tx " + cmd.toString());
try {

View file

@ -32,8 +32,8 @@ public class CommandFactory {
return new MIBreakInsert(isTemporary, isHardware, condition, ignoreCount, line);
}
public MIBreakInsert createMIBreakInsert(String regex) {
return new MIBreakInsert(regex);
public MIBreakInsert createMIBreakInsert(String func) {
return new MIBreakInsert(func);
}
public MIBreakList createMIBreakList() {

View file

@ -50,6 +50,10 @@ package org.eclipse.cdt.debug.mi.core.command;
*/
public class MIBreakInsert extends MICommand
{
public MIBreakInsert(String func) {
this(false, false, null, 0, func);
}
public MIBreakInsert(boolean isTemporary, boolean isHardware,
String condition, int ignoreCount, String line) {
super("-break-insert");
@ -93,8 +97,4 @@ public class MIBreakInsert extends MICommand
}
setParameters(new String[]{line});
}
public MIBreakInsert(String regex) {
super("-break-insert", new String[]{"-r"}, new String[]{regex});
}
}

View file

@ -110,6 +110,10 @@ public class MICommand extends Command
token = t;
}
public MIOutput getMIOutput() {
return miOutput;
}
public void setMIOutput(MIOutput mi) {
miOutput = mi;
}

View file

@ -0,0 +1,76 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class MIArg {
String name;
String value;
public MIArg(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
/**
* Parsing a MIList of the form:
* [{name="xxx",value="yyy"},{name="xxx",value="yyy"},..]
*/
public static MIArg[] getMIArgs(MIList miList) {
List aList = new ArrayList();
MIResult[] results = miList.getMIResults();
for (int i = 0; i < results.length; i++) {
MIValue value = results[i].getMIValue();
if (value instanceof MITuple) {
MIArg arg = getMIArg((MITuple)value);
if (arg != null) {
aList.add(arg);
}
}
}
return ((MIArg[])aList.toArray(new MIArg[aList.size()]));
}
/**
* Parsing a MITuple of the form:
* {name="xxx",value="yyy"}
*/
public static MIArg getMIArg(MITuple tuple) {
MIResult[] args = tuple.getMIResults();
MIArg arg = null;
if (args.length == 2) {
// Name
String aName = "";
MIValue value = args[0].getMIValue();
if (value != null && value instanceof MIConst) {
aName = ((MIConst)value).getString();
} else {
aName = "";
}
// Value
String aValue = "";
value = args[1].getMIValue();
if (value != null && value instanceof MIConst) {
aValue = ((MIConst)value).getString();
} else {
aValue = "";
}
arg = new MIArg(aName, aValue);
}
return arg;
}
}

View file

@ -0,0 +1,83 @@
package org.eclipse.cdt.debug.mi.core.output;
/**
*/
public class MIAsm {
long address;
String func = "";
long offset;
String inst = "";
int line;
String file = "";
public MIAsm(MITuple tuple) {
parse(tuple);
}
public long getAddress() {
return address;
}
public String getFunction() {
return func;
}
public long getOffset() {
return offset;
}
public String getInstruction() {
return inst;
}
public int getLine() {
return line;
}
public String getFile() {
return file;
}
void parse(MITuple tuple) {
MIResult[] results = tuple.getMIResults();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue value = results[i].getMIValue();
String str = "";
if (value instanceof MITuple) {
parse((MITuple)value);
continue;
}
if (value != null && value instanceof MIConst) {
str = ((MIConst)value).getString();
}
if (var.equals("address")) {
try {
address = Long.parseLong(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("func-name")) {
func = str;
} else if (var.equals("offset")) {
try {
offset = Long.parseLong(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("inst")) {
inst = str;
} else if (var.equals("line")) {
try {
line = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("file")) {
file = str;
}
}
}
}

View file

@ -0,0 +1,88 @@
package org.eclipse.cdt.debug.mi.core.output;
/**
* ^done,reason="breakpoint-hit",bkptno="1",thread-id="0",frame={addr="0x08048468",func="main",args=[{name="argc",value="1"},{name="argv",value="0xbffff18c"}],file="hello.c",line="4"}
*
*/
public class MIBreakHitInfo {
int bkptno;
int threadId;
MIFrame frame;
String file = "";
int line;
MIExecAsyncOutput exec;
MIResultRecord rr;
public MIBreakHitInfo(MIExecAsyncOutput record) {
exec = record;
}
public MIBreakHitInfo(MIResultRecord record) {
rr = record;
}
public int getBreakNumber() {
return bkptno;
}
public int getThreadId() {
return threadId;
}
public MIFrame getFrame() {
return frame;
}
public String getFile() {
return file;
}
public int getLine() {
return line;
}
void parse () {
MIResult[] results = null;
if (exec != null) {
results = exec.getMIResults();
} else if (rr != null) {
results = rr.getMIResults();
}
if (results != null) {
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue value = results[i].getMIValue();
String str = "";
if (value != null && value instanceof MIConst) {
str = ((MIConst)value).getString();
}
if (var.equals("bkptno")) {
try {
bkptno = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("thread-id")) {
try {
threadId = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("frame")) {
if (value instanceof MITuple) {
frame = new MIFrame((MITuple)value);
}
} else if (var.equals("file")) {
file = str;
} else if (var.equals("line")) {
try {
line = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
}
}
}
}
}

View file

@ -0,0 +1,47 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
/**
* -break-insert main
* ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x08048468",func="main",file="hello.c",line="4",times="0"}
*/
public class MIBreakInsertInfo extends MIInfo {
MIBreakPoint[] breakpoints;
void parse() {
List aList = new ArrayList(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("bkpt")) {
MIValue val = results[i].getMIValue();
if (val instanceof MITuple) {
aList.add(new MIBreakPoint((MITuple)val));
}
}
}
}
}
breakpoints = (MIBreakPoint[])aList.toArray(new MIBreakPoint[aList.size()]);
}
public MIBreakInsertInfo(MIOutput record) {
super(record);
}
public MIBreakPoint[] getBreakPoints() {
if (breakpoints == null) {
parse();
}
return breakpoints;
}
}

View file

@ -1,26 +1,73 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
/**
* A -break-list result-record is the form:
* <pre>
* ^done,BreakpointTable={nr_rows="1",nr_cols="6",hdr=[..],body=[brkpt={},brkpt={}]}
* </pre>
*/
public class MIBreakListInfo extends MIInfo {
public class BreakPoint {
int number;
String type;
String disposition;
boolean enabled;
int address;
String what;
int times;
}
MIBreakPoint[] breakpoints;
public MIBreakListInfo(MIOutput rr) {
super(rr);
}
BreakPoint[] getBreakPoints() {
return null;
public MIBreakPoint[] getBreakPoints() {
if (breakpoints == null) {
parse();
}
return breakpoints;
}
void parse() {
List aList = new ArrayList(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("BreakpointTable")) {
parseTable(results[i].getMIValue(), aList);
}
}
}
}
breakpoints = (MIBreakPoint[])aList.toArray(new MIBreakPoint[aList.size()]);
}
void parseTable(MIValue val, List aList) {
if (val instanceof MITuple) {
MIResult[] table = ((MITuple)val).getMIResults();
for (int j = 0; j < table.length; j++) {
String variable = table[j].getVariable();
if (variable.equals("body")) {
parseBody(table[j].getMIValue(), aList);
}
}
}
}
void parseBody(MIValue body, List aList) {
if (body instanceof MIList) {
MIResult[] bkpts = ((MIList)body).getMIResults();
for (int i = 0; i < bkpts.length; i++) {
String b = bkpts[i].getVariable();
if (b.equals("bkpt")) {
MIValue value = bkpts[i].getMIValue();
if (value instanceof MITuple) {
aList.add(new MIBreakPoint((MITuple)value));
}
}
}
}
}
}

View file

@ -0,0 +1,107 @@
package org.eclipse.cdt.debug.mi.core.output;
/**
*/
public class MIBreakPoint {
int number;
String type = "";
String disp = "";
boolean enabled;
long address;
String func = "";
String file = "";
int line;
int times;
String what = "";
public MIBreakPoint(MITuple tuple) {
parse(tuple);
}
public int getNumber() {
return number;
}
public String getType() {
return type;
}
public String getDisposition() {
return disp;
}
public boolean isEnabled() {
return enabled;
}
public long getAddress() {
return address;
}
public String getFunction() {
return func;
}
public String getFile() {
return file;
}
public int getLine() {
return line;
}
public int getTimes() {
return times;
}
public String getWhat() {
return what;
}
void parse(MITuple tuple) {
MIResult[] results = tuple.getMIResults();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue value = results[i].getMIValue();
String str = "";
if (value != null && value instanceof MIConst) {
str = ((MIConst)value).getString();
}
if (var.equals("number")) {
try {
number = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("type")) {
type = str;
} else if (var.equals("disp")) {
disp = str;
} else if (var.equals("enabled")) {
enabled = str.equals("y");
} else if (var.equals("addr")) {
try {
address = Long.parseLong(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("func")) {
func = str;
} else if (var.equals("file")) {
file = str;
} else if (var.equals("line")) {
try {
line = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("times")) {
try {
times = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("what") || var.equals("exp")) {
what = str;
}
}
}
}

View file

@ -1,20 +1,50 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.debug.mi.core.command.MIBreakInsert;
/**
* -break-watch buf
* ^done,wpt={number="2",exp="buf"}
*/
public class MIBreakWatchInfo extends MIInfo {
MIBreakPoint[] watchpoints = null;
public MIBreakWatchInfo(MIOutput rr) {
super(rr);
}
public int getNumber () {
return 0;
public MIBreakPoint[] getBreakpoints () {
if (watchpoints == null) {
parse();
}
return watchpoints;
}
public String getExpression() {
return null;
void parse() {
List aList = new ArrayList(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("wpt")) {
MIValue val = results[i].getMIValue();
if (val instanceof MITuple) {
aList.add(new MIBreakPoint((MITuple)val));
}
}
}
}
}
watchpoints = (MIBreakPoint[])aList.toArray(new MIBreakPoint[aList.size()]);
}
}

View file

@ -1,36 +0,0 @@
package org.eclipse.cdt.debug.mi.core.output;
/**
*/
public class MIBreakpointHitInfo extends MIInfo {
public MIBreakpointHitInfo(MIOutput record) {
super(record);
}
int getBreakNumber() {
return 0;
}
String getFunction() {
return null;
}
int getAddress() {
return 0;
}
String getFileName() {
return null;
}
int getLineNumber() {
return 0;
}
String[] getArguments () {
return null;
}
}

View file

@ -1,32 +0,0 @@
package org.eclipse.cdt.debug.mi.core.output;
/**
*/
public class MIBreakpointInfo extends MIInfo {
public MIBreakpointInfo(MIOutput record) {
super(record);
}
int getBreakNumber() {
return 0;
}
String getFunction() {
return null;
}
int getAddress() {
return 0;
}
String getFileName() {
return null;
}
int getLineNumber() {
return 0;
}
}

View file

@ -12,4 +12,11 @@ public class MIConst extends MIValue {
public void setCString(String str) {
cstring = str;
}
/**
* Translate gdb c-string.
*/
public String getString() {
return cstring;
}
}

View file

@ -1,25 +1,68 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class MIDataDisassembleInfo extends MIInfo {
public class ASM {
int address;
String function;
int offset;
String instruction;
int line;
String file;
}
MIAsm[] asms;
public MIDataDisassembleInfo(MIOutput rr) {
super(rr);
}
public ASM[] getData() {
return null;
public MIAsm[] getAsm() {
if (asms == null) {
parse();
}
return asms;
}
void parse() {
List aList = new ArrayList();
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("asm_insns")) {
MIValue value = results[i].getMIValue();
if (value instanceof MIList) {
parse((MIList)value, aList);
}
}
}
}
}
asms = (MIAsm[])aList.toArray(new MIAsm[aList.size()]);
}
void parse(MIList list, List aList) {
// src and assenbly is different
MIResult[] results = list.getMIResults();
if (results != null && results.length > 0) {
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
if (var.equals("src_and_asm_line")) {
MIValue value = results[i].getMIValue();
if (value instanceof MITuple) {
aList.add(new MIAsm((MITuple)value));
}
}
}
}
MIValue[] values = list.getMIValues();
if (values != null && values.length > 0) {
for (int i = 0; i < values.length; i++) {
if (values[i] instanceof MITuple) {
aList.add(new MIAsm((MITuple)values[i]));
}
}
}
}
}

View file

@ -6,11 +6,36 @@ package org.eclipse.cdt.debug.mi.core.output;
*/
public class MIDataEvaluateExpressionInfo extends MIInfo{
String expr;
public MIDataEvaluateExpressionInfo(MIOutput rr) {
super(rr);
}
public String getValue() {
return null;
public String getExpression() {
if (expr == null) {
parse();
}
return expr;
}
void parse() {
expr = "";
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("value")) {
MIValue value = results[i].getMIValue();
if (value instanceof MIConst) {
expr = ((MIConst)value).getString();
}
}
}
}
}
}
}

View file

@ -1,14 +1,62 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class MIDataListChangedRegistersInfo extends MIInfo {
int[] registers;
public MIDataListChangedRegistersInfo(MIOutput rr) {
super(rr);
}
int[] getRegisters() {
return null;
if (registers == null) {
parse();
}
return registers;
}
void parse() {
List aList = new ArrayList();
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("changed-registers")) {
MIValue value = results[i].getMIValue();
if (value instanceof MIList) {
parseRegisters((MIList)value, aList);
}
}
}
}
}
registers = new int[aList.size()];
for (int i = 0; i < aList.size(); i++) {
String str = (String)aList.get(i);
try {
registers[i] = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
}
}
void parseRegisters(MIList list, List aList) {
MIValue[] values = list.getMIValues();
for (int i = 0; i < values.length; i++) {
if (values[i] instanceof MIConst) {
String str = ((MIConst)values[i]).getString();
if (str != null && str.length() > 0) {
aList.add(str);
}
}
}
}
}

View file

@ -1,16 +1,55 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class MIDataListRegistersNamesInfo extends MIInfo {
String[] names;
public MIDataListRegistersNamesInfo(MIOutput rr) {
super(rr);
}
String[] getRegistersNames () {
return null;
if (names == null) {
parse();
}
return names;
}
void parse() {
List aList = new ArrayList();
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("register-names")) {
MIValue value = results[i].getMIValue();
if (value instanceof MIList) {
parseRegisters((MIList)value, aList);
}
}
}
}
}
names = (String[])aList.toArray(new String[aList.size()]);
}
void parseRegisters(MIList list, List aList) {
MIValue[] values = list.getMIValues();
for (int i = 0; i < values.length; i++) {
if (values[i] instanceof MIConst) {
String str = ((MIConst)values[i]).getString();
if (str != null && str.length() > 0) {
aList.add(str);
}
}
}
}
}

View file

@ -0,0 +1,68 @@
package org.eclipse.cdt.debug.mi.core.output;
/**
*/
public class MIFrame {
int level;
long addr;
String func;
String file;
int line;
MIArg[] args = new MIArg[0];
public MIFrame(MITuple tuple) {
parse(tuple);
}
public MIArg[] getArgs() {
return args;
}
public String getFunction() {
return func;
}
public int getLevel() {
return level;
}
void parse(MITuple tuple) {
MIResult[] results = tuple.getMIResults();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue value = results[i].getMIValue();
String str = "";
if (value != null && value instanceof MIConst) {
str = ((MIConst)value).getString();
}
if (var.equals("level")) {
try {
level = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("addr")) {
try {
addr = Long.parseLong(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("func")) {
func = str;
} else if (var.equals("file")) {
file = str;
} else if (var.equals("line")) {
try {
line = Integer.parseInt(str);
} catch (NumberFormatException e) {
}
} else if (var.equals("args")) {
if (value instanceof MIList) {
args = MIArg.getMIArgs((MIList)value);
}
}
}
}
}

View file

@ -12,7 +12,38 @@ public class MIInfo {
miOutput = record;
}
MIOutput getMIOutput () {
public MIOutput getMIOutput () {
return miOutput;
}
public boolean isDone() {
return isResultClass(MIResultRecord.DONE);
}
public boolean isRunning() {
return isResultClass(MIResultRecord.RUNNING);
}
public boolean isConnected() {
return isResultClass(MIResultRecord.CONNECTED);
}
public boolean isError() {
return isResultClass(MIResultRecord.ERROR);
}
public boolean isExit() {
return isResultClass(MIResultRecord.EXIT);
}
boolean isResultClass(String rc) {
if (miOutput != null) {
MIResultRecord rr = miOutput.getMIResultRecord();
if (rr != null) {
String clazz = rr.getResultClass();
return clazz.equals(rc);
}
}
return false;
}
}

View file

@ -158,7 +158,7 @@ public class MIParser {
if (buffer.charAt(0) == ',') {
String s = buffer.substring(1);
MIResult[] res = processMIResults(s);
rr.setResults(res);
rr.setMIResults(res);
}
return rr;
}
@ -304,10 +304,12 @@ public class MIParser {
if (sb.charAt(0) == '"') {
sb.deleteCharAt(0);
}
for (int i = 0; i < sb.length() || termination; i++) {
int i = 0;
for (i = 0; i < sb.length() || termination; i++) {
switch (sb.charAt(i)) {
case '\\':
if (escape) {
sb.setCharAt(i, '\\');
sb.deleteCharAt(i - 1);
escape = false;
} else {
@ -315,22 +317,6 @@ public class MIParser {
}
break;
case 'n':
if (escape) {
sb.setCharAt(i, '\n');
sb.deleteCharAt(i - 1);
escape = false;
}
break;
case 'r':
if (escape) {
sb.setCharAt(i, '\n');
sb.deleteCharAt(i - 1);
escape = false;
}
break;
case '"':
if (escape) {
sb.setCharAt(i, '"');
@ -345,6 +331,6 @@ public class MIParser {
escape = false;
}
}
return sb.toString();
return sb.substring(0, i);
}
}

View file

@ -33,14 +33,14 @@ public class MIResultRecord {
resultClass = type;
}
public MIResult[] getResults() {
public MIResult[] getMIResults() {
if (results == null) {
return nullResults;
}
return results;
}
public void setResults(MIResult[] res) {
public void setMIResults(MIResult[] res) {
results = res;
}
}