implement bash specific ${!var}

This commit is contained in:
zawz 2021-02-28 14:15:36 +01:00
parent 06eac33b0a
commit f5e5d32eca
2 changed files with 17 additions and 2 deletions

View file

@ -766,12 +766,23 @@ bool debashify_procsub(list* lst, debashify_params* params)
return has_replaced; return has_replaced;
} }
bool debashify_var(variable* in, debashify_params* params)
{
if(in->is_manip && in->precedence && in->manip->string() == "!")
throw std::runtime_error("Cannot debashify ${!VAR}");
return false;
}
bool r_debashify(_obj* o, debashify_params* params) bool r_debashify(_obj* o, debashify_params* params)
{ {
// global debashifies // global debashifies
debashify_array_arithmetic(o, params); debashify_array_arithmetic(o, params);
switch(o->type) switch(o->type)
{ {
case _obj::_variable: {
variable* t = dynamic_cast<variable*>(o);
debashify_var(t, params);
} break;
case _obj::_arg: { case _obj::_arg: {
arg* t = dynamic_cast<arg*>(o); arg* t = dynamic_cast<arg*>(o);
debashify_array_get(t, params); debashify_array_get(t, params);

View file

@ -282,9 +282,13 @@ std::pair<variable*, uint32_t> parse_manipulation(const char* in, uint32_t size,
{ {
#endif #endif
; ;
if(in[i] == '#') if(in[i] == '#' || in[i] == '!')
{ {
precede = new arg("#"); if(!g_bash && in[i] == '!')
throw PARSE_ERROR("bash specific: '${!}'", i);
std::string t;
t+=in[i];
precede = new arg( t );
i++; i++;
} }