aboutsummaryrefslogtreecommitdiff
path: root/src/commands.c
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2017-08-06 19:45:15 +0100
committerHarry Jeffery <harry@exec64.co.uk>2017-08-06 19:45:15 +0100
commit2ffd6edea17c1ec8fdb33d1135e27db0eb080625 (patch)
tree113e09b6386ad4b69ddb00fb8e6e41fe31261320 /src/commands.c
parentcee36733b5db5dcd0b479663000f889788468c80 (diff)
parent12450f38753699b0e606c3ad542892752da6aca8 (diff)
downloadimv-2ffd6edea17c1ec8fdb33d1135e27db0eb080625.tar.gz
Merge v3 changes into master
Diffstat (limited to 'src/commands.c')
-rw-r--r--src/commands.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/commands.c b/src/commands.c
new file mode 100644
index 0000000..0f31bfc
--- /dev/null
+++ b/src/commands.c
@@ -0,0 +1,90 @@
+/* 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 command {
+ char* command;
+ void (*handler)(struct imv_list *args, void *data);
+ char* alias;
+};
+
+struct imv_commands *imv_commands_create(void)
+{
+ struct imv_commands *cmds = malloc(sizeof(struct imv_commands));
+ cmds->command_list = imv_list_create();
+ return cmds;
+}
+
+void imv_commands_free(struct imv_commands *cmds)
+{
+ for(size_t i = 0; i < cmds->command_list->len; ++i) {
+ struct command *cmd = cmds->command_list->items[i];
+ free(cmd->command);
+ if(cmd->alias) {
+ free(cmd->alias);
+ }
+ free(cmd);
+ }
+ imv_list_free(cmds->command_list);
+ free(cmds);
+}
+
+void imv_command_register(struct imv_commands *cmds, const char *command, void (*handler)())
+{
+ struct command *cmd = malloc(sizeof(struct command));
+ cmd->command = strdup(command);
+ cmd->handler = handler;
+ cmd->alias = NULL;
+ imv_list_append(cmds->command_list, cmd);
+}
+
+void imv_command_alias(struct imv_commands *cmds, const char *command, const char *alias)
+{
+ struct command *cmd = malloc(sizeof(struct command));
+ cmd->command = strdup(command);
+ cmd->handler = NULL;
+ cmd->alias = strdup(alias);
+ imv_list_append(cmds->command_list, cmd);
+}
+
+int imv_command_exec(struct imv_commands *cmds, const char *command, void *data)
+{
+ struct imv_list *args = imv_split_string(command, ' ');
+ int ret = 1;
+
+ if(args->len > 0) {
+ for(size_t i = 0; i < cmds->command_list->len; ++i) {
+ struct command *cmd = cmds->command_list->items[i];
+ if(!strcmp(cmd->command, args->items[0])) {
+ if(cmd->handler) {
+ cmd->handler(args, data);
+ ret = 0;
+ } else if(cmd->alias) {
+ ret = imv_command_exec(cmds, cmd->alias, data);
+ }
+ break;
+ }
+ }
+ }
+
+ imv_list_deep_free(args);
+ return ret;
+}
+
+/* vim:set ts=2 sts=2 sw=2 et: */