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
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index d3c9594..541a6d8 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -12,7 +12,10 @@
 #include "clang/Driver/Arg.h"
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/Compilation.h"
+#include "clang/Driver/Option.h"
 #include "clang/Driver/Options.h"
+
+#include "llvm/Support/raw_ostream.h"
 using namespace clang::driver;
 
 Driver::Driver() : Opts(new OptTable()) {
@@ -23,6 +26,42 @@
   delete Opts;
 }
 
+ArgList *Driver::ParseArgStrings(const char **ArgBegin, const char **ArgEnd) {
+  ArgList *Args = new ArgList(ArgBegin, ArgEnd);
+  
+  unsigned Index = 0, End = ArgEnd - ArgBegin;
+  while (Index < End) {
+    unsigned Prev = Index;
+    Arg *A = getOpts().ParseOneArg(*Args, Index, End);
+    if (A)
+      Args->append(A);
+
+    assert(Index > Prev && "Parser failed to consume argument.");
+  }
+
+  return Args;
+}
+
 Compilation *Driver::BuildCompilation(int argc, const char **argv) {
+  ArgList *Args = ParseArgStrings(argv + 1, argv + argc);
+
+  // Hard coded to print-options behavior.
+  unsigned i = 0;
+  for (ArgList::iterator it = Args->begin(), ie = Args->end(); 
+       it != ie; ++it, ++i) {
+    Arg *A = *it;
+    llvm::errs() << "Option " << i << " - "
+                 << "Name: \"" << A->getOption().getName() << "\", "
+                 << "Values: {";
+    for (unsigned j = 0; j < A->getNumValues(); ++j) {
+      if (j)
+        llvm::errs() << ", ";
+      llvm::errs() << '"' << A->getValue(*Args, j) << '"';
+    }
+    llvm::errs() << "}\n";
+
+    llvm::errs().flush(); // FIXME
+  }
+
   return new Compilation();
 }