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 16using namespace lldb_private; 17 18void 19OptionParser::Prepare(Mutex::Locker &locker) 20{ 21 static Mutex g_mutex(Mutex::eMutexTypeNormal); 22 locker.Lock(g_mutex); 23#ifdef __GLIBC__ 24 optind = 0; 25#else 26 optreset = 1; 27 optind = 1; 28#endif 29} 30 31void 32OptionParser::EnableError(bool error) 33{ 34 opterr = error ? 1 : 0; 35} 36 37int 38OptionParser::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 59char* 60OptionParser::GetOptionArgument() 61{ 62 return optarg; 63} 64 65int 66OptionParser::GetOptionIndex() 67{ 68 return optind; 69} 70 71int 72OptionParser::GetOptionErrorCause() 73{ 74 return optopt; 75} 76 77std::string 78OptionParser::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} 117