inline bool TestIfMarkedForRemoval(cb::shared_ptr<cbWatch> watch) { if(watch->IsRemoved()) return true; else { watch->RemoveMarkedChildren(); return false; } }
bool ParseGDBWatchValue(cb::shared_ptr<GDBWatch> watch, wxString const &inputValue) { if(inputValue.empty()) { watch->SetValue(inputValue); return true; } wxString value = RemoveWarnings(inputValue); // Try to find the first brace. // If the watch is for a reference the brace is not at position = 0 wxString::size_type start = value.find(wxT('{')); if (start != wxString::npos && value[value.length() - 1] == wxT('}')) { // make sure the value is correct, even when the type has changed watch->SetValue(wxEmptyString); int t_start = start + 1; bool result = ParseGDBWatchValue(watch, value, t_start, value.length() - 2); if (result) { if (start > 0) { wxString referenceValue = value.substr(0, start); referenceValue.Trim(true); referenceValue.Trim(false); if (referenceValue.EndsWith(wxT("="))) { referenceValue.RemoveLast(1); referenceValue.Trim(true); } watch->SetValue(referenceValue); } watch->RemoveMarkedChildren(); } return result; } else { watch->SetValue(value); watch->RemoveChildren(); return true; } return false; }
bool ParseCDBWatchValue(cb::shared_ptr<GDBWatch> watch, wxString const &value) { wxArrayString lines = GetArrayFromString(value, wxT('\n')); watch->SetDebugValue(value); watch->MarkChildsAsRemoved(); if (lines.GetCount() == 0) return false; static wxRegEx unexpected_error(wxT("^Unexpected token '.+'$")); static wxRegEx resolve_error(wxT("^Couldn't resolve error at '.+'$")); // search for errors for (unsigned ii = 0; ii < lines.GetCount(); ++ii) { if (unexpected_error.Matches(lines[ii]) || resolve_error.Matches(lines[ii]) || lines[ii] == wxT("No pointer for operator* '<EOL>'")) { watch->SetValue(lines[ii]); return true; } } if (lines.GetCount() == 1) { wxArrayString tokens = GetArrayFromString(lines[0], wxT(' ')); if (tokens.GetCount() < 2) return false; int type_token = 0; if (tokens[0] == wxT("class") || tokens[0] == wxT("struct")) type_token = 1; if (static_cast<int>(tokens.GetCount()) < type_token + 2) return false; int value_start = type_token + 1; if (tokens[type_token + 1] == wxT('*')) { watch->SetType(tokens[type_token] + tokens[type_token + 1]); value_start++; } else watch->SetType(tokens[type_token]); if(value_start >= static_cast<int>(tokens.GetCount())) return false; watch->SetValue(tokens[value_start]); watch->RemoveMarkedChildren(); return true; } else { wxArrayString tokens = GetArrayFromString(lines[0], wxT(' ')); if (tokens.GetCount() < 2) return false; bool set_type = true; if (tokens.GetCount() > 2) { if (tokens[0] == wxT("struct") || tokens[0] == wxT("class")) { if (tokens[2] == wxT('*') || tokens[2].StartsWith(wxT("["))) { watch->SetType(tokens[1] + tokens[2]); set_type = false; } } else { if (tokens[1] == wxT('*') || tokens[1].StartsWith(wxT("["))) { watch->SetType(tokens[0] + tokens[1]); watch->SetValue(lines[1]); return true; } } } if (set_type) watch->SetType(tokens[1]); static wxRegEx class_line(wxT("[ \\t]*\\+(0x[0-9a-f]+)[ \\t]([a-zA-Z0-9_]+)[ \\t]+:[ \\t]+(.+)")); if (!class_line.IsValid()) { int *p = NULL; *p = 0; } else { if (!class_line.Matches(wxT(" +0x000 a : 10"))) { int *p = NULL; *p = 0; } } for (unsigned ii = 1; ii < lines.GetCount(); ++ii) { if (class_line.Matches(lines[ii])) { cb::shared_ptr<GDBWatch> w = AddChild(watch, class_line.GetMatch(lines[ii], 2)); w->SetValue(class_line.GetMatch(lines[ii], 3)); w->SetDebugValue(lines[ii]); } } watch->RemoveMarkedChildren(); return true; } return false; }