Changed: Implement expandEnvironmentVariables function
--HG-- branch : develop
This commit is contained in:
parent
ad36e59a71
commit
af9610328f
2 changed files with 79 additions and 0 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue