From ec210de636bc6779e5646ba4a02ea236eef4c29c Mon Sep 17 00:00:00 2001
From: Alain Magloire <alain@qnx.com>
Date: Sun, 4 Aug 2002 04:44:37 +0000
Subject: [PATCH] more work on the parser

---
 .../org.eclipse.cdt.debug.mi.core/design.txt  |  54 ++++++++-
 .../eclipse/cdt/debug/mi/core/MISession.java  |  29 +++--
 .../eclipse/cdt/debug/mi/core/RxThread.java   |   2 +-
 .../eclipse/cdt/debug/mi/core/TxThread.java   |   2 +-
 .../debug/mi/core/command/CommandFactory.java |   4 +-
 .../debug/mi/core/command/MIBreakInsert.java  |   8 +-
 .../cdt/debug/mi/core/command/MICommand.java  |   4 +
 .../cdt/debug/mi/core/output/MIArg.java       |  76 +++++++++++++
 .../cdt/debug/mi/core/output/MIAsm.java       |  83 ++++++++++++++
 .../debug/mi/core/output/MIBreakHitInfo.java  |  88 ++++++++++++++
 .../mi/core/output/MIBreakInsertInfo.java     |  47 ++++++++
 .../debug/mi/core/output/MIBreakListInfo.java |  69 +++++++++--
 .../debug/mi/core/output/MIBreakPoint.java    | 107 ++++++++++++++++++
 .../mi/core/output/MIBreakWatchInfo.java      |  38 ++++++-
 .../mi/core/output/MIBreakpointHitInfo.java   |  36 ------
 .../mi/core/output/MIBreakpointInfo.java      |  32 ------
 .../cdt/debug/mi/core/output/MIConst.java     |   7 ++
 .../mi/core/output/MIDataDisassembleInfo.java |  65 +++++++++--
 .../output/MIDataEvaluateExpressionInfo.java  |  29 ++++-
 .../MIDataListChangedRegistersInfo.java       |  50 +++++++-
 .../output/MIDataListRegistersNamesInfo.java  |  43 ++++++-
 .../cdt/debug/mi/core/output/MIFrame.java     |  68 +++++++++++
 .../cdt/debug/mi/core/output/MIInfo.java      |  33 +++++-
 .../cdt/debug/mi/core/output/MIParser.java    |  24 +---
 .../debug/mi/core/output/MIResultRecord.java  |   4 +-
 25 files changed, 857 insertions(+), 145 deletions(-)
 create mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIArg.java
 create mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java
 create mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakHitInfo.java
 create mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakInsertInfo.java
 create mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakPoint.java
 delete mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointHitInfo.java
 delete mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointInfo.java
 create mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIFrame.java

diff --git a/debug/org.eclipse.cdt.debug.mi.core/design.txt b/debug/org.eclipse.cdt.debug.mi.core/design.txt
index 54664f41905..5542af6d32c 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/design.txt
+++ b/debug/org.eclipse.cdt.debug.mi.core/design.txt
@@ -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>
\ No newline at end of file
+</html>
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java
index dd75e72af40..2fcbeb6b6fc 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java
@@ -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) {
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java
index 6eab87b7eb9..be91f1abecd 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java
@@ -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) {
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java
index 14586acdb6e..e883ab76edb 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java
@@ -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 {
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java
index d290ed392a3..cb301e52104 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java
@@ -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() {
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java
index fc2e29edace..06aafd1220b 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java
@@ -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});
-	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java
index 33ddeb391fa..c624110a581 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java
@@ -110,6 +110,10 @@ public class MICommand extends Command
 		token = t;
 	}
 
+	public MIOutput getMIOutput() {
+		return miOutput;
+	}
+
 	public void setMIOutput(MIOutput mi) {
 		miOutput = mi;
 	}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIArg.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIArg.java
new file mode 100644
index 00000000000..5aeec87a26b
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIArg.java
@@ -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;
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java
new file mode 100644
index 00000000000..dc2d9083ce9
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java
@@ -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;
+			}
+		}
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakHitInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakHitInfo.java
new file mode 100644
index 00000000000..31303f915a9
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakHitInfo.java
@@ -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) {
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakInsertInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakInsertInfo.java
new file mode 100644
index 00000000000..06045e14960
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakInsertInfo.java
@@ -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;
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java
index 95722fb6f38..a765ac3d2b0 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java
@@ -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));
+					}
+				}
+			}
+		}
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakPoint.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakPoint.java
new file mode 100644
index 00000000000..b00964beac1
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakPoint.java
@@ -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;
+			}
+		}
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java
index a6342171644..2d6309f2769 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java
@@ -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()]);
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointHitInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointHitInfo.java
deleted file mode 100644
index c898ab6fcc8..00000000000
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointHitInfo.java
+++ /dev/null
@@ -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;
-	}
-}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointInfo.java
deleted file mode 100644
index 87d6d945eeb..00000000000
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointInfo.java
+++ /dev/null
@@ -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;
-	}
-}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java
index d189800f6a0..d7b74d773e1 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java
@@ -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;
+	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java
index 0d848564ee6..ec9a4a2f560 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java
@@ -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]));
+				}
+			}
+		}
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java
index cd67bf4f879..30e042e92aa 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java
@@ -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();
+						}
+					}
+				}
+			}
+		}
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java
index f130a6f3413..64b2962714a 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java
@@ -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);
+				}
+			}
+		}
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java
index ceb989afc6c..d1bba94184d 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java
@@ -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);
+				}
+			}
+		}
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIFrame.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIFrame.java
new file mode 100644
index 00000000000..7051c7f59f0
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIFrame.java
@@ -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);
+				}
+			}
+		}
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java
index 817e3338da2..4a16659ae03 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java
@@ -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;
+	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java
index c327c42d531..67da4a8445b 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java
@@ -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);
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java
index 1c5aeb5cee0..742de854b16 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java
@@ -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;
 	}
 }