001 package nl.cwi.sen1.tide.adapters.gdb; 002 003 import java.util.regex.Matcher; 004 import java.util.regex.Pattern; 005 006 public class ContinueCmd extends Command 007 { 008 private static Pattern patternStoppedKnown; 009 private static Pattern patternStoppedUnknown; 010 private static Pattern patternFrame; 011 private GdbProcess process; 012 013 static { 014 patternStoppedKnown = Pattern.compile("\032\032([^:]+):([0-9]+):.*"); 015 patternStoppedUnknown = Pattern.compile("0x[0-9a-f]+\\sin\\s.+()"); 016 patternFrame = Pattern.compile("#([0-9]+)\\s+.*"); 017 } 018 019 public ContinueCmd(GdbAdapter adapter, GdbProcess process) 020 { 021 super(adapter); 022 this.process = process; 023 } 024 025 public String command() 026 { 027 switch(adapter.calcRunMode()) { 028 case GdbAdapter.MODE_STEP_INTO: 029 System.err.println("single stepping..."); 030 return "step\n"; 031 case GdbAdapter.MODE_STEP_OVER: 032 System.err.println("stepping over..."); 033 return "next\n"; 034 case GdbAdapter.MODE_RUN: 035 System.err.println("running..."); 036 return "cont\n"; 037 default: 038 throw new RuntimeException("illegal run-mode!"); 039 } 040 } 041 042 public boolean response(String line) 043 { 044 if(line.startsWith("Breakpoint")) { 045 return false; 046 } 047 048 Matcher matcher; 049 050 matcher = patternFrame.matcher(line); 051 052 if(matcher.matches()) { 053 int level = Integer.parseInt(matcher.group(1)); 054 process.setStackLevel(level); 055 debugMsg("*** stack level: " + level); 056 return false; 057 } 058 059 matcher = patternStoppedKnown.matcher(line); 060 if(matcher.matches()) { 061 String file = matcher.group(1); 062 int linenr = Integer.parseInt(matcher.group(2)); 063 debugMsg("execution stopped: file=" + file + ",line=" + linenr); 064 process.setCpe(file, linenr); 065 return true; 066 } 067 068 matcher = patternStoppedUnknown.matcher(line); 069 if(matcher.matches()) { 070 debugMsg("execution stopped at unknown: " + line); 071 process.setCpe(null, 0); 072 return true; 073 } 074 075 if (line.startsWith("Program exited normally")) { 076 process.setCpe(null, 0); 077 return true; 078 } 079 080 System.out.println("line '" + line + "' does not match with patternStopped"); 081 return false; 082 } 083 }