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
Prepare()19 OptionParser::Prepare()
20 {
21 #ifdef __GLIBC__
22 optind = 0;
23 #else
24 optreset = 1;
25 optind = 1;
26 #endif
27 }
28
29 void
EnableError(bool error)30 OptionParser::EnableError(bool error)
31 {
32 opterr = error ? 1 : 0;
33 }
34
35 int
Parse(int argc,char * const argv[],const char * optstring,const Option * longopts,int * longindex)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*
GetOptionArgument()58 OptionParser::GetOptionArgument()
59 {
60 return optarg;
61 }
62
63 int
GetOptionIndex()64 OptionParser::GetOptionIndex()
65 {
66 return optind;
67 }
68
69 int
GetOptionErrorCause()70 OptionParser::GetOptionErrorCause()
71 {
72 return optopt;
73 }
74
75 std::string
GetShortOptionString(struct option * long_options)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