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 "clang/Driver/Arg.h" 11 #include "clang/Driver/ArgList.h" 12 #include "clang/Driver/Option.h" 13 #include "llvm/ADT/SmallString.h" 14 #include "llvm/ADT/Twine.h" 15 #include "llvm/Support/raw_ostream.h" 16 17 using namespace clang::driver; 18 19 Arg::Arg(const Option *_Opt, unsigned _Index, const Arg *_BaseArg) 20 : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), 21 Claimed(false), OwnsValues(false) { 22 } 23 24 Arg::Arg(const Option *_Opt, unsigned _Index, 25 const char *Value0, const Arg *_BaseArg) 26 : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), 27 Claimed(false), OwnsValues(false) { 28 Values.push_back(Value0); 29 } 30 31 Arg::Arg(const Option *_Opt, unsigned _Index, 32 const char *Value0, const char *Value1, const Arg *_BaseArg) 33 : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), 34 Claimed(false), OwnsValues(false) { 35 Values.push_back(Value0); 36 Values.push_back(Value1); 37 } 38 39 Arg::~Arg() { 40 if (OwnsValues) { 41 for (unsigned i = 0, e = Values.size(); i != e; ++i) 42 delete[] Values[i]; 43 } 44 } 45 46 void 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 63 std::string Arg::getAsString(const ArgList &Args) const { 64 llvm::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 79 void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const { 80 if (!getOption().hasNoOptAsInput()) { 81 render(Args, Output); 82 return; 83 } 84 85 for (unsigned i = 0, e = getNumValues(); i != e; ++i) 86 Output.push_back(getValue(Args, i)); 87 } 88 89 void Arg::render(const ArgList &Args, ArgStringList &Output) const { 90 switch (getOption().getRenderStyle()) { 91 case Option::RenderValuesStyle: 92 for (unsigned i = 0, e = getNumValues(); i != e; ++i) 93 Output.push_back(getValue(Args, i)); 94 break; 95 96 case Option::RenderCommaJoinedStyle: { 97 llvm::SmallString<256> Res; 98 llvm::raw_svector_ostream OS(Res); 99 OS << getOption().getName(); 100 for (unsigned i = 0, e = getNumValues(); i != e; ++i) { 101 if (i) OS << ','; 102 OS << getValue(Args, i); 103 } 104 Output.push_back(Args.MakeArgString(OS.str())); 105 break; 106 } 107 108 case Option::RenderJoinedStyle: 109 Output.push_back(Args.GetOrMakeJoinedArgString( 110 getIndex(), getOption().getName(), getValue(Args, 0))); 111 for (unsigned i = 1, e = getNumValues(); i != e; ++i) 112 Output.push_back(getValue(Args, i)); 113 break; 114 115 case Option::RenderSeparateStyle: 116 Output.push_back(getOption().getName().data()); 117 for (unsigned i = 0, e = getNumValues(); i != e; ++i) 118 Output.push_back(getValue(Args, i)); 119 break; 120 } 121 } 122