Code drop from //branches/cupcake/...@124589
diff --git a/tools/atree/atree.cpp b/tools/atree/atree.cpp
index 4d97d24..aee2b3c 100644
--- a/tools/atree/atree.cpp
+++ b/tools/atree/atree.cpp
@@ -5,12 +5,15 @@
#include "files.h"
#include "fs.h"
#include <set>
+#include <iostream>
+#include <sstream>
using namespace std;
bool g_debug = false;
vector<string> g_listFiles;
vector<string> g_inputBases;
+map<string, string> g_variables;
string g_outputBase;
string g_dependency;
bool g_useHardLinks = false;
@@ -29,6 +32,7 @@
" -l Use hard links instead of copying the files.\n"
" -m DEPENDENCY Output a make-formatted file containing the list.\n"
" of files included. It sets the variable ATREE_FILES.\n"
+" -v VAR=VAL Replaces ${VAR} by VAL when reading input files.\n"
"\n"
"FILELIST file format:\n"
" The FILELIST files contain the list of files that will end up\n"
@@ -53,13 +57,28 @@
return 1;
}
+static bool
+add_variable(const char* arg) {
+ const char* p = arg;
+ while (*p && *p != '=') p++;
+
+ if (*p == 0 || p == arg || p[1] == 0) {
+ return false;
+ }
+
+ ostringstream var;
+ var << "${" << string(arg, p-arg) << "}";
+ g_variables[var.str()] = string(p+1);
+ return true;
+}
+
int
main(int argc, char* const* argv)
{
int err;
bool done = false;
while (!done) {
- int opt = getopt(argc, argv, "f:I:o:hlm:");
+ int opt = getopt(argc, argv, "f:I:o:hlm:v:");
switch (opt)
{
case -1:
@@ -90,6 +109,14 @@
}
g_dependency = optarg;
break;
+ case 'v':
+ if (!add_variable(optarg)) {
+ fprintf(stderr, "%s Invalid expression in '-v %s': "
+ "expected format is '-v VAR=VALUE'.\n",
+ argv[0], optarg);
+ return usage();
+ }
+ break;
default:
case '?':
case 'h':
@@ -143,7 +170,7 @@
// read file lists
for (vector<string>::iterator it=g_listFiles.begin();
it!=g_listFiles.end(); it++) {
- err = read_list_file(*it, &files, &excludes);
+ err = read_list_file(*it, g_variables, &files, &excludes);
if (err != 0) {
return err;
}