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