Files
clang-p2996/lldb/source/Core/Language.cpp
2010-06-08 16:52:24 +00:00

151 lines
3.8 KiB
C++

//===-- 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"
using namespace lldb;
using namespace lldb_private;
#define ENUM_TO_DCSTREAM(x) case x: s->PutCString(#x); return
typedef 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 uint32_t
g_num_languages = sizeof(g_languages)/sizeof(LanguageStrings);
Language::Language(Language::Type language) :
m_language (language)
{
}
Language::~Language()
{
}
Language::Type
Language::GetLanguage() const
{
return m_language;
}
void
Language::Clear ()
{
m_language = Unknown;
}
void
Language::SetLanguage(Language::Type 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 = (Language::Type)i;
return true;
}
}
}
m_language = Unknown;
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;
}