aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/Arg.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-05 06:38:47 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-05 06:38:47 +0000
commit0648262df75d97b464c2be0ed867da3615659785 (patch)
tree1e1849d82dde933f81af038abce15e470f1dfcad /lib/Driver/Arg.cpp
parentf27893a1a17dbde417dc7bccbbd25992c33215f9 (diff)
Driver: Basic argument parsing.
- Add Driver::ParseArgStrings. - Store values directly in CommaJoinedArg to support simple access. - Add FlagArg class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66142 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Arg.cpp')
-rw-r--r--lib/Driver/Arg.cpp47
1 files changed, 41 insertions, 6 deletions
diff --git a/lib/Driver/Arg.cpp b/lib/Driver/Arg.cpp
index a4581d0e9e..52437e7772 100644
--- a/lib/Driver/Arg.cpp
+++ b/lib/Driver/Arg.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Driver/Arg.h"
+#include "clang/Driver/ArgList.h"
#include "clang/Driver/Option.h"
#include "llvm/Support/raw_ostream.h"
@@ -28,6 +29,7 @@ void Arg::dump() const {
default:
assert(0 && "Invalid kind");
#define P(N) case N: llvm::errs() << #N; break
+ P(FlagClass);
P(PositionalClass);
P(JoinedClass);
P(SeparateClass);
@@ -49,6 +51,19 @@ void Arg::dump() const {
llvm::errs().flush(); // FIXME
}
+FlagArg::FlagArg(const Option *Opt, unsigned Index)
+ : Arg(FlagClass, Opt, Index) {
+}
+
+void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
+ assert(0 && "FIXME: Implement");
+}
+
+const char *FlagArg::getValue(const ArgList &Args, unsigned N) const {
+ assert(0 && "Invalid index.");
+ return 0;
+}
+
PositionalArg::PositionalArg(const Option *Opt, unsigned Index)
: Arg(PositionalClass, Opt, Index) {
}
@@ -58,7 +73,8 @@ void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
}
const char *PositionalArg::getValue(const ArgList &Args, unsigned N) const {
- assert(0 && "FIXME: Implement");
+ assert(N < getNumValues() && "Invalid index.");
+ return Args.getArgString(getIndex());
}
JoinedArg::JoinedArg(const Option *Opt, unsigned Index)
@@ -70,12 +86,28 @@ void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
}
const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
- assert(0 && "FIXME: Implement");
+ assert(N < getNumValues() && "Invalid index.");
+ // FIXME: Avoid strlen.
+ return Args.getArgString(getIndex()) + strlen(getOption().getName());
}
CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
- unsigned _NumValues)
- : Arg(CommaJoinedClass, Opt, Index), NumValues(_NumValues) {
+ const char *Str)
+ : Arg(CommaJoinedClass, Opt, Index) {
+ const char *Prev = Str;
+ for (;; ++Str) {
+ char c = *Str;
+
+ if (!c) {
+ if (Prev != Str)
+ Values.push_back(std::string(Prev, Str));
+ break;
+ } else if (c == ',') {
+ if (Prev != Str)
+ Values.push_back(std::string(Prev, Str));
+ Prev = Str + 1;
+ }
+ }
}
void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -83,7 +115,8 @@ void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
}
const char *CommaJoinedArg::getValue(const ArgList &Args, unsigned N) const {
- assert(0 && "FIXME: Implement");
+ assert(N < getNumValues() && "Invalid index.");
+ return Values[N].c_str();
}
SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues)
@@ -95,7 +128,8 @@ void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
}
const char *SeparateArg::getValue(const ArgList &Args, unsigned N) const {
- assert(0 && "FIXME: Implement");
+ assert(N < getNumValues() && "Invalid index.");
+ return Args.getArgString(getIndex() + 1 + N);
}
JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index)
@@ -109,5 +143,6 @@ void JoinedAndSeparateArg::render(const ArgList &Args,
const char *JoinedAndSeparateArg::getValue(const ArgList &Args,
unsigned N) const {
+ assert(N < getNumValues() && "Invalid index.");
assert(0 && "FIXME: Implement");
}