diff options
Diffstat (limited to 'source/Core/Language.cpp')
-rw-r--r-- | source/Core/Language.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/source/Core/Language.cpp b/source/Core/Language.cpp new file mode 100644 index 000000000000..af62af37da0d --- /dev/null +++ b/source/Core/Language.cpp @@ -0,0 +1,151 @@ +//===-- Language.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/lldb-private.h" +#include "lldb/Core/Language.h" +#include "lldb/Core/Stream.h" +#include <string.h> + +using namespace lldb; +using namespace lldb_private; + +#define ENUM_TO_DCSTREAM(x) case x: s->PutCString(#x); return + +struct LanguageStrings +{ + const char * names[3]; +}; + +static LanguageStrings +g_languages[] = +{ + { { "unknown" , NULL , NULL } }, + { { "c89" , NULL , "ISO C:1989" } }, + { { NULL , NULL , "K&R C" } }, + { { "ada83" , "Ada83" , "ISO Ada:1983" } }, + { { "c++" , "cxx" , "ISO C++:1998" } }, + { { "cobol74" , "Cobol74" , "ISO Cobol:1974" } }, + { { "cobol" , "Cobol85" , "ISO Cobol:1985." } }, + { { "f77" , "Fortran77" , "ISO Fortran 77." } }, + { { "f90" , "Fortran90" , "ISO Fortran 90" } }, + { { "pascal" , "Pascal83" , "ISO Pascal:1983" } }, + { { "modula2" , "Modula2" , "ISO Modula-2:1996" } }, + { { "java" , NULL , "Java" } }, + { { "c" , "C99" , "ISO C:1999" } }, + { { "ada" , "Ada95" , "ISO Ada:1995" } }, + { { "f95" , "Fortran95" , "ISO Fortran 95" } }, + { { "PLI" , NULL , "ANSI PL/I:1976" } }, + { { "objc" , NULL , "Objective-C" } }, + { { "objc++" , NULL , "Objective-C++" } }, + { { "upc" , NULL , "Unified Parallel C" } }, + { { "d" , NULL , "D" } }, + { { "python" , NULL , "Python" } } +}; + +static const size_t +g_num_languages = sizeof(g_languages)/sizeof(LanguageStrings); + +Language::Language(LanguageType language) : + m_language (language) +{ +} + +Language::~Language() +{ +} + +LanguageType +Language::GetLanguage() const +{ + return m_language; +} + +void +Language::Clear () +{ + m_language = eLanguageTypeUnknown; +} + +void +Language::SetLanguage(LanguageType language) +{ + m_language = language; +} + +bool +Language::SetLanguageFromCString(const char *language_cstr) +{ + size_t i, desc_idx; + const char *name; + + // First check the most common name for the languages + for (desc_idx=lldb::eDescriptionLevelBrief; desc_idx<kNumDescriptionLevels; ++desc_idx) + { + for (i=0; i<g_num_languages; ++i) + { + name = g_languages[i].names[desc_idx]; + if (name == NULL) + continue; + + if (::strcasecmp (language_cstr, name) == 0) + { + m_language = (LanguageType)i; + return true; + } + } + } + + m_language = eLanguageTypeUnknown; + return false; +} + + +const char * +Language::AsCString (lldb::DescriptionLevel level) const +{ + if (m_language < g_num_languages && level < kNumDescriptionLevels) + { + const char *name = g_languages[m_language].names[level]; + if (name) + return name; + else if (level + 1 < kNumDescriptionLevels) + return AsCString ((lldb::DescriptionLevel)(level + 1)); + else + return NULL; + } + return NULL; +} + +void +Language::Dump(Stream *s) const +{ + GetDescription(s, lldb::eDescriptionLevelVerbose); +} + +void +Language::GetDescription (Stream *s, lldb::DescriptionLevel level) const +{ + const char *lang_cstr = AsCString(level); + + if (lang_cstr) + s->PutCString(lang_cstr); + else + s->Printf("Language(language = 0x%4.4x)", m_language); +} + + + + +Stream& +lldb_private::operator << (Stream& s, const Language& language) +{ + language.Dump(&s); + return s; +} + |