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 
     17 using namespace llvm;
     18 using namespace llvm::opt;
     19 
     20 Arg::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 
     24 Arg::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 
     31 Arg::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 
     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   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   Output.append(Values.begin(), Values.end());
     86 }
     87 
     88 void 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