Modify argument parser for multiple arguments.

Currently, if a test is created like this:

  BIONIC_BENCHMARK_WITH_ARG(BM_bench, "16");

Everything works as expected, a benchmark is created of BM_bench/16.
However, it is not possible to specify a benchmark should be called with
one argument, but iterate over different values. The example:

  BIONIC_BENCHMARK_WITH_ARG(BM_bench, "16 32");

Creates a single benchmark run with two arguments:

  BM_bench/16/32

This change modifies the algorithm to make it possible to create multiple
instances of the benchmark iterating over each argument as a single
argument. After this change, two benchmarks are executed:

  BM_bench/16
  BM_bench/32

To do the previous behavior, use:

  BIONIC_BENCHMARK_WITH_ARG(BM_bench, "16/32");

This will create a single benchmark with two args. This format does
not support spaces in the args, so "16 / 32" is not valid.

Modified the test_small.xml to use the new format.

Test: All unit tests pass.
Change-Id: I6f486e1d4a90580c3dace0581ea65f439911ef5a
diff --git a/benchmarks/bionic_benchmarks.cpp b/benchmarks/bionic_benchmarks.cpp
index 187ee76..74966c0 100644
--- a/benchmarks/bionic_benchmarks.cpp
+++ b/benchmarks/bionic_benchmarks.cpp
@@ -336,16 +336,36 @@
     return to_populate;
   }
 
-  to_populate->push_back(std::vector<int64_t>());
-  std::stringstream sstream(args);
-  std::string argstr;
-  while (sstream >> argstr) {
-    char* check_null;
-    int converted = static_cast<int>(strtol(argstr.c_str(), &check_null, 10));
-    if (*check_null) {
-      errx(1, "ERROR: Args str %s contains an invalid macro or int.", args.c_str());
+  std::string trimmed_args = android::base::Trim(args);
+  if (!trimmed_args.empty()) {
+    std::stringstream sstream(trimmed_args);
+    std::string argstr;
+    while (sstream >> argstr) {
+      char* check_null;
+      int converted = static_cast<int>(strtol(argstr.c_str(), &check_null, 10));
+      if (*check_null == '\0') {
+        to_populate->emplace_back(std::vector<int64_t>{converted});
+        continue;
+      } else if (*check_null == '/') {
+        // The only supported format with a / is \d+(/\d+)\s*. Example 8/8/8 or 16/23.
+        std::vector<int64_t> test_args{converted};
+        while (true) {
+          converted = static_cast<int>(strtol(check_null + 1, &check_null, 10));
+          test_args.push_back(converted);
+          if (*check_null == '\0') {
+            to_populate->emplace_back(std::move(test_args));
+            break;
+          } else if (*check_null != '/') {
+            errx(1, "ERROR: Args str %s contains an invalid macro or int.", args.c_str());
+          }
+        }
+      } else {
+        errx(1, "ERROR: Args str %s contains an invalid macro or int.", args.c_str());
+      }
     }
-    (*to_populate)[0].push_back(converted);
+  } else {
+    // No arguments, only the base benchmark.
+    to_populate->emplace_back(std::vector<int64_t>{});
   }
   return to_populate;
 }