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