diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-03-04 23:22:02 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-03-04 23:22:02 +0000 |
commit | 458b6982d471992337639382cdac1bb30311b4c0 (patch) | |
tree | e7149a2a1ae379ebeb8193f0fd1cd7badea35314 /clang/lib | |
parent | b7396f10b9f50accdc0bec74ba6d43d25775eed4 (diff) | |
download | bcm5719-llvm-458b6982d471992337639382cdac1bb30311b4c0.tar.gz bcm5719-llvm-458b6982d471992337639382cdac1bb30311b4c0.zip |
Driver: Implement Option::accept methods.
llvm-svn: 66106
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/Arg.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Driver/OptTable.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Driver/Option.cpp | 72 |
3 files changed, 61 insertions, 17 deletions
diff --git a/clang/lib/Driver/Arg.cpp b/clang/lib/Driver/Arg.cpp index 9f0ed7245d1..a4581d0e9ec 100644 --- a/clang/lib/Driver/Arg.cpp +++ b/clang/lib/Driver/Arg.cpp @@ -41,8 +41,8 @@ void Arg::dump() const { llvm::errs() << " Index:" << Index; - if (const CommaJoinedArg *CJA = dyn_cast<CommaJoinedArg>(this)) - llvm::errs() << " NumValues:" << CJA->getNumValues(); + if (isa<CommaJoinedArg>(this) || isa<SeparateArg>(this)) + llvm::errs() << " NumValues:" << getNumValues(); llvm::errs() << ">\n"; diff --git a/clang/lib/Driver/OptTable.cpp b/clang/lib/Driver/OptTable.cpp index 5de71d76333..3308bc51a90 100644 --- a/clang/lib/Driver/OptTable.cpp +++ b/clang/lib/Driver/OptTable.cpp @@ -126,7 +126,7 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, if (Str[0] != '-') return new PositionalArg(getOption(InputOpt), Index++); - for (unsigned j = UnknownOpt + 1; j < getNumOptions(); ++j) { + for (unsigned j = UnknownOpt + 1; j < LastOption; ++j) { const char *OptName = getOptionName((options::ID) j); // Arguments are only accepted by options which prefix them. diff --git a/clang/lib/Driver/Option.cpp b/clang/lib/Driver/Option.cpp index 583650f63ba..43d7e9e4760 100644 --- a/clang/lib/Driver/Option.cpp +++ b/clang/lib/Driver/Option.cpp @@ -8,8 +8,12 @@ //===----------------------------------------------------------------------===// #include "clang/Driver/Option.h" + +#include "clang/Driver/Arg.h" +#include "clang/Driver/ArgList.h" #include "llvm/Support/raw_ostream.h" #include <cassert> +#include <algorithm> using namespace clang; using namespace clang::driver; @@ -65,6 +69,8 @@ void Option::dump() const { llvm::errs() << " NumArgs:" << MOA->getNumArgs(); llvm::errs() << ">\n"; + + llvm::errs().flush(); // FIXME } bool Option::matches(const Option *Opt) const { @@ -116,8 +122,12 @@ FlagOption::FlagOption(options::ID ID, const char *Name, } Arg *FlagOption::accept(const ArgList &Args, unsigned &Index) const { - assert(0 && "FIXME"); - return 0; + // Matches iff this is an exact match. + // FIXME: Avoid strlen. + if (strlen(getName()) != strlen(Args.getArgString(Index))) + return 0; + + return new PositionalArg(this, Index++); } JoinedOption::JoinedOption(options::ID ID, const char *Name, @@ -126,8 +136,8 @@ JoinedOption::JoinedOption(options::ID ID, const char *Name, } Arg *JoinedOption::accept(const ArgList &Args, unsigned &Index) const { - assert(0 && "FIXME"); - return 0; + // Always matches. + return new JoinedArg(this, Index++); } CommaJoinedOption::CommaJoinedOption(options::ID ID, const char *Name, @@ -137,8 +147,20 @@ CommaJoinedOption::CommaJoinedOption(options::ID ID, const char *Name, } Arg *CommaJoinedOption::accept(const ArgList &Args, unsigned &Index) const { - assert(0 && "FIXME"); - return 0; + // Always matches. We count the commas now so we can answer + // getNumValues easily. + + // Get the suffix string. + // FIXME: Avoid strlen, and move to helper method? + const char *Suffix = Args.getArgString(Index) + strlen(getName()); + const char *SuffixEnd = Suffix + strlen(Suffix); + + // Degenerate case, exact match has no values. + if (Suffix == SuffixEnd) + return new CommaJoinedArg(this, Index++, 0); + + return new CommaJoinedArg(this, Index++, + std::count(Suffix, SuffixEnd, ',') + 1); } SeparateOption::SeparateOption(options::ID ID, const char *Name, @@ -147,8 +169,14 @@ SeparateOption::SeparateOption(options::ID ID, const char *Name, } Arg *SeparateOption::accept(const ArgList &Args, unsigned &Index) const { - assert(0 && "FIXME"); - return 0; + // Matches iff this is an exact match. + // FIXME: Avoid strlen. + if (strlen(getName()) != strlen(Args.getArgString(Index))) + return 0; + + // FIXME: Missing argument error. + Index += 2; + return new SeparateArg(this, Index - 2, 1); } MultiArgOption::MultiArgOption(options::ID ID, const char *Name, @@ -158,8 +186,14 @@ MultiArgOption::MultiArgOption(options::ID ID, const char *Name, } Arg *MultiArgOption::accept(const ArgList &Args, unsigned &Index) const { - assert(0 && "FIXME"); - return 0; + // Matches iff this is an exact match. + // FIXME: Avoid strlen. + if (strlen(getName()) != strlen(Args.getArgString(Index))) + return 0; + + // FIXME: Missing argument error. + Index += 1 + NumArgs; + return new SeparateArg(this, Index - 1 - NumArgs, NumArgs); } JoinedOrSeparateOption::JoinedOrSeparateOption(options::ID ID, const char *Name, @@ -169,8 +203,15 @@ JoinedOrSeparateOption::JoinedOrSeparateOption(options::ID ID, const char *Name, } Arg *JoinedOrSeparateOption::accept(const ArgList &Args, unsigned &Index) const { - assert(0 && "FIXME"); - return 0; + // If this is not an exact match, it is a joined arg. + // FIXME: Avoid strlen. + if (strlen(getName()) != strlen(Args.getArgString(Index))) + return new JoinedArg(this, Index++); + + // Otherwise it must be separate. + // FIXME: Missing argument error. + Index += 2; + return new SeparateArg(this, Index - 2, 1); } JoinedAndSeparateOption::JoinedAndSeparateOption(options::ID ID, @@ -181,7 +222,10 @@ JoinedAndSeparateOption::JoinedAndSeparateOption(options::ID ID, } Arg *JoinedAndSeparateOption::accept(const ArgList &Args, unsigned &Index) const { - assert(0 && "FIXME"); - return 0; + // Always matches. + + // FIXME: Missing argument error. + Index += 2; + return new JoinedAndSeparateArg(this, Index - 2); } |