Driver: Eliminate Arg subclasses, which are now unnecessary.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105762 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp
index 6bcaf52..6f3c24f 100644
--- a/lib/Driver/Option.cpp
+++ b/lib/Driver/Option.cpp
@@ -147,7 +147,7 @@
   if (strlen(getName()) != strlen(Args.getArgString(Index)))
     return 0;
 
-  return new FlagArg(this, Index++);
+  return new Arg(this, Index++);
 }
 
 JoinedOption::JoinedOption(OptSpecifier ID, const char *Name,
@@ -158,7 +158,7 @@
 Arg *JoinedOption::accept(const InputArgList &Args, unsigned &Index) const {
   // Always matches.
   const char *Value = Args.getArgString(Index) + strlen(getName());
-  return new JoinedArg(this, Index++, Value);
+  return new Arg(this, Index++, Value);
 }
 
 CommaJoinedOption::CommaJoinedOption(OptSpecifier ID, const char *Name,
@@ -169,13 +169,32 @@
 
 Arg *CommaJoinedOption::accept(const InputArgList &Args,
                                unsigned &Index) const {
-  // Always matches. We count the commas now so we can answer
-  // getNumValues easily.
+  // Always matches.
+  const char *Str = Args.getArgString(Index) + strlen(getName());
+  Arg *A = new Arg(this, Index++);
 
-  // Get the suffix string.
-  // FIXME: Avoid strlen, and move to helper method?
-  const char *Suffix = Args.getArgString(Index) + strlen(getName());
-  return new CommaJoinedArg(this, Index++, Suffix);
+  // Parse out the comma separated values.
+  const char *Prev = Str;
+  for (;; ++Str) {
+    char c = *Str;
+
+    if (!c || c == ',') {
+      if (Prev != Str) {
+        char *Value = new char[Str - Prev + 1];
+        memcpy(Value, Prev, Str - Prev);
+        Value[Str - Prev] = '\0';
+        A->getValues().push_back(Value);
+      }
+
+      if (!c)
+        break;
+
+      Prev = Str + 1;
+    }
+  }
+  A->setOwnsValues(true);
+
+  return A;
 }
 
 SeparateOption::SeparateOption(OptSpecifier ID, const char *Name,
@@ -193,7 +212,7 @@
   if (Index > Args.getNumInputArgStrings())
     return 0;
 
-  return new SeparateArg(this, Index - 2, Args.getArgString(Index - 1));
+  return new Arg(this, Index - 2, Args.getArgString(Index - 1));
 }
 
 MultiArgOption::MultiArgOption(OptSpecifier ID, const char *Name,
@@ -213,8 +232,8 @@
   if (Index > Args.getNumInputArgStrings())
     return 0;
 
-  Arg *A = new SeparateArg(this, Index - 1 - NumArgs,
-                           Args.getArgString(Index - NumArgs));
+  Arg *A = new Arg(this, Index - 1 - NumArgs,
+                    Args.getArgString(Index - NumArgs));
   for (unsigned i = 1; i != NumArgs; ++i)
     A->getValues().push_back(Args.getArgString(Index - NumArgs + i));
   return A;
@@ -233,7 +252,7 @@
   // FIXME: Avoid strlen.
   if (strlen(getName()) != strlen(Args.getArgString(Index))) {
     const char *Value = Args.getArgString(Index) + strlen(getName());
-    return new JoinedArg(this, Index++, Value);
+    return new Arg(this, Index++, Value);
   }
 
   // Otherwise it must be separate.
@@ -241,8 +260,7 @@
   if (Index > Args.getNumInputArgStrings())
     return 0;
 
-  return new SeparateArg(this, Index - 2,
-                         Args.getArgString(Index - 1));
+  return new Arg(this, Index - 2, Args.getArgString(Index - 1));
 }
 
 JoinedAndSeparateOption::JoinedAndSeparateOption(OptSpecifier ID,
@@ -260,7 +278,6 @@
   if (Index > Args.getNumInputArgStrings())
     return 0;
 
-  return new JoinedAndSeparateArg(this, Index - 2,
-                                  Args.getArgString(Index-2)+strlen(getName()),
-                                  Args.getArgString(Index-1));
+  return new Arg(this, Index - 2, Args.getArgString(Index-2)+strlen(getName())
+                 , Args.getArgString(Index-1));
 }