init: Add support for ${x.y:-default} expansion

commit 00ede7d262 (init: do
expand_props before calling the builtins) broke logpersist

Bug: 28120456
Bug: 22654233
Change-Id: Ib4d8231665b26ac083b02243177493fab41c8978
This commit is contained in:
Mark Salyzyn 2016-06-07 08:49:01 -07:00
parent b67fed557f
commit 4b56162a33

View file

@ -489,6 +489,7 @@ bool expand_props(const std::string& src, std::string* dst) {
* - will accept $$ as a literal $.
* - no nested property expansion, i.e. ${foo.${bar}} is not supported,
* bad things will happen
* - ${x.y:-default} will return default value if property empty.
*/
while (*src_ptr) {
const char* c;
@ -511,6 +512,7 @@ bool expand_props(const std::string& src, std::string* dst) {
}
std::string prop_name;
std::string def_val;
if (*c == '{') {
c++;
const char* end = strchr(c, '}');
@ -521,6 +523,11 @@ bool expand_props(const std::string& src, std::string* dst) {
}
prop_name = std::string(c, end);
c = end + 1;
size_t def = prop_name.find(":-");
if (def < prop_name.size()) {
def_val = prop_name.substr(def + 2);
prop_name = prop_name.substr(0, def);
}
} else {
prop_name = c;
ERROR("using deprecated syntax for specifying property '%s', use ${name} instead\n",
@ -535,9 +542,12 @@ bool expand_props(const std::string& src, std::string* dst) {
std::string prop_val = property_get(prop_name.c_str());
if (prop_val.empty()) {
ERROR("property '%s' doesn't exist while expanding '%s'\n",
prop_name.c_str(), src.c_str());
return false;
if (def_val.empty()) {
ERROR("property '%s' doesn't exist while expanding '%s'\n",
prop_name.c_str(), src.c_str());
return false;
}
prop_val = def_val;
}
dst->append(prop_val);