Home | History | Annotate | Download | only in Driver
      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