1//===--- Arg.cpp - Argument Implementations -------------------------------===// 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 "llvm/Option/Arg.h" 11#include "llvm/ADT/SmallString.h" 12#include "llvm/ADT/Twine.h" 13#include "llvm/Option/ArgList.h" 14#include "llvm/Option/Option.h" 15#include "llvm/Support/raw_ostream.h" 16#include "llvm/Support/Debug.h" 17 18using namespace llvm; 19using namespace llvm::opt; 20 21Arg::Arg(const Option Opt, StringRef S, unsigned Index, const Arg *BaseArg) 22 : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false), 23 OwnsValues(false) {} 24 25Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0, 26 const Arg *BaseArg) 27 : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false), 28 OwnsValues(false) { 29 Values.push_back(Value0); 30} 31 32Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0, 33 const char *Value1, const Arg *BaseArg) 34 : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false), 35 OwnsValues(false) { 36 Values.push_back(Value0); 37 Values.push_back(Value1); 38} 39 40Arg::~Arg() { 41 if (OwnsValues) { 42 for (unsigned i = 0, e = Values.size(); i != e; ++i) 43 delete[] Values[i]; 44 } 45} 46 47void Arg::print(raw_ostream& O) const { 48 O << "<"; 49 50 O << " Opt:"; 51 Opt.print(O); 52 53 O << " Index:" << Index; 54 55 O << " Values: ["; 56 for (unsigned i = 0, e = Values.size(); i != e; ++i) { 57 if (i) O << ", "; 58 O << "'" << Values[i] << "'"; 59 } 60 61 O << "]>\n"; 62} 63 64LLVM_DUMP_METHOD void Arg::dump() const { print(dbgs()); } 65 66std::string Arg::getAsString(const ArgList &Args) const { 67 SmallString<256> Res; 68 llvm::raw_svector_ostream OS(Res); 69 70 ArgStringList ASL; 71 render(Args, ASL); 72 for (ArgStringList::iterator 73 it = ASL.begin(), ie = ASL.end(); it != ie; ++it) { 74 if (it != ASL.begin()) 75 OS << ' '; 76 OS << *it; 77 } 78 79 return OS.str(); 80} 81 82void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const { 83 if (!getOption().hasNoOptAsInput()) { 84 render(Args, Output); 85 return; 86 } 87 88 Output.append(Values.begin(), Values.end()); 89} 90 91void Arg::render(const ArgList &Args, ArgStringList &Output) const { 92 switch (getOption().getRenderStyle()) { 93 case Option::RenderValuesStyle: 94 Output.append(Values.begin(), Values.end()); 95 break; 96 97 case Option::RenderCommaJoinedStyle: { 98 SmallString<256> Res; 99 llvm::raw_svector_ostream OS(Res); 100 OS << getSpelling(); 101 for (unsigned i = 0, e = getNumValues(); i != e; ++i) { 102 if (i) OS << ','; 103 OS << getValue(i); 104 } 105 Output.push_back(Args.MakeArgString(OS.str())); 106 break; 107 } 108 109 case Option::RenderJoinedStyle: 110 Output.push_back(Args.GetOrMakeJoinedArgString( 111 getIndex(), getSpelling(), getValue(0))); 112 Output.append(Values.begin() + 1, Values.end()); 113 break; 114 115 case Option::RenderSeparateStyle: 116 Output.push_back(Args.MakeArgString(getSpelling())); 117 Output.append(Values.begin(), Values.end()); 118 break; 119 } 120} 121