196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===--- Arg.cpp - Argument Implementations -------------------------------===//
296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//                     The LLVM Compiler Infrastructure
496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// This file is distributed under the University of Illinois Open Source
696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// License. See LICENSE.TXT for details.
796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===----------------------------------------------------------------------===//
996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Arg.h"
1196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/SmallString.h"
1296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/Twine.h"
1396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/ArgList.h"
1496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Option.h"
1596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Support/raw_ostream.h"
1696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm;
1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm::opt;
1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::Arg(const Option _Opt, StringRef S, unsigned _Index, const Arg *_BaseArg)
2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index),
2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Claimed(false), OwnsValues(false) {
2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2596a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::Arg(const Option _Opt, StringRef S, unsigned _Index,
2696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer         const char *Value0, const Arg *_BaseArg)
2796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index),
2896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Claimed(false), OwnsValues(false) {
2996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Values.push_back(Value0);
3096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
3196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::Arg(const Option _Opt, StringRef S, unsigned _Index,
3396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer         const char *Value0, const char *Value1, const Arg *_BaseArg)
3496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index),
3596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Claimed(false), OwnsValues(false) {
3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Values.push_back(Value0);
3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Values.push_back(Value1);
3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::~Arg() {
4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (OwnsValues) {
4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 0, e = Values.size(); i != e; ++i)
4396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      delete[] Values[i];
4496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
4596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
4696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid Arg::dump() const {
4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << "<";
4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << " Opt:";
5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Opt.dump();
5296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << " Index:" << Index;
5496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << " Values: [";
5696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (unsigned i = 0, e = Values.size(); i != e; ++i) {
5796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (i) llvm::errs() << ", ";
5896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    llvm::errs() << "'" << Values[i] << "'";
5996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
6096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << "]>\n";
6296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
6396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerstd::string Arg::getAsString(const ArgList &Args) const {
6596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  SmallString<256> Res;
6696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::raw_svector_ostream OS(Res);
6796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ArgStringList ASL;
6996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  render(Args, ASL);
7096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (ArgStringList::iterator
7196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer         it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
7296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (it != ASL.begin())
7396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      OS << ' ';
7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    OS << *it;
7596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
7696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return OS.str();
7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (!getOption().hasNoOptAsInput()) {
8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    render(Args, Output);
8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return;
8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
8596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (unsigned i = 0, e = getNumValues(); i != e; ++i)
8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Output.push_back(getValue(i));
8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid Arg::render(const ArgList &Args, ArgStringList &Output) const {
9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  switch (getOption().getRenderStyle()) {
9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case Option::RenderValuesStyle:
9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 0, e = getNumValues(); i != e; ++i)
9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back(getValue(i));
9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    break;
9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case Option::RenderCommaJoinedStyle: {
9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    SmallString<256> Res;
9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    llvm::raw_svector_ostream OS(Res);
10096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    OS << getSpelling();
10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      if (i) OS << ',';
10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      OS << getValue(i);
10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Output.push_back(Args.MakeArgString(OS.str()));
10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    break;
10796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
10896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
10996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case Option::RenderJoinedStyle:
11096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Output.push_back(Args.GetOrMakeJoinedArgString(
11196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                       getIndex(), getSpelling(), getValue(0)));
11296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 1, e = getNumValues(); i != e; ++i)
11396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back(getValue(i));
11496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    break;
11596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case Option::RenderSeparateStyle:
11796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Output.push_back(Args.MakeArgString(getSpelling()));
11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 0, e = getNumValues(); i != e; ++i)
11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back(getValue(i));
12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    break;
12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
123