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