Path: blob/main/contrib/llvm-project/lldb/source/Host/common/OptionParser.cpp
39606 views
//===-- source/Host/common/OptionParser.cpp -------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Host/OptionParser.h"9#include "lldb/Host/HostGetOpt.h"10#include "lldb/Utility/OptionDefinition.h"11#include "lldb/lldb-private-types.h"1213#include <vector>1415using namespace lldb_private;1617void OptionParser::Prepare(std::unique_lock<std::mutex> &lock) {18static std::mutex g_mutex;19lock = std::unique_lock<std::mutex>(g_mutex);20#ifdef __GLIBC__21optind = 0;22#else23optreset = 1;24optind = 1;25#endif26}2728void OptionParser::EnableError(bool error) { opterr = error ? 1 : 0; }2930int OptionParser::Parse(llvm::MutableArrayRef<char *> argv,31llvm::StringRef optstring, const Option *longopts,32int *longindex) {33std::vector<option> opts;34while (longopts->definition != nullptr) {35option opt;36opt.flag = longopts->flag;37opt.val = longopts->val;38opt.name = longopts->definition->long_option;39opt.has_arg = longopts->definition->option_has_arg;40opts.push_back(opt);41++longopts;42}43opts.push_back(option());44std::string opt_cstr = std::string(optstring);45return getopt_long_only(argv.size() - 1, argv.data(), opt_cstr.c_str(),46&opts[0], longindex);47}4849char *OptionParser::GetOptionArgument() { return optarg; }5051int OptionParser::GetOptionIndex() { return optind; }5253int OptionParser::GetOptionErrorCause() { return optopt; }5455std::string OptionParser::GetShortOptionString(struct option *long_options) {56std::string s;57int i = 0;58bool done = false;59while (!done) {60if (long_options[i].name == nullptr && long_options[i].has_arg == 0 &&61long_options[i].flag == nullptr && long_options[i].val == 0) {62done = true;63} else {64if (long_options[i].flag == nullptr && isalpha(long_options[i].val)) {65s.append(1, (char)long_options[i].val);66switch (long_options[i].has_arg) {67default:68case no_argument:69break;7071case optional_argument:72s.append(2, ':');73break;74case required_argument:75s.append(1, ':');76break;77}78}79++i;80}81}82return s;83}848586