//===-- source/Host/common/OptionParser.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/Host/OptionParser.h"
#include "lldb/Host/HostGetOpt.h"
#include "lldb/lldb-private-types.h"

#include <vector>

using namespace lldb_private;

void
OptionParser::Prepare(std::unique_lock<std::mutex> &lock)
{
    static std::mutex g_mutex;
    lock = std::unique_lock<std::mutex>(g_mutex);
#ifdef __GLIBC__
    optind = 0;
#else
    optreset = 1;
    optind = 1;
#endif
}

void
OptionParser::EnableError(bool error)
{
    opterr = error ? 1 : 0;
}

int
OptionParser::Parse (int argc,
                     char * const argv [],
                     const char *optstring,
                     const Option *longopts,
                     int *longindex)
{
    std::vector<option> opts;
    while (longopts->definition != nullptr)
    {
        option opt;
        opt.flag = longopts->flag;
        opt.val = longopts->val;
        opt.name = longopts->definition->long_option;
        opt.has_arg = longopts->definition->option_has_arg;
        opts.push_back(opt);
        ++longopts;
    }
    opts.push_back(option());
    return getopt_long_only(argc, argv, optstring, &opts[0], longindex);
}

char*
OptionParser::GetOptionArgument()
{
    return optarg;
}

int
OptionParser::GetOptionIndex()
{
    return optind;
}

int
OptionParser::GetOptionErrorCause()
{
    return optopt;
}

std::string
OptionParser::GetShortOptionString(struct option *long_options)
{
    std::string s;
    int i=0;
    bool done = false;
    while (!done)
    {
        if (long_options[i].name    == 0 &&
            long_options[i].has_arg == 0 &&
            long_options[i].flag    == 0 &&
            long_options[i].val     == 0)
        {
            done = true;
        }
        else
        {
            if (long_options[i].flag == NULL &&
                isalpha(long_options[i].val))
            {
                s.append(1, (char)long_options[i].val);
                switch (long_options[i].has_arg)
                {
                    default:
                    case no_argument:
                        break;
                        
                    case optional_argument:
                        s.append(2, ':');
                        break;
                    case required_argument:
                        s.append(1, ':');
                        break;
                }
            }
            ++i;
        }
    }
    return s;
}
