blob: af62af37da0db7afb717f1a6373a7427f56f0d9f [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- Language.cpp --------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/lldb-private.h"
11#include "lldb/Core/Language.h"
12#include "lldb/Core/Stream.h"
Eli Friedman9cb59a12010-06-09 10:16:07 +000013#include <string.h>
Chris Lattner24943d22010-06-08 16:52:24 +000014
15using namespace lldb;
16using namespace lldb_private;
17
18#define ENUM_TO_DCSTREAM(x) case x: s->PutCString(#x); return
19
Eli Friedman9cb59a12010-06-09 10:16:07 +000020struct LanguageStrings
Chris Lattner24943d22010-06-08 16:52:24 +000021{
22 const char * names[3];
23};
24
25static LanguageStrings
26g_languages[] =
27{
Eli Friedman9cb59a12010-06-09 10:16:07 +000028 { { "unknown" , NULL , NULL } },
29 { { "c89" , NULL , "ISO C:1989" } },
30 { { NULL , NULL , "K&R C" } },
31 { { "ada83" , "Ada83" , "ISO Ada:1983" } },
32 { { "c++" , "cxx" , "ISO C++:1998" } },
33 { { "cobol74" , "Cobol74" , "ISO Cobol:1974" } },
34 { { "cobol" , "Cobol85" , "ISO Cobol:1985." } },
35 { { "f77" , "Fortran77" , "ISO Fortran 77." } },
36 { { "f90" , "Fortran90" , "ISO Fortran 90" } },
37 { { "pascal" , "Pascal83" , "ISO Pascal:1983" } },
38 { { "modula2" , "Modula2" , "ISO Modula-2:1996" } },
39 { { "java" , NULL , "Java" } },
40 { { "c" , "C99" , "ISO C:1999" } },
41 { { "ada" , "Ada95" , "ISO Ada:1995" } },
42 { { "f95" , "Fortran95" , "ISO Fortran 95" } },
43 { { "PLI" , NULL , "ANSI PL/I:1976" } },
44 { { "objc" , NULL , "Objective-C" } },
45 { { "objc++" , NULL , "Objective-C++" } },
46 { { "upc" , NULL , "Unified Parallel C" } },
47 { { "d" , NULL , "D" } },
48 { { "python" , NULL , "Python" } }
Chris Lattner24943d22010-06-08 16:52:24 +000049};
50
Greg Clayton54e7afa2010-07-09 20:39:50 +000051static const size_t
Chris Lattner24943d22010-06-08 16:52:24 +000052g_num_languages = sizeof(g_languages)/sizeof(LanguageStrings);
53
Greg Clayton9488b742010-07-28 02:04:09 +000054Language::Language(LanguageType language) :
Chris Lattner24943d22010-06-08 16:52:24 +000055 m_language (language)
56{
57}
58
59Language::~Language()
60{
61}
62
Greg Clayton9488b742010-07-28 02:04:09 +000063LanguageType
Chris Lattner24943d22010-06-08 16:52:24 +000064Language::GetLanguage() const
65{
66 return m_language;
67}
68
69void
70Language::Clear ()
71{
Greg Clayton9488b742010-07-28 02:04:09 +000072 m_language = eLanguageTypeUnknown;
Chris Lattner24943d22010-06-08 16:52:24 +000073}
74
75void
Greg Clayton9488b742010-07-28 02:04:09 +000076Language::SetLanguage(LanguageType language)
Chris Lattner24943d22010-06-08 16:52:24 +000077{
78 m_language = language;
79}
80
81bool
82Language::SetLanguageFromCString(const char *language_cstr)
83{
84 size_t i, desc_idx;
85 const char *name;
86
87 // First check the most common name for the languages
88 for (desc_idx=lldb::eDescriptionLevelBrief; desc_idx<kNumDescriptionLevels; ++desc_idx)
89 {
90 for (i=0; i<g_num_languages; ++i)
91 {
92 name = g_languages[i].names[desc_idx];
93 if (name == NULL)
94 continue;
95
96 if (::strcasecmp (language_cstr, name) == 0)
97 {
Greg Clayton9488b742010-07-28 02:04:09 +000098 m_language = (LanguageType)i;
Chris Lattner24943d22010-06-08 16:52:24 +000099 return true;
100 }
101 }
102 }
103
Greg Clayton9488b742010-07-28 02:04:09 +0000104 m_language = eLanguageTypeUnknown;
Chris Lattner24943d22010-06-08 16:52:24 +0000105 return false;
106}
107
108
109const char *
110Language::AsCString (lldb::DescriptionLevel level) const
111{
112 if (m_language < g_num_languages && level < kNumDescriptionLevels)
113 {
114 const char *name = g_languages[m_language].names[level];
115 if (name)
116 return name;
117 else if (level + 1 < kNumDescriptionLevels)
118 return AsCString ((lldb::DescriptionLevel)(level + 1));
119 else
120 return NULL;
121 }
122 return NULL;
123}
124
125void
126Language::Dump(Stream *s) const
127{
128 GetDescription(s, lldb::eDescriptionLevelVerbose);
129}
130
131void
132Language::GetDescription (Stream *s, lldb::DescriptionLevel level) const
133{
134 const char *lang_cstr = AsCString(level);
135
136 if (lang_cstr)
137 s->PutCString(lang_cstr);
138 else
139 s->Printf("Language(language = 0x%4.4x)", m_language);
140}
141
142
143
144
145Stream&
146lldb_private::operator << (Stream& s, const Language& language)
147{
148 language.Dump(&s);
149 return s;
150}
151