fix command.h

This commit is contained in:
Kelvin Sherlock 2016-01-29 22:21:51 -05:00
parent 1f02afdd15
commit e28741f97d

View File

@ -1,44 +1,96 @@
#ifndef __command_h__
#define __command_h__
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <array> #include <array>
#include "mpw-shell-grammar.h"
typedef std::unique_ptr<struct command> command_ptr; typedef std::unique_ptr<struct command> command_ptr;
typedef std::vector<command_ptr> command_ptr_vector; typedef std::vector<command_ptr> command_ptr_vector;
typedef std::array<command_ptr, 2> command_ptr_pair; typedef std::array<command_ptr, 2> command_ptr_pair;
struct command {
enum {
}; struct command {
int type;
command(int t = 0) : type(t)
{}
int type = 0;
virtual ~command(); virtual ~command();
virtual int run(); virtual int execute();
}; };
struct simple_command : public command { struct simple_command : public command {
template<class S>
simple_command(S &&s) : command(COMMAND), text(std::forward<S>(s))
{}
std::string text; std::string text;
}; };
struct binary_command : public command { struct binary_command : public command {
binary_command(int t, command_ptr &&a, command_ptr &&b) :
command(t), children({{std::move(a), std::move(b)}})
{}
command_ptr_pair children; command_ptr_pair children;
}; };
struct or_command : public binary_command { struct or_command : public binary_command {
or_command(command_ptr &&a, command_ptr &&b) :
binary_command(PIPE_PIPE, std::move(a), std::move(b))
{}
}; };
struct and_command : public binary_command { struct and_command : public binary_command {
and_command(command_ptr &&a, command_ptr &&b) :
binary_command(AMP_AMP, std::move(a), std::move(b))
{}
}; };
struct begin_command : public command { struct vector_command : public command {
vector_command(int t, command_ptr_vector &&v) : command(t), children(std::move(v))
{}
command_ptr_vector children; command_ptr_vector children;
};
struct begin_command : public vector_command {
template<class S>
begin_command(int t, command_ptr_vector &&v, S &&s) :
vector_command(t, std::move(v)), end(std::forward<S>(s))
{}
std::string end; std::string end;
}; };
struct if_command : public command { struct if_command : public command {
std::string begin;
command_ptr_vector children; typedef std::vector<struct if_else_clause> clause_vector_type;
command_ptr_vector else_clause;
template<class S>
if_command(clause_vector_type &&v, S &&s) :
command(IF), clauses(std::move(v)), end(std::forward<S>(s))
{}
clause_vector_type clauses;
std::string end; std::string end;
}; };
struct if_else_clause : public vector_command {
template<class S>
if_else_clause(int t, command_ptr_vector &&v, S &&s) :
vector_command(t, std::move(v)), clause(std::forward<S>(s))
{}
std::string clause;
bool evaluate();
};
#endif