1//===-- 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"
13#include <string.h>
14
15using namespace lldb;
16using namespace lldb_private;
17
18#define ENUM_TO_DCSTREAM(x) case x: s->PutCString(#x); return
19
20struct LanguageStrings
21{
22    const char * names[3];
23};
24
25static LanguageStrings
26g_languages[] =
27{
28    { { "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"              } }
49};
50
51static const size_t
52g_num_languages = sizeof(g_languages)/sizeof(LanguageStrings);
53
54Language::Language(LanguageType language) :
55    m_language (language)
56{
57}
58
59Language::~Language()
60{
61}
62
63LanguageType
64Language::GetLanguage() const
65{
66    return m_language;
67}
68
69void
70Language::Clear ()
71{
72    m_language = eLanguageTypeUnknown;
73}
74
75void
76Language::SetLanguage(LanguageType language)
77{
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            {
98                m_language = (LanguageType)i;
99                return true;
100            }
101        }
102    }
103
104    m_language = eLanguageTypeUnknown;
105    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
152