mirror of
https://github.com/ksherlock/mpw-shell.git
synced 2024-12-29 00:30:57 +00:00
fix command.h
This commit is contained in:
parent
1f02afdd15
commit
e28741f97d
72
command.h
72
command.h
@ -1,44 +1,96 @@
|
||||
#ifndef __command_h__
|
||||
#define __command_h__
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <array>
|
||||
#include "mpw-shell-grammar.h"
|
||||
|
||||
typedef std::unique_ptr<struct command> command_ptr;
|
||||
typedef std::vector<command_ptr> command_ptr_vector;
|
||||
typedef std::array<command_ptr, 2> command_ptr_pair;
|
||||
|
||||
struct command {
|
||||
enum {
|
||||
|
||||
};
|
||||
int type;
|
||||
struct command {
|
||||
|
||||
command(int t = 0) : type(t)
|
||||
{}
|
||||
|
||||
int type = 0;
|
||||
virtual ~command();
|
||||
virtual int run();
|
||||
virtual int execute();
|
||||
};
|
||||
|
||||
struct simple_command : public command {
|
||||
template<class S>
|
||||
simple_command(S &&s) : command(COMMAND), text(std::forward<S>(s))
|
||||
{}
|
||||
|
||||
std::string text;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
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 {
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
struct if_command : public command {
|
||||
std::string begin;
|
||||
command_ptr_vector children;
|
||||
command_ptr_vector else_clause;
|
||||
|
||||
typedef std::vector<struct if_else_clause> clause_vector_type;
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
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
|
Loading…
Reference in New Issue
Block a user