1254721Semaste//===-- Language.cpp --------------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/lldb-private.h" 11254721Semaste#include "lldb/Core/Language.h" 12254721Semaste#include "lldb/Core/Stream.h" 13254721Semaste#include <string.h> 14254721Semaste 15254721Semasteusing namespace lldb; 16254721Semasteusing namespace lldb_private; 17254721Semaste 18254721Semaste#define ENUM_TO_DCSTREAM(x) case x: s->PutCString(#x); return 19254721Semaste 20254721Semastestruct LanguageStrings 21254721Semaste{ 22254721Semaste const char * names[3]; 23254721Semaste}; 24254721Semaste 25254721Semastestatic LanguageStrings 26254721Semasteg_languages[] = 27254721Semaste{ 28254721Semaste { { "unknown" , NULL , NULL } }, 29254721Semaste { { "c89" , NULL , "ISO C:1989" } }, 30254721Semaste { { NULL , NULL , "K&R C" } }, 31254721Semaste { { "ada83" , "Ada83" , "ISO Ada:1983" } }, 32254721Semaste { { "c++" , "cxx" , "ISO C++:1998" } }, 33254721Semaste { { "cobol74" , "Cobol74" , "ISO Cobol:1974" } }, 34254721Semaste { { "cobol" , "Cobol85" , "ISO Cobol:1985." } }, 35254721Semaste { { "f77" , "Fortran77" , "ISO Fortran 77." } }, 36254721Semaste { { "f90" , "Fortran90" , "ISO Fortran 90" } }, 37254721Semaste { { "pascal" , "Pascal83" , "ISO Pascal:1983" } }, 38254721Semaste { { "modula2" , "Modula2" , "ISO Modula-2:1996" } }, 39254721Semaste { { "java" , NULL , "Java" } }, 40254721Semaste { { "c" , "C99" , "ISO C:1999" } }, 41254721Semaste { { "ada" , "Ada95" , "ISO Ada:1995" } }, 42254721Semaste { { "f95" , "Fortran95" , "ISO Fortran 95" } }, 43254721Semaste { { "PLI" , NULL , "ANSI PL/I:1976" } }, 44254721Semaste { { "objc" , NULL , "Objective-C" } }, 45254721Semaste { { "objc++" , NULL , "Objective-C++" } }, 46254721Semaste { { "upc" , NULL , "Unified Parallel C" } }, 47254721Semaste { { "d" , NULL , "D" } }, 48254721Semaste { { "python" , NULL , "Python" } } 49254721Semaste}; 50254721Semaste 51254721Semastestatic const size_t 52254721Semasteg_num_languages = sizeof(g_languages)/sizeof(LanguageStrings); 53254721Semaste 54254721SemasteLanguage::Language(LanguageType language) : 55254721Semaste m_language (language) 56254721Semaste{ 57254721Semaste} 58254721Semaste 59254721SemasteLanguage::~Language() 60254721Semaste{ 61254721Semaste} 62254721Semaste 63254721SemasteLanguageType 64254721SemasteLanguage::GetLanguage() const 65254721Semaste{ 66254721Semaste return m_language; 67254721Semaste} 68254721Semaste 69254721Semastevoid 70254721SemasteLanguage::Clear () 71254721Semaste{ 72254721Semaste m_language = eLanguageTypeUnknown; 73254721Semaste} 74254721Semaste 75254721Semastevoid 76254721SemasteLanguage::SetLanguage(LanguageType language) 77254721Semaste{ 78254721Semaste m_language = language; 79254721Semaste} 80254721Semaste 81254721Semastebool 82254721SemasteLanguage::SetLanguageFromCString(const char *language_cstr) 83254721Semaste{ 84254721Semaste size_t i, desc_idx; 85254721Semaste const char *name; 86254721Semaste 87254721Semaste // First check the most common name for the languages 88254721Semaste for (desc_idx=lldb::eDescriptionLevelBrief; desc_idx<kNumDescriptionLevels; ++desc_idx) 89254721Semaste { 90254721Semaste for (i=0; i<g_num_languages; ++i) 91254721Semaste { 92254721Semaste name = g_languages[i].names[desc_idx]; 93254721Semaste if (name == NULL) 94254721Semaste continue; 95254721Semaste 96254721Semaste if (::strcasecmp (language_cstr, name) == 0) 97254721Semaste { 98254721Semaste m_language = (LanguageType)i; 99254721Semaste return true; 100254721Semaste } 101254721Semaste } 102254721Semaste } 103254721Semaste 104254721Semaste m_language = eLanguageTypeUnknown; 105254721Semaste return false; 106254721Semaste} 107254721Semaste 108254721Semaste 109254721Semasteconst char * 110254721SemasteLanguage::AsCString (lldb::DescriptionLevel level) const 111254721Semaste{ 112254721Semaste if (m_language < g_num_languages && level < kNumDescriptionLevels) 113254721Semaste { 114254721Semaste const char *name = g_languages[m_language].names[level]; 115254721Semaste if (name) 116254721Semaste return name; 117254721Semaste else if (level + 1 < kNumDescriptionLevels) 118254721Semaste return AsCString ((lldb::DescriptionLevel)(level + 1)); 119254721Semaste else 120254721Semaste return NULL; 121254721Semaste } 122254721Semaste return NULL; 123254721Semaste} 124254721Semaste 125254721Semastevoid 126254721SemasteLanguage::Dump(Stream *s) const 127254721Semaste{ 128254721Semaste GetDescription(s, lldb::eDescriptionLevelVerbose); 129254721Semaste} 130254721Semaste 131254721Semastevoid 132254721SemasteLanguage::GetDescription (Stream *s, lldb::DescriptionLevel level) const 133254721Semaste{ 134254721Semaste const char *lang_cstr = AsCString(level); 135254721Semaste 136254721Semaste if (lang_cstr) 137254721Semaste s->PutCString(lang_cstr); 138254721Semaste else 139254721Semaste s->Printf("Language(language = 0x%4.4x)", m_language); 140254721Semaste} 141254721Semaste 142254721Semaste 143254721Semaste 144254721Semaste 145254721SemasteStream& 146254721Semastelldb_private::operator << (Stream& s, const Language& language) 147254721Semaste{ 148254721Semaste language.Dump(&s); 149254721Semaste return s; 150254721Semaste} 151254721Semaste 152