summaryrefslogtreecommitdiff
path: root/commands.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'commands.cpp')
-rw-r--r--commands.cpp75
1 files changed, 64 insertions, 11 deletions
diff --git a/commands.cpp b/commands.cpp
index de7d81e..54fe891 100644
--- a/commands.cpp
+++ b/commands.cpp
@@ -1,5 +1,6 @@
#include "commands.h"
#include "error.h"
+#include "util.h"
#include <cctype>
#include <iostream>
@@ -11,10 +12,16 @@
#include <regex>
#include <cstring>
-using std::cout, std::endl, std::string, std::vector, std::tolower;
+using std::cout, std::endl, std::string, std::vector;
+
+const void CommandsModule::echo(const CommandArg* argv)
+{
+ cout << argv[0].str << endl;
+}
CommandsModule::CommandsModule()
{
+ addCommand("echo", &CommandsModule::echo, 1, {STR_REST}, this);
}
CommandsModule::~CommandsModule()
{
@@ -129,13 +136,6 @@ vector<string> CommandsModule::splitCommand(string command)
return v;
}
-string lowercase(string s)
-{
- string s2 = s;
- std::transform(s2.begin(), s2.end(), s2.begin(), [](unsigned char c){ return std::tolower(c); });
- return s2;
-}
-
CommandArg* CommandsModule::getCommandArgs(vector<string>& split, const CommandArgType* argTypes, const int argc)
{
CommandArg* args = new CommandArg[argc];
@@ -215,11 +215,36 @@ CommandArg* CommandsModule::getCommandArgs(vector<string>& split, const CommandA
void CommandsModule::runCommand(string command)
{
vector<string> split = splitCommand(command);
+ vector<string>::const_iterator start = split.begin();
+ int count = 0;
+ for(string s : split)
+ {
+ if(s == ";")
+ {
+ vector<string>::const_iterator end = start + count;
+ vector<string> partialCmd(start, end);
+ runCommand(partialCmd);
+ count = 0;
+ start = end + 1;
+ }
+ else
+ {
+ count++;
+ }
+ }
+ if(start != split.end())
+ {
+ vector<string> partialCmd(start, (vector<string>::const_iterator)split.end());
+ runCommand(partialCmd);
+ }
+}
+void CommandsModule::runCommand(vector<string> split)
+{
Command* cmd = lookupCommand(split[0]);
if(cmd == nullptr)
throw Err(CMD_ERR_NOT_FOUND, split[0] + " is not a valid command name");
if(cmd->argc > split.size() - 1)
- throw Err(CMD_ERR_WRONG_ARGS, command + " is the wrong args");
+ throw Err(CMD_ERR_WRONG_ARGS, "wrong number of arguments");
CommandArg* args;
try
{
@@ -254,14 +279,42 @@ void CommandsModule::runCommand(string command)
delete[] args;
}
-Err CommandsModule::checkCommand(string command)
+vector<Err> CommandsModule::checkCommand(string command)
{
+ vector<Err> errs;
vector<string> split = splitCommand(command);
+ vector<string>::const_iterator start = split.begin();
+ int count = 0;
+ for(string s : split)
+ {
+ if(s == ";")
+ {
+ vector<string>::const_iterator end = start + count;
+ vector<string> partialCmd(start, end);
+ errs.push_back(checkCommand(partialCmd));
+ count = 0;
+ start = end + 1;
+ }
+ else
+ {
+ count++;
+ }
+ }
+ if(start != split.end())
+ {
+ vector<string> partialCmd(start, (vector<string>::const_iterator)split.end());
+ errs.push_back(checkCommand(partialCmd));
+ }
+ return errs;
+}
+
+Err CommandsModule::checkCommand(vector<string> split)
+{
Command* cmd = lookupCommand(split[0]);
if(cmd == nullptr)
return Err(CMD_ERR_NOT_FOUND, split[0] + " is not a valid command name");
if(cmd->argc > split.size())
- return Err(CMD_ERR_WRONG_ARGS, command + " is the wrong args");
+ return Err(CMD_ERR_WRONG_ARGS, "wrong number of arguments");
CommandArg* args;
try
{