1//===-- source/Host/common/OptionParser.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/Host/OptionParser.h"
11#include "lldb/Host/HostGetOpt.h"
12#include "lldb/lldb-private-types.h"
13
14#include <vector>
15
16using namespace lldb_private;
17
18void
19OptionParser::Prepare(Mutex::Locker &locker)
20{
21    static Mutex g_mutex(Mutex::eMutexTypeNormal);
22    locker.Lock(g_mutex);
23#ifdef __GLIBC__
24    optind = 0;
25#else
26    optreset = 1;
27    optind = 1;
28#endif
29}
30
31void
32OptionParser::EnableError(bool error)
33{
34    opterr = error ? 1 : 0;
35}
36
37int
38OptionParser::Parse (int argc,
39                     char * const argv [],
40                     const char *optstring,
41                     const Option *longopts,
42                     int *longindex)
43{
44    std::vector<option> opts;
45    while (longopts->definition != nullptr)
46    {
47        option opt;
48        opt.flag = longopts->flag;
49        opt.val = longopts->val;
50        opt.name = longopts->definition->long_option;
51        opt.has_arg = longopts->definition->option_has_arg;
52        opts.push_back(opt);
53        ++longopts;
54    }
55    opts.push_back(option());
56    return getopt_long_only(argc, argv, optstring, &opts[0], longindex);
57}
58
59char*
60OptionParser::GetOptionArgument()
61{
62    return optarg;
63}
64
65int
66OptionParser::GetOptionIndex()
67{
68    return optind;
69}
70
71int
72OptionParser::GetOptionErrorCause()
73{
74    return optopt;
75}
76
77std::string
78OptionParser::GetShortOptionString(struct option *long_options)
79{
80    std::string s;
81    int i=0;
82    bool done = false;
83    while (!done)
84    {
85        if (long_options[i].name    == 0 &&
86            long_options[i].has_arg == 0 &&
87            long_options[i].flag    == 0 &&
88            long_options[i].val     == 0)
89        {
90            done = true;
91        }
92        else
93        {
94            if (long_options[i].flag == NULL &&
95                isalpha(long_options[i].val))
96            {
97                s.append(1, (char)long_options[i].val);
98                switch (long_options[i].has_arg)
99                {
100                    default:
101                    case no_argument:
102                        break;
103
104                    case optional_argument:
105                        s.append(2, ':');
106                        break;
107                    case required_argument:
108                        s.append(1, ':');
109                        break;
110                }
111            }
112            ++i;
113        }
114    }
115    return s;
116}
117