blob: 6a860b620009d528dfe241d6db514885ec2c05b5 [file] [log] [blame]
Daniel Dunbarfb36cae2009-03-04 22:37:52 +00001//===--- 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"
Daniel Dunbar06482622009-03-05 06:38:47 +000011#include "clang/Driver/ArgList.h"
Daniel Dunbarf781c412009-03-04 23:02:50 +000012#include "clang/Driver/Option.h"
13#include "llvm/Support/raw_ostream.h"
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000014
15using namespace clang::driver;
16
17Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index)
18 : Kind(_Kind),
19 Opt(_Opt),
Daniel Dunbar6d91b042009-03-18 02:57:50 +000020 Index(_Index),
21 Claimed(false)
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000022{
23}
24
25Arg::~Arg() { }
26
Daniel Dunbarf781c412009-03-04 23:02:50 +000027void Arg::dump() const {
28 llvm::errs() << "<";
29 switch (Kind) {
30 default:
31 assert(0 && "Invalid kind");
32#define P(N) case N: llvm::errs() << #N; break
Daniel Dunbar06482622009-03-05 06:38:47 +000033 P(FlagClass);
Daniel Dunbarf781c412009-03-04 23:02:50 +000034 P(PositionalClass);
35 P(JoinedClass);
36 P(SeparateClass);
37 P(CommaJoinedClass);
38 P(JoinedAndSeparateClass);
39#undef P
40 }
41
42 llvm::errs() << " Opt:";
43 Opt->dump();
44
45 llvm::errs() << " Index:" << Index;
46
Daniel Dunbarbbf842b2009-03-04 23:22:02 +000047 if (isa<CommaJoinedArg>(this) || isa<SeparateArg>(this))
48 llvm::errs() << " NumValues:" << getNumValues();
Daniel Dunbarf781c412009-03-04 23:02:50 +000049
50 llvm::errs() << ">\n";
Daniel Dunbarf781c412009-03-04 23:02:50 +000051}
52
Daniel Dunbar06482622009-03-05 06:38:47 +000053FlagArg::FlagArg(const Option *Opt, unsigned Index)
54 : Arg(FlagClass, Opt, Index) {
55}
56
57void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
58 assert(0 && "FIXME: Implement");
59}
60
61const char *FlagArg::getValue(const ArgList &Args, unsigned N) const {
62 assert(0 && "Invalid index.");
63 return 0;
64}
65
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000066PositionalArg::PositionalArg(const Option *Opt, unsigned Index)
67 : Arg(PositionalClass, Opt, Index) {
68}
69
70void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
71 assert(0 && "FIXME: Implement");
72}
73
74const char *PositionalArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +000075 assert(N < getNumValues() && "Invalid index.");
76 return Args.getArgString(getIndex());
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000077}
78
79JoinedArg::JoinedArg(const Option *Opt, unsigned Index)
80 : Arg(JoinedClass, Opt, Index) {
81}
82
83void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
84 assert(0 && "FIXME: Implement");
85}
86
87const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +000088 assert(N < getNumValues() && "Invalid index.");
89 // FIXME: Avoid strlen.
90 return Args.getArgString(getIndex()) + strlen(getOption().getName());
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000091}
92
93CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
Daniel Dunbar06482622009-03-05 06:38:47 +000094 const char *Str)
95 : Arg(CommaJoinedClass, Opt, Index) {
96 const char *Prev = Str;
97 for (;; ++Str) {
98 char c = *Str;
99
100 if (!c) {
101 if (Prev != Str)
102 Values.push_back(std::string(Prev, Str));
103 break;
104 } else if (c == ',') {
105 if (Prev != Str)
106 Values.push_back(std::string(Prev, Str));
107 Prev = Str + 1;
108 }
109 }
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000110}
111
112void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
113 assert(0 && "FIXME: Implement");
114}
115
116const char *CommaJoinedArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +0000117 assert(N < getNumValues() && "Invalid index.");
118 return Values[N].c_str();
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000119}
120
Daniel Dunbarf781c412009-03-04 23:02:50 +0000121SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues)
122 : Arg(SeparateClass, Opt, Index), NumValues(_NumValues) {
123}
124
125void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
126 assert(0 && "FIXME: Implement");
127}
128
129const char *SeparateArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +0000130 assert(N < getNumValues() && "Invalid index.");
131 return Args.getArgString(getIndex() + 1 + N);
Daniel Dunbarf781c412009-03-04 23:02:50 +0000132}
133
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000134JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index)
135 : Arg(JoinedAndSeparateClass, Opt, Index) {
136}
137
138void JoinedAndSeparateArg::render(const ArgList &Args,
139 ArgStringList &Output) const {
140 assert(0 && "FIXME: Implement");
141}
142
143const char *JoinedAndSeparateArg::getValue(const ArgList &Args,
144 unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +0000145 assert(N < getNumValues() && "Invalid index.");
Daniel Dunbarec29d362009-03-18 01:48:37 +0000146 if (N == 0)
147 return Args.getArgString(getIndex()) + strlen(getOption().getName());
148 return Args.getArgString(getIndex() + 1);
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000149}