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