1249259Sdim//===--- Arg.cpp - Argument Implementations -------------------------------===// 2249259Sdim// 3249259Sdim// The LLVM Compiler Infrastructure 4249259Sdim// 5249259Sdim// This file is distributed under the University of Illinois Open Source 6249259Sdim// License. See LICENSE.TXT for details. 7249259Sdim// 8249259Sdim//===----------------------------------------------------------------------===// 9249259Sdim 10249259Sdim#include "llvm/Option/Arg.h" 11249259Sdim#include "llvm/ADT/SmallString.h" 12249259Sdim#include "llvm/ADT/Twine.h" 13249259Sdim#include "llvm/Option/ArgList.h" 14249259Sdim#include "llvm/Option/Option.h" 15249259Sdim#include "llvm/Support/raw_ostream.h" 16249259Sdim 17249259Sdimusing namespace llvm; 18249259Sdimusing namespace llvm::opt; 19249259Sdim 20249259SdimArg::Arg(const Option _Opt, StringRef S, unsigned _Index, const Arg *_BaseArg) 21249259Sdim : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index), 22249259Sdim Claimed(false), OwnsValues(false) { 23249259Sdim} 24249259Sdim 25249259SdimArg::Arg(const Option _Opt, StringRef S, unsigned _Index, 26249259Sdim const char *Value0, const Arg *_BaseArg) 27249259Sdim : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index), 28249259Sdim Claimed(false), OwnsValues(false) { 29249259Sdim Values.push_back(Value0); 30249259Sdim} 31249259Sdim 32249259SdimArg::Arg(const Option _Opt, StringRef S, unsigned _Index, 33249259Sdim const char *Value0, const char *Value1, const Arg *_BaseArg) 34249259Sdim : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index), 35249259Sdim Claimed(false), OwnsValues(false) { 36249259Sdim Values.push_back(Value0); 37249259Sdim Values.push_back(Value1); 38249259Sdim} 39249259Sdim 40249259SdimArg::~Arg() { 41249259Sdim if (OwnsValues) { 42249259Sdim for (unsigned i = 0, e = Values.size(); i != e; ++i) 43249259Sdim delete[] Values[i]; 44249259Sdim } 45249259Sdim} 46249259Sdim 47249259Sdimvoid Arg::dump() const { 48249259Sdim llvm::errs() << "<"; 49249259Sdim 50249259Sdim llvm::errs() << " Opt:"; 51249259Sdim Opt.dump(); 52249259Sdim 53249259Sdim llvm::errs() << " Index:" << Index; 54249259Sdim 55249259Sdim llvm::errs() << " Values: ["; 56249259Sdim for (unsigned i = 0, e = Values.size(); i != e; ++i) { 57249259Sdim if (i) llvm::errs() << ", "; 58249259Sdim llvm::errs() << "'" << Values[i] << "'"; 59249259Sdim } 60249259Sdim 61249259Sdim llvm::errs() << "]>\n"; 62249259Sdim} 63249259Sdim 64249259Sdimstd::string Arg::getAsString(const ArgList &Args) const { 65249259Sdim SmallString<256> Res; 66249259Sdim llvm::raw_svector_ostream OS(Res); 67249259Sdim 68249259Sdim ArgStringList ASL; 69249259Sdim render(Args, ASL); 70249259Sdim for (ArgStringList::iterator 71249259Sdim it = ASL.begin(), ie = ASL.end(); it != ie; ++it) { 72249259Sdim if (it != ASL.begin()) 73249259Sdim OS << ' '; 74249259Sdim OS << *it; 75249259Sdim } 76249259Sdim 77249259Sdim return OS.str(); 78249259Sdim} 79249259Sdim 80249259Sdimvoid Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const { 81249259Sdim if (!getOption().hasNoOptAsInput()) { 82249259Sdim render(Args, Output); 83249259Sdim return; 84249259Sdim } 85249259Sdim 86249259Sdim for (unsigned i = 0, e = getNumValues(); i != e; ++i) 87249259Sdim Output.push_back(getValue(i)); 88249259Sdim} 89249259Sdim 90249259Sdimvoid Arg::render(const ArgList &Args, ArgStringList &Output) const { 91249259Sdim switch (getOption().getRenderStyle()) { 92249259Sdim case Option::RenderValuesStyle: 93249259Sdim for (unsigned i = 0, e = getNumValues(); i != e; ++i) 94249259Sdim Output.push_back(getValue(i)); 95249259Sdim break; 96249259Sdim 97249259Sdim case Option::RenderCommaJoinedStyle: { 98249259Sdim SmallString<256> Res; 99249259Sdim llvm::raw_svector_ostream OS(Res); 100249259Sdim OS << getSpelling(); 101249259Sdim for (unsigned i = 0, e = getNumValues(); i != e; ++i) { 102249259Sdim if (i) OS << ','; 103249259Sdim OS << getValue(i); 104249259Sdim } 105249259Sdim Output.push_back(Args.MakeArgString(OS.str())); 106249259Sdim break; 107249259Sdim } 108249259Sdim 109249259Sdim case Option::RenderJoinedStyle: 110249259Sdim Output.push_back(Args.GetOrMakeJoinedArgString( 111249259Sdim getIndex(), getSpelling(), getValue(0))); 112249259Sdim for (unsigned i = 1, e = getNumValues(); i != e; ++i) 113249259Sdim Output.push_back(getValue(i)); 114249259Sdim break; 115249259Sdim 116249259Sdim case Option::RenderSeparateStyle: 117249259Sdim Output.push_back(Args.MakeArgString(getSpelling())); 118249259Sdim for (unsigned i = 0, e = getNumValues(); i != e; ++i) 119249259Sdim Output.push_back(getValue(i)); 120249259Sdim break; 121249259Sdim } 122249259Sdim} 123