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