summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/OptTable.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-11-19 06:35:06 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-11-19 06:35:06 +0000
commit52ed5feee500abbb007e1f8bfefcc72baa74b5fa (patch)
treefbf540009e843341f00466ab78724f1c68d8529b /clang/lib/Driver/OptTable.cpp
parent2a6c92fcb63f6594f9c79f7352801064809229f7 (diff)
downloadbcm5719-llvm-52ed5feee500abbb007e1f8bfefcc72baa74b5fa.tar.gz
bcm5719-llvm-52ed5feee500abbb007e1f8bfefcc72baa74b5fa.zip
Factor out OptTable::ParseArgs, for parsing an entire argument vector.
llvm-svn: 89327
Diffstat (limited to 'clang/lib/Driver/OptTable.cpp')
-rw-r--r--clang/lib/Driver/OptTable.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/Driver/OptTable.cpp b/clang/lib/Driver/OptTable.cpp
index 890907b2a73..f68a1d8db77 100644
--- a/clang/lib/Driver/OptTable.cpp
+++ b/clang/lib/Driver/OptTable.cpp
@@ -220,3 +220,38 @@ Arg *OptTable::ParseOneArg(const InputArgList &Args, unsigned &Index) const {
return new PositionalArg(TheUnknownOption, Index++);
}
+
+InputArgList *OptTable::ParseArgs(const char **ArgBegin, const char **ArgEnd,
+ unsigned &MissingArgIndex,
+ unsigned &MissingArgCount) const {
+ InputArgList *Args = new InputArgList(ArgBegin, ArgEnd);
+
+ // FIXME: Handle '@' args (or at least error on them).
+
+ MissingArgIndex = MissingArgCount = 0;
+ unsigned Index = 0, End = ArgEnd - ArgBegin;
+ while (Index < End) {
+ // Ignore empty arguments (other things may still take them as arguments).
+ if (Args->getArgString(Index)[0] == '\0') {
+ ++Index;
+ continue;
+ }
+
+ unsigned Prev = Index;
+ Arg *A = ParseOneArg(*Args, Index);
+ assert(Index > Prev && "Parser failed to consume argument.");
+
+ // Check for missing argument error.
+ if (!A) {
+ assert(Index >= End && "Unexpected parser error.");
+ assert(Index - Prev - 1 && "No missing arguments!");
+ MissingArgIndex = Prev;
+ MissingArgCount = Index - Prev - 1;
+ break;
+ }
+
+ Args->append(A);
+ }
+
+ return Args;
+}
OpenPOWER on IntegriCloud