blob: 6cff93e64a1bb55dc72207d21eb953e4e0908f6a [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),
20 Index(_Index)
21{
22}
23
24Arg::~Arg() { }
25
Daniel Dunbarf781c412009-03-04 23:02:50 +000026void Arg::dump() const {
27 llvm::errs() << "<";
28 switch (Kind) {
29 default:
30 assert(0 && "Invalid kind");
31#define P(N) case N: llvm::errs() << #N; break
Daniel Dunbar06482622009-03-05 06:38:47 +000032 P(FlagClass);
Daniel Dunbarf781c412009-03-04 23:02:50 +000033 P(PositionalClass);
34 P(JoinedClass);
35 P(SeparateClass);
36 P(CommaJoinedClass);
37 P(JoinedAndSeparateClass);
38#undef P
39 }
40
41 llvm::errs() << " Opt:";
42 Opt->dump();
43
44 llvm::errs() << " Index:" << Index;
45
Daniel Dunbarbbf842b2009-03-04 23:22:02 +000046 if (isa<CommaJoinedArg>(this) || isa<SeparateArg>(this))
47 llvm::errs() << " NumValues:" << getNumValues();
Daniel Dunbarf781c412009-03-04 23:02:50 +000048
49 llvm::errs() << ">\n";
Daniel Dunbarf781c412009-03-04 23:02:50 +000050}
51
Daniel Dunbar06482622009-03-05 06:38:47 +000052FlagArg::FlagArg(const Option *Opt, unsigned Index)
53 : Arg(FlagClass, Opt, Index) {
54}
55
56void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
57 assert(0 && "FIXME: Implement");
58}
59
60const char *FlagArg::getValue(const ArgList &Args, unsigned N) const {
61 assert(0 && "Invalid index.");
62 return 0;
63}
64
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000065PositionalArg::PositionalArg(const Option *Opt, unsigned Index)
66 : Arg(PositionalClass, Opt, Index) {
67}
68
69void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
70 assert(0 && "FIXME: Implement");
71}
72
73const char *PositionalArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +000074 assert(N < getNumValues() && "Invalid index.");
75 return Args.getArgString(getIndex());
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000076}
77
78JoinedArg::JoinedArg(const Option *Opt, unsigned Index)
79 : Arg(JoinedClass, Opt, Index) {
80}
81
82void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
83 assert(0 && "FIXME: Implement");
84}
85
86const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +000087 assert(N < getNumValues() && "Invalid index.");
88 // FIXME: Avoid strlen.
89 return Args.getArgString(getIndex()) + strlen(getOption().getName());
Daniel Dunbarfb36cae2009-03-04 22:37:52 +000090}
91
92CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
Daniel Dunbar06482622009-03-05 06:38:47 +000093 const char *Str)
94 : Arg(CommaJoinedClass, Opt, Index) {
95 const char *Prev = Str;
96 for (;; ++Str) {
97 char c = *Str;
98
99 if (!c) {
100 if (Prev != Str)
101 Values.push_back(std::string(Prev, Str));
102 break;
103 } else if (c == ',') {
104 if (Prev != Str)
105 Values.push_back(std::string(Prev, Str));
106 Prev = Str + 1;
107 }
108 }
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000109}
110
111void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
112 assert(0 && "FIXME: Implement");
113}
114
115const char *CommaJoinedArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +0000116 assert(N < getNumValues() && "Invalid index.");
117 return Values[N].c_str();
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000118}
119
Daniel Dunbarf781c412009-03-04 23:02:50 +0000120SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues)
121 : Arg(SeparateClass, Opt, Index), NumValues(_NumValues) {
122}
123
124void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
125 assert(0 && "FIXME: Implement");
126}
127
128const char *SeparateArg::getValue(const ArgList &Args, unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +0000129 assert(N < getNumValues() && "Invalid index.");
130 return Args.getArgString(getIndex() + 1 + N);
Daniel Dunbarf781c412009-03-04 23:02:50 +0000131}
132
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000133JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index)
134 : Arg(JoinedAndSeparateClass, Opt, Index) {
135}
136
137void JoinedAndSeparateArg::render(const ArgList &Args,
138 ArgStringList &Output) const {
139 assert(0 && "FIXME: Implement");
140}
141
142const char *JoinedAndSeparateArg::getValue(const ArgList &Args,
143 unsigned N) const {
Daniel Dunbar06482622009-03-05 06:38:47 +0000144 assert(N < getNumValues() && "Invalid index.");
Daniel Dunbarec29d362009-03-18 01:48:37 +0000145 if (N == 0)
146 return Args.getArgString(getIndex()) + strlen(getOption().getName());
147 return Args.getArgString(getIndex() + 1);
Daniel Dunbarfb36cae2009-03-04 22:37:52 +0000148}