Initial checkin of lldb code from internal Apple repo.

llvm-svn: 105619
diff --git a/lldb/source/Core/Language.cpp b/lldb/source/Core/Language.cpp
new file mode 100644
index 0000000..82b4e4f
--- /dev/null
+++ b/lldb/source/Core/Language.cpp
@@ -0,0 +1,150 @@
+//===-- 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;
+}
+