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