diff options
author | Enrico Granata <egranata@apple.com> | 2014-08-07 19:22:14 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2014-08-07 19:22:14 +0000 |
commit | a02d6255133b90e87383411c51a169f87615429c (patch) | |
tree | 699a1d999286b06cbb49bdfff24c8b11f29df44f /lldb/source/Utility | |
parent | 4d2357948b6a5c4e232fa988c364e4dcd0193288 (diff) | |
download | bcm5719-llvm-a02d6255133b90e87383411c51a169f87615429c.tar.gz bcm5719-llvm-a02d6255133b90e87383411c51a169f87615429c.zip |
Add a StringLexer utility class that can be used when you have string data that needs to be parsed - I don't think such a general purpose facility is part of LLVM, and I am going to need this, so just add it to lldb_utility
llvm-svn: 215133
Diffstat (limited to 'lldb/source/Utility')
-rw-r--r-- | lldb/source/Utility/StringLexer.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/lldb/source/Utility/StringLexer.cpp b/lldb/source/Utility/StringLexer.cpp new file mode 100644 index 00000000000..69880d21e96 --- /dev/null +++ b/lldb/source/Utility/StringLexer.cpp @@ -0,0 +1,93 @@ +//===--------------------- StringLexer.cpp -----------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/StringLexer.h" + +using namespace lldb_utility; + +StringLexer::StringLexer (std::string s) : +m_data(s), +m_position(0), +m_putback_data() +{ } + +StringLexer::StringLexer (const StringLexer& rhs) : +m_data(rhs.m_data), +m_position(rhs.m_position), +m_putback_data(rhs.m_putback_data) +{ } + +StringLexer::Character +StringLexer::Peek () +{ + if (m_putback_data.empty()) + return m_data[m_position]; + else + return m_putback_data.front(); +} + +bool +StringLexer::NextIf (Character c) +{ + auto val = Peek(); + if (val == c) + { + Next(); + return true; + } + return false; +} + +StringLexer::Character +StringLexer::Next () +{ + auto val = Peek(); + Consume(); + return val; +} + +bool +StringLexer::HasAtLeast (Size s) +{ + return m_data.size()-m_position >= s; +} + + +void +StringLexer::PutBack (Character c) +{ + m_putback_data.push_back(c); +} + +bool +StringLexer::HasAny (Character c) +{ + return m_data.find(c, m_position) != std::string::npos; +} + +void +StringLexer::Consume() +{ + if (m_putback_data.empty()) + m_position++; + else + m_putback_data.pop_front(); +} + +StringLexer& +StringLexer::operator = (const StringLexer& rhs) +{ + if (this != &rhs) + { + m_data = rhs.m_data; + m_position = rhs.m_position; + m_putback_data = rhs.m_putback_data; + } + return *this; +} |