|
|
@@ -53,6 +53,66 @@ ExecutionEnvironment() {
|
|
|
read_args();
|
|
|
}
|
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function: ExecutionEnviroment::expand_string
|
|
|
+// Access: Public, Static
|
|
|
+// Description: Reads the string, looking for environment variable
|
|
|
+// names marked by a $. Expands all such variable
|
|
|
+// names. A repeated dollar sign ($$) is mapped to a
|
|
|
+// single dollar sign.
|
|
|
+//
|
|
|
+// Returns the expanded string.
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+string ExecutionEnvironment::
|
|
|
+expand_string(const string &str) {
|
|
|
+ string result;
|
|
|
+
|
|
|
+ size_t last = 0;
|
|
|
+ size_t dollar = str.find('$');
|
|
|
+ while (dollar != string::npos && dollar + 1 < str.length()) {
|
|
|
+ size_t start = dollar + 1;
|
|
|
+
|
|
|
+ if (str[start] == '$') {
|
|
|
+ // A double dollar sign maps to a single dollar sign.
|
|
|
+ result += str.substr(last, start - last);
|
|
|
+ last = start + 1;
|
|
|
+
|
|
|
+ } else {
|
|
|
+ string varname;
|
|
|
+ size_t end = start;
|
|
|
+
|
|
|
+ if (str[start] == '{') {
|
|
|
+ // Curly braces delimit the variable name explicitly.
|
|
|
+ end = str.find('}', start + 1);
|
|
|
+ if (end != string::npos) {
|
|
|
+ varname = str.substr(start + 1, end - (start + 1));
|
|
|
+ end++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (end == start) {
|
|
|
+ // Scan for the end of the variable name.
|
|
|
+ while (end < str.length() && (isalnum(str[end]) || str[end] == '_')) {
|
|
|
+ end++;
|
|
|
+ }
|
|
|
+ varname = str.substr(start, end - start);
|
|
|
+ }
|
|
|
+
|
|
|
+ string subst =
|
|
|
+ result += str.substr(last, dollar - last);
|
|
|
+ result += get_environment_variable(varname);
|
|
|
+ last = end;
|
|
|
+ }
|
|
|
+
|
|
|
+ dollar = str.find('$', last);
|
|
|
+ }
|
|
|
+
|
|
|
+ result += str.substr(last);
|
|
|
+
|
|
|
+ cerr << "Expanding " << str << " to " << result << "\n";
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
// Function: ExecutionEnviroment::get_cwd
|
|
|
// Access: Public, Static
|