/******************************************************************************* * Copyright (c) 2000, 2011 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 * Abeer Bagul (Tensilica) - Differentiate between hw breakpoint and watchpoint *******************************************************************************/ package org.eclipse.cdt.debug.mi.core.output; /** * Contain info about the GDB/MI breakpoint info. *<ul> * <li> * -break-insert main * ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"} * (gdb) * </li> * <li> * -break-insert -t main * ^done,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"} * </li> * <li> * -break-insert -c 1 main ^done,bkpt={number="3",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",cond="1",times="0"} * </li> * <li> * -break-insert -h main * ^done,bkpt={number="4",type="hw breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"} * <li> * -break-insert -p 0 main * ^done,bkpt={number="5",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",thread="0",thread="0",times="0"} * </li> * <li> * -break-insert -a p * ^done,hw-awpt={number="2",exp="p"} * </li> * <li> * -break-watch -r p * ^done,hw-rwpt={number="4",exp="p"} * </li> * <li> * -break-watch p * ^done,wpt={number="6",exp="p"} * </li> *</ul> */ public class MIBreakpoint { int number; String type = ""; //$NON-NLS-1$ String disp = ""; //$NON-NLS-1$ boolean enabled; String address; String func = ""; //$NON-NLS-1$ String file = ""; //$NON-NLS-1$ int line; String cond = ""; //$NON-NLS-1$ int times; String what = ""; //$NON-NLS-1$ String threadId = ""; //$NON-NLS-1$ int ignore; boolean isWpt; boolean isAWpt; boolean isRWpt; boolean isWWpt; boolean isHdw; public MIBreakpoint(MITuple tuple) { parse(tuple); } public int getNumber() { return number; } public void setNumber(int num) { number = num; } public String getType() { return type; } public boolean isTemporary() { return getDisposition().equals("del"); //$NON-NLS-1$ } public boolean isWatchpoint() { return isWpt; } public void setWatchpoint(boolean w) { isWpt = w; } public boolean isHardware() { return isHdw; } public void setHardware(boolean hd) { isHdw = hd; } public boolean isAccessWatchpoint() { return isAWpt; } public void setAccessWatchpoint(boolean a) { isWpt = a; isAWpt = a; } public boolean isReadWatchpoint() { return isRWpt; } public void setReadWatchpoint(boolean r) { isWpt = r; isRWpt = r; } public boolean isWriteWatchpoint() { return isWWpt; } public void setWriteWatchpoint(boolean w) { isWpt = w; isWWpt = w; } public String getDisposition() { return disp; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean e) { enabled = e; } public String 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; } public int getIgnoreCount() { return ignore; } public String getCondition() { return cond; } public String getThreadId() { return threadId; } 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 = ""; //$NON-NLS-1$ if (value != null && value instanceof MIConst) { str = ((MIConst)value).getCString(); } if (var.equals("number")) { //$NON-NLS-1$ try { number = Integer.parseInt(str.trim()); } catch (NumberFormatException e) { } } else if (var.equals("type")) { //$NON-NLS-1$ type = str; //type="hw watchpoint" if (type.startsWith("hw")) { //$NON-NLS-1$ isHdw = true; if (type.indexOf("watchpoint") != -1) {//$NON-NLS-1$ isWWpt = true; isWpt = true; } } //type="acc watchpoint" if (type.startsWith("acc")) { //$NON-NLS-1$ isWWpt = true; isRWpt = true; isWpt = true; } //type="read watchpoint" if (type.startsWith("read")) { //$NON-NLS-1$ isRWpt = true; isWpt = true; } // ?? if (type.equals("watchpoint")) { //$NON-NLS-1$ isWpt = true; } // type="breakpoint" // default ok. } else if (var.equals("disp")) { //$NON-NLS-1$ disp = str; } else if (var.equals("enabled")) { //$NON-NLS-1$ enabled = str.equals("y"); //$NON-NLS-1$ } else if (var.equals("addr")) { //$NON-NLS-1$ try { address = str.trim(); } catch (NumberFormatException e) { } } else if (var.equals("func")) { //$NON-NLS-1$ func = str; } else if (var.equals("file")) { //$NON-NLS-1$ file = str; } else if (var.equals("thread")) { //$NON-NLS-1$ threadId = str; } else if (var.equals("line")) { //$NON-NLS-1$ try { line = Integer.parseInt(str.trim()); } catch (NumberFormatException e) { } } else if (var.equals("times")) { //$NON-NLS-1$ try { times = Integer.parseInt(str.trim()); } catch (NumberFormatException e) { } } else if (var.equals("what") || var.equals("exp")) { //$NON-NLS-1$ //$NON-NLS-2$ what = str; } else if (var.equals("ignore")) { //$NON-NLS-1$ try { ignore = Integer.parseInt(str.trim()); } catch (NumberFormatException e) { } } else if (var.equals("cond")) { //$NON-NLS-1$ cond = str; } } } public void setFile(String file) { this.file = file; } /** * @since 7.0 */ public void setLine(int line) { this.line = line; } }