13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- Arg.cpp - Argument Implementations -------------------------------===//
2fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar//
3fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar//                     The LLVM Compiler Infrastructure
4fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar//
5fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// This file is distributed under the University of Illinois Open Source
6fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// License. See LICENSE.TXT for details.
7fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar//
8fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar//===----------------------------------------------------------------------===//
9fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar
10fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar#include "clang/Driver/Arg.h"
110648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "clang/Driver/ArgList.h"
12f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar#include "clang/Driver/Option.h"
13e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar#include "llvm/ADT/SmallString.h"
14bbd2a045871c1acff39c43dffd346adbb1b2dde5Daniel Dunbar#include "llvm/ADT/Twine.h"
15f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar#include "llvm/Support/raw_ostream.h"
16fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar
17fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbarusing namespace clang::driver;
18fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar
19532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel DunbarArg::Arg(const Option *_Opt, unsigned _Index, const Arg *_BaseArg)
20532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  : Opt(_Opt), BaseArg(_BaseArg), Index(_Index),
214465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar    Claimed(false), OwnsValues(false) {
22fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar}
23fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar
24532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel DunbarArg::Arg(const Option *_Opt, unsigned _Index,
25532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar         const char *Value0, const Arg *_BaseArg)
26532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  : Opt(_Opt), BaseArg(_BaseArg), Index(_Index),
27532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar    Claimed(false), OwnsValues(false) {
28532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Values.push_back(Value0);
29532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar}
30532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar
31532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel DunbarArg::Arg(const Option *_Opt, unsigned _Index,
32532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar         const char *Value0, const char *Value1, const Arg *_BaseArg)
33532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  : Opt(_Opt), BaseArg(_BaseArg), Index(_Index),
34532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar    Claimed(false), OwnsValues(false) {
35532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Values.push_back(Value0);
36532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Values.push_back(Value1);
37532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar}
38532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar
394465a776a56de81211ae4672e5782c6bef075135Daniel DunbarArg::~Arg() {
404465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  if (OwnsValues) {
414465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar    for (unsigned i = 0, e = Values.size(); i != e; ++i)
424465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar      delete[] Values[i];
434465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  }
444465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar}
45fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar
46f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbarvoid Arg::dump() const {
47f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar  llvm::errs() << "<";
48f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar
49f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar  llvm::errs() << " Opt:";
50f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar  Opt->dump();
51f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar
52f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar  llvm::errs() << " Index:" << Index;
53f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar
54532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  llvm::errs() << " Values: [";
55532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  for (unsigned i = 0, e = Values.size(); i != e; ++i) {
56532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar    if (i) llvm::errs() << ", ";
57532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar    llvm::errs() << "'" << Values[i] << "'";
58532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  }
59f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar
60532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  llvm::errs() << "]>\n";
61f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar}
62f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar
6338dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbarstd::string Arg::getAsString(const ArgList &Args) const {
64f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<256> Res;
65e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar  llvm::raw_svector_ostream OS(Res);
6638dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar
6738dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar  ArgStringList ASL;
6838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar  render(Args, ASL);
691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (ArgStringList::iterator
7038dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar         it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
7138dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar    if (it != ASL.begin())
7238dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar      OS << ' ';
7338dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar    OS << *it;
7438dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar  }
7538dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar
7638dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar  return OS.str();
7738dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar}
7838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar
7942f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbarvoid Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
8042f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar  if (!getOption().hasNoOptAsInput()) {
8142f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar    render(Args, Output);
8242f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar    return;
8342f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar  }
8442f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar
8542f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar  for (unsigned i = 0, e = getNumValues(); i != e; ++i)
8642f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar    Output.push_back(getValue(Args, i));
8742f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar}
8842f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar
89e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbarvoid Arg::render(const ArgList &Args, ArgStringList &Output) const {
90e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar  switch (getOption().getRenderStyle()) {
91e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar  case Option::RenderValuesStyle:
92e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    for (unsigned i = 0, e = getNumValues(); i != e; ++i)
93e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      Output.push_back(getValue(Args, i));
94e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    break;
95e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar
96e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar  case Option::RenderCommaJoinedStyle: {
97f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<256> Res;
98e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    llvm::raw_svector_ostream OS(Res);
99e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    OS << getOption().getName();
100e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
101e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      if (i) OS << ',';
102e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      OS << getValue(Args, i);
103e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    }
104e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    Output.push_back(Args.MakeArgString(OS.str()));
105e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    break;
106e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar  }
107e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar
108e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar case Option::RenderJoinedStyle:
109e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    Output.push_back(Args.GetOrMakeJoinedArgString(
110e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar                       getIndex(), getOption().getName(), getValue(Args, 0)));
111e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    for (unsigned i = 1, e = getNumValues(); i != e; ++i)
112e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      Output.push_back(getValue(Args, i));
113e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    break;
114e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar
115e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar  case Option::RenderSeparateStyle:
116bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor    Output.push_back(getOption().getName().data());
117e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    for (unsigned i = 0, e = getNumValues(); i != e; ++i)
118e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      Output.push_back(getValue(Args, i));
119e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    break;
120e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar  }
1210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar}
122