feat(bash): support bash time syntax
This commit is contained in:
parent
6453b44b00
commit
f74c97fc7f
3 changed files with 21 additions and 6 deletions
|
|
@ -287,12 +287,13 @@ public:
|
||||||
class pipeline_t : public _obj
|
class pipeline_t : public _obj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
pipeline_t(block_t* bl=nullptr) { type=_obj::pipeline; if(bl!=nullptr) cmds.push_back(bl); negated=false; }
|
pipeline_t(block_t* bl=nullptr) { type=_obj::pipeline; if(bl!=nullptr) cmds.push_back(bl); negated=false; bash_time=false; }
|
||||||
~pipeline_t() { for(auto it: cmds) delete it; }
|
~pipeline_t() { for(auto it: cmds) delete it; }
|
||||||
inline void add(block_t* bl) { this->cmds.push_back(bl); }
|
inline void add(block_t* bl) { this->cmds.push_back(bl); }
|
||||||
std::vector<block_t*> cmds;
|
std::vector<block_t*> cmds;
|
||||||
|
|
||||||
bool negated; // negated return value (! at start)
|
bool negated; // negated return value (! at start)
|
||||||
|
bool bash_time; // has bash time command
|
||||||
|
|
||||||
std::string generate(int ind, generate_context* ctx);
|
std::string generate(int ind, generate_context* ctx);
|
||||||
std::string generate(int ind) { return this->generate(ind, nullptr); };
|
std::string generate(int ind) { return this->generate(ind, nullptr); };
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,10 @@ std::string pipeline_t::generate(int ind, generate_context* ctx)
|
||||||
|
|
||||||
if(negated)
|
if(negated)
|
||||||
ret += "! ";
|
ret += "! ";
|
||||||
|
|
||||||
|
if(bash_time)
|
||||||
|
ret += "time ";
|
||||||
|
|
||||||
ret += cmds[0]->generate(ind, ctx);
|
ret += cmds[0]->generate(ind, ctx);
|
||||||
for(uint32_t i=1 ; i<cmds.size() ; i++)
|
for(uint32_t i=1 ; i<cmds.size() ; i++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -931,12 +931,22 @@ std::pair<pipeline_t*, parse_context> parse_pipeline(parse_context ctx)
|
||||||
{
|
{
|
||||||
pipeline_t* ret = new pipeline_t;
|
pipeline_t* ret = new pipeline_t;
|
||||||
|
|
||||||
if(ctx[ctx.i] == '!' && ctx.i+1<ctx.size && is_in(ctx[ctx.i+1], SPACES))
|
while(true) {
|
||||||
{
|
auto wp = get_word(ctx, ARG_END);
|
||||||
ret->negated = true;
|
if(ctx[ctx.i] == '!' && ctx.i+1<ctx.size && is_in(ctx[ctx.i+1], SPACES))
|
||||||
ctx.i++;
|
{
|
||||||
ctx.i=skip_chars(ctx, SPACES);
|
ret->negated = ret->negated ? false : true;
|
||||||
|
ctx.i++;
|
||||||
|
ctx.i=skip_chars(ctx, SPACES);
|
||||||
|
} else if(ctx.bash && wp.first == "time" ) {
|
||||||
|
ret->bash_time = true;
|
||||||
|
ctx.i+=4;
|
||||||
|
ctx.i=skip_chars(ctx, SPACES);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while(ctx.i<ctx.size)
|
while(ctx.i<ctx.size)
|
||||||
{
|
{
|
||||||
auto pp=parse_block(ctx);
|
auto pp=parse_block(ctx);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue