From ad33be42c0192a491cce10c1771ed8e2ac1d0196 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 12 Apr 2017 22:16:41 +0100 Subject: Add basic command system --- src/commands.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/commands.c (limited to 'src/commands.c') 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: */ -- cgit v1.2.3