]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Host/common/OptionParser.cpp
Import mandoc 1.4.1rc2
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Host / common / OptionParser.cpp
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(std::unique_lock<std::mutex> &lock)
20 {
21     static std::mutex g_mutex;
22     lock = std::unique_lock<std::mutex>(g_mutex);
23 #ifdef __GLIBC__
24     optind = 0;
25 #else
26     optreset = 1;
27     optind = 1;
28 #endif
29 }
30
31 void
32 OptionParser::EnableError(bool error)
33 {
34     opterr = error ? 1 : 0;
35 }
36
37 int
38 OptionParser::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
59 char*
60 OptionParser::GetOptionArgument()
61 {
62     return optarg;
63 }
64
65 int
66 OptionParser::GetOptionIndex()
67 {
68     return optind;
69 }
70
71 int
72 OptionParser::GetOptionErrorCause()
73 {
74     return optopt;
75 }
76
77 std::string
78 OptionParser::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 }