aboutsummaryrefslogtreecommitdiff
path: root/source/Breakpoint/BreakpointID.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Breakpoint/BreakpointID.cpp')
-rw-r--r--source/Breakpoint/BreakpointID.cpp169
1 files changed, 77 insertions, 92 deletions
diff --git a/source/Breakpoint/BreakpointID.cpp b/source/Breakpoint/BreakpointID.cpp
index 81a3dfe50d9b..1ea86ca7611a 100644
--- a/source/Breakpoint/BreakpointID.cpp
+++ b/source/Breakpoint/BreakpointID.cpp
@@ -13,121 +13,106 @@
// C++ Includes
// Other libraries and framework includes
// Project includes
-#include "lldb/Breakpoint/BreakpointID.h"
#include "lldb/Breakpoint/Breakpoint.h"
-#include "lldb/Core/Stream.h"
+#include "lldb/Breakpoint/BreakpointID.h"
#include "lldb/Core/Error.h"
+#include "lldb/Core/Stream.h"
using namespace lldb;
using namespace lldb_private;
-BreakpointID::BreakpointID (break_id_t bp_id, break_id_t loc_id) :
- m_break_id (bp_id),
- m_location_id (loc_id)
-{
-}
+BreakpointID::BreakpointID(break_id_t bp_id, break_id_t loc_id)
+ : m_break_id(bp_id), m_location_id(loc_id) {}
BreakpointID::~BreakpointID() = default;
-const char *BreakpointID::g_range_specifiers[] = { "-", "to", "To", "TO", nullptr };
+static llvm::StringRef g_range_specifiers[] = {"-", "to", "To", "TO"};
-// Tells whether or not STR is valid to use between two strings representing breakpoint IDs, to
-// indicate a range of breakpoint IDs. This is broken out into a separate function so that we can
+// Tells whether or not STR is valid to use between two strings representing
+// breakpoint IDs, to
+// indicate a range of breakpoint IDs. This is broken out into a separate
+// function so that we can
// easily change or add to the format for specifying ID ranges at a later date.
-bool
-BreakpointID::IsRangeIdentifier (const char *str)
-{
- int specifier_count = 0;
- for (int i = 0; g_range_specifiers[i] != nullptr; ++i)
- ++specifier_count;
-
- for (int i = 0; i < specifier_count; ++i)
- {
- if (strcmp (g_range_specifiers[i], str) == 0)
- return true;
- }
+bool BreakpointID::IsRangeIdentifier(llvm::StringRef str) {
+ for (auto spec : g_range_specifiers) {
+ if (spec == str)
+ return true;
+ }
return false;
}
-bool
-BreakpointID::IsValidIDExpression (const char *str)
-{
- break_id_t bp_id;
- break_id_t loc_id;
- BreakpointID::ParseCanonicalReference (str, &bp_id, &loc_id);
+bool BreakpointID::IsValidIDExpression(llvm::StringRef str) {
+ return BreakpointID::ParseCanonicalReference(str).hasValue();
+}
- return (bp_id != LLDB_INVALID_BREAK_ID);
+llvm::ArrayRef<llvm::StringRef> BreakpointID::GetRangeSpecifiers() {
+ return llvm::makeArrayRef(g_range_specifiers);
}
-void
-BreakpointID::GetDescription (Stream *s, lldb::DescriptionLevel level)
-{
- if (level == eDescriptionLevelVerbose)
- s->Printf("%p BreakpointID:", static_cast<void*>(this));
-
- if (m_break_id == LLDB_INVALID_BREAK_ID)
- s->PutCString ("<invalid>");
- else if (m_location_id == LLDB_INVALID_BREAK_ID)
- s->Printf("%i", m_break_id);
- else
- s->Printf("%i.%i", m_break_id, m_location_id);
+void BreakpointID::GetDescription(Stream *s, lldb::DescriptionLevel level) {
+ if (level == eDescriptionLevelVerbose)
+ s->Printf("%p BreakpointID:", static_cast<void *>(this));
+
+ if (m_break_id == LLDB_INVALID_BREAK_ID)
+ s->PutCString("<invalid>");
+ else if (m_location_id == LLDB_INVALID_BREAK_ID)
+ s->Printf("%i", m_break_id);
+ else
+ s->Printf("%i.%i", m_break_id, m_location_id);
}
-void
-BreakpointID::GetCanonicalReference (Stream *s, break_id_t bp_id, break_id_t loc_id)
-{
- if (bp_id == LLDB_INVALID_BREAK_ID)
- s->PutCString ("<invalid>");
- else if (loc_id == LLDB_INVALID_BREAK_ID)
- s->Printf("%i", bp_id);
- else
- s->Printf("%i.%i", bp_id, loc_id);
+void BreakpointID::GetCanonicalReference(Stream *s, break_id_t bp_id,
+ break_id_t loc_id) {
+ if (bp_id == LLDB_INVALID_BREAK_ID)
+ s->PutCString("<invalid>");
+ else if (loc_id == LLDB_INVALID_BREAK_ID)
+ s->Printf("%i", bp_id);
+ else
+ s->Printf("%i.%i", bp_id, loc_id);
}
-bool
-BreakpointID::ParseCanonicalReference (const char *input, break_id_t *break_id_ptr, break_id_t *break_loc_id_ptr)
-{
- *break_id_ptr = LLDB_INVALID_BREAK_ID;
- *break_loc_id_ptr = LLDB_INVALID_BREAK_ID;
-
- if (input == nullptr || *input == '\0')
- return false;
-
- const char *format = "%i%n.%i%n";
- int chars_consumed_1 = 0;
- int chars_consumed_2 = 0;
- int n_items_parsed = ::sscanf (input,
- format,
- break_id_ptr, // %i parse the breakpoint ID
- &chars_consumed_1, // %n gets the number of characters parsed so far
- break_loc_id_ptr, // %i parse the breakpoint location ID
- &chars_consumed_2); // %n gets the number of characters parsed so far
-
- if ((n_items_parsed == 1 && input[chars_consumed_1] == '\0') ||
- (n_items_parsed == 2 && input[chars_consumed_2] == '\0'))
- return true;
-
- // Badly formatted canonical reference.
- *break_id_ptr = LLDB_INVALID_BREAK_ID;
- *break_loc_id_ptr = LLDB_INVALID_BREAK_ID;
- return false;
+llvm::Optional<BreakpointID>
+BreakpointID::ParseCanonicalReference(llvm::StringRef input) {
+ break_id_t bp_id;
+ break_id_t loc_id = LLDB_INVALID_BREAK_ID;
+
+ if (input.empty())
+ return llvm::None;
+
+ // If it doesn't start with an integer, it's not valid.
+ if (input.consumeInteger(0, bp_id))
+ return llvm::None;
+
+ // period is optional, but if it exists, it must be followed by a number.
+ if (input.consume_front(".")) {
+ if (input.consumeInteger(0, loc_id))
+ return llvm::None;
+ }
+
+ // And at the end, the entire string must have been consumed.
+ if (!input.empty())
+ return llvm::None;
+
+ return BreakpointID(bp_id, loc_id);
}
-bool
-BreakpointID::StringIsBreakpointName(const char *name, Error &error)
-{
- error.Clear();
-
- if (name && (name[0] >= 'A' && name[0] <= 'z'))
- {
- if (strcspn(name, ".- ") != strlen(name))
- {
- error.SetErrorStringWithFormat("invalid breakpoint name: \"%s\"", name);
- }
- return true;
- }
- else
- return false;
+bool BreakpointID::StringIsBreakpointName(llvm::StringRef str, Error &error) {
+ error.Clear();
+ if (str.empty())
+ return false;
+
+ // First character must be a letter or _
+ if (!isalpha(str[0]) && str[0] != '_')
+ return false;
+
+ // Cannot contain ., -, or space.
+ if (str.find_first_of(".- ") != llvm::StringRef::npos) {
+ error.SetErrorStringWithFormat("invalid breakpoint name: \"%s\"",
+ str.str().c_str());
+ return false;
+ }
+
+ return true;
}