Changed: Implement expandEnvironmentVariables function

This commit is contained in:
kervala 2016-01-13 19:45:02 +01:00
parent b8d7b685f5
commit 179499a5c1
2 changed files with 79 additions and 0 deletions

View file

@ -360,6 +360,11 @@ sint launchProgramAndWaitForResult (const std::string &programName, const std::s
/// This function executes a program and returns output as a string /// This function executes a program and returns output as a string
std::string getCommandOutput(const std::string &command); std::string getCommandOutput(const std::string &command);
/// This function replace all environment variables in a string by their content.
/// Environment variables names can use both Windows (%NAME%) and UNIX syntax ($NAME)
/// Authorized characters in names are A-Z, a-z, 0-9 and _
std::string expandEnvironmentVariables(const std::string &s);
/// This function kills a program using his pid (on unix, it uses the kill() POSIX function) /// This function kills a program using his pid (on unix, it uses the kill() POSIX function)
bool killProgram(uint32 pid); bool killProgram(uint32 pid);

View file

@ -913,6 +913,80 @@ std::string getCommandOutput(const std::string &command)
return result; return result;
} }
std::string expandEnvironmentVariables(const std::string &s)
{
size_t len = s.length();
std::string ret;
std::string::size_type pos1 = 0, pos2 = 0;
// look for environement variables delimiters
while(pos2 < len && (pos1 = s.find_first_of("%$", pos2)) != std::string::npos)
{
// copy string unprocessed part
ret += s.substr(pos2, pos1-pos2);
// extract a valid variable name (a-zA-Z0-9_)
pos2 = pos1+1;
while(pos2 < len && (isalnum(s[pos2]) || s[pos2] == '_')) ++pos2;
// check if variable name is empty
bool found = pos2 > pos1+1;
std::string name;
if (found)
{
// found at least 1 character
name = s.substr(pos1+1, pos2-pos1-1);
}
// Windows format needs a trailing % delimiter
if (found && s[pos1] == '%')
{
if (pos2 >= len || s[pos2] != '%')
{
// not a variable name, because no trailing %
found = false;
}
else
{
// found a trailing %, next character to check
++pos2;
}
}
// get variable value if name found
if (found)
{
const char *value = getenv(name.c_str());
if (value)
{
// value found
ret += std::string(value);
}
else
{
// value not found
found = false;
}
}
if (!found)
{
// variable or value not found, don't evaluate variable
ret += s.substr(pos1, pos2-pos1);
}
}
// copy last unprocessed part
ret += s.substr(pos2);
return ret;
}
/* /*
* Display the bits (with 0 and 1) composing a byte (from right to left) * Display the bits (with 0 and 1) composing a byte (from right to left)
*/ */