forked from Bananymous/banan-os
Userspace: Shell argument parsing now appriciates quotes
This commit is contained in:
parent
f7060970e6
commit
de88f60d1a
|
@ -12,10 +12,55 @@ struct termios old_termios, new_termios;
|
||||||
|
|
||||||
BAN::Vector<BAN::String> parse_command(BAN::StringView command)
|
BAN::Vector<BAN::String> parse_command(BAN::StringView command)
|
||||||
{
|
{
|
||||||
auto args = MUST(command.split(' '));
|
enum class State
|
||||||
|
{
|
||||||
|
Normal,
|
||||||
|
SingleQuote,
|
||||||
|
DoubleQuote,
|
||||||
|
};
|
||||||
|
|
||||||
BAN::Vector<BAN::String> result;
|
BAN::Vector<BAN::String> result;
|
||||||
for (auto arg : args)
|
|
||||||
MUST(result.push_back(arg));
|
State state = State::Normal;
|
||||||
|
BAN::String current;
|
||||||
|
for (char c : command)
|
||||||
|
{
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case State::Normal:
|
||||||
|
if (c == '\'')
|
||||||
|
state = State::SingleQuote;
|
||||||
|
else if (c == '"')
|
||||||
|
state = State::DoubleQuote;
|
||||||
|
else if (!isspace(c))
|
||||||
|
MUST(current.push_back(c));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!current.empty())
|
||||||
|
{
|
||||||
|
MUST(result.push_back(current));
|
||||||
|
current.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case State::SingleQuote:
|
||||||
|
if (c == '\'')
|
||||||
|
state = State::Normal;
|
||||||
|
else
|
||||||
|
MUST(current.push_back(c));
|
||||||
|
break;
|
||||||
|
case State::DoubleQuote:
|
||||||
|
if (c == '"')
|
||||||
|
state = State::Normal;
|
||||||
|
else
|
||||||
|
MUST(current.push_back(c));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: handle state != State::Normal
|
||||||
|
MUST(result.push_back(BAN::move(current)));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue