aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2017-04-12 22:16:41 +0100
committerHarry Jeffery <harry@exec64.co.uk>2017-04-12 23:10:58 +0100
commitad33be42c0192a491cce10c1771ed8e2ac1d0196 (patch)
tree9c718d1dc2d23ae4a5e537ab684bf703e59818b7
parent1ce11b6307b1c0cc1ab75547fcb5ea63daf72bfe (diff)
downloadimv-ad33be42c0192a491cce10c1771ed8e2ac1d0196.tar.gz
Add basic command system
-rw-r--r--src/commands.c64
-rw-r--r--src/commands.h26
2 files changed, 90 insertions, 0 deletions
diff --git a/src/commands.c b/src/commands.c
new file mode 100644
index 0000000..9b93933
--- /dev/null
+++ b/src/commands.c
@@ -0,0 +1,64 @@
+/* Copyright (c) 2017 imv authors
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "commands.h"
+#include "list.h"
+
+struct imv_command {
+ const char* command;
+ void (*handler)(struct imv_list *args);
+};
+
+struct imv_list *g_commands = NULL;
+
+void imv_command_register(const char *command, void (*handler)())
+{
+ if(!g_commands) {
+ g_commands = imv_list_create();
+ }
+
+ struct imv_command *cmd = malloc(sizeof(struct imv_command));
+ cmd->command = strdup(command);
+ cmd->handler = handler;
+ imv_list_append(g_commands, cmd);
+}
+
+int imv_command_exec(const char *command)
+{
+ if(!g_commands) {
+ return 1;
+ }
+
+ struct imv_list *args = imv_split_string(command, ' ');
+ int ret = 1;
+
+ if(args->len > 0) {
+ for(size_t i = 0; i < g_commands->len; ++i) {
+ struct imv_command *cmd = g_commands->items[i];
+ if(!strcmp(cmd->command, args->items[0])) {
+ cmd->handler(args);
+ ret = 0;
+ break;
+ }
+ }
+ }
+
+ imv_list_deep_free(args);
+ return ret;
+}
+
+/* vim:set ts=2 sts=2 sw=2 et: */
diff --git a/src/commands.h b/src/commands.h
new file mode 100644
index 0000000..1dfa3bf
--- /dev/null
+++ b/src/commands.h
@@ -0,0 +1,26 @@
+/* Copyright (c) 2017 imv authors
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef COMMANDS_H
+#define COMMANDS_H
+
+void imv_command_register(const char *command, void (*handler)());
+int imv_command_exec(const char *command);
+
+#endif
+
+/* vim:set ts=2 sts=2 sw=2 et: */