Home | History | Annotate | Download | only in Option
      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 
     18 using namespace llvm;
     19 using namespace llvm::opt;
     20 
     21 Arg::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 
     25 Arg::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 
     32 Arg::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 
     40 Arg::~Arg() {
     41   if (OwnsValues) {
     42     for (unsigned i = 0, e = Values.size(); i != e; ++i)
     43       delete[] Values[i];
     44   }
     45 }
     46 
     47 void 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 
     64 LLVM_DUMP_METHOD void Arg::dump() const { print(dbgs()); }
     65 
     66 std::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 
     82 void 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 
     91 void 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