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