//===-- 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"
#include <string.h>

using namespace lldb;
using namespace lldb_private;

#define ENUM_TO_DCSTREAM(x) case x: s->PutCString(#x); return

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 size_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;
}

