about summary refs log tree commit diff stats
path: root/src/command
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2016-06-29 23:35:57 +0100
committerJames Booth <boothj5@gmail.com>2016-06-29 23:35:57 +0100
commita01eb5d08e1b39d60a6f8fc26e5a87ceb92ec18f (patch)
treebe77126865e0cb26963859ad384a225e9c993c9e /src/command
parent61a09476c511c33abd9b6be3d5786fee1fa93b94 (diff)
downloadprofani-tty-a01eb5d08e1b39d60a6f8fc26e5a87ceb92ec18f.tar.gz
WIP - Unload plugin commands
Diffstat (limited to 'src/command')
-rw-r--r--src/command/cmd_ac.c9
-rw-r--r--src/command/cmd_ac.h1
-rw-r--r--src/command/cmd_defs.c9
-rw-r--r--src/command/cmd_funcs.c55
-rw-r--r--src/command/cmd_funcs.h11
5 files changed, 76 insertions, 9 deletions
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c
index 1dfc5cc0..46c1d940 100644
--- a/src/command/cmd_ac.c
+++ b/src/command/cmd_ac.c
@@ -702,6 +702,7 @@ cmd_ac_init(void)
 
     plugins_ac = autocomplete_new();
     autocomplete_add(plugins_ac, "load");
+    autocomplete_add(plugins_ac, "unload");
 
     sendfile_ac = autocomplete_new();
 
@@ -784,6 +785,14 @@ cmd_ac_remove(const char *const value)
     }
 }
 
+void
+cmd_ac_remove_help(const char *const value)
+{
+    if (help_ac) {
+        autocomplete_remove(help_ac, value);
+    }
+}
+
 gboolean
 cmd_ac_exists(char *cmd)
 {
diff --git a/src/command/cmd_ac.h b/src/command/cmd_ac.h
index b294fcd5..637ebcf6 100644
--- a/src/command/cmd_ac.h
+++ b/src/command/cmd_ac.h
@@ -48,6 +48,7 @@ void cmd_ac_add_alias(ProfAlias *alias);
 void cmd_ac_add_alias_value(char *value);
 
 void cmd_ac_remove(const char *const value);
+void cmd_ac_remove_help(const char *const value);
 void cmd_ac_remove_alias_value(char *value);
 
 gboolean cmd_ac_exists(char *cmd);
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c
index dacf1c91..663a8948 100644
--- a/src/command/cmd_defs.c
+++ b/src/command/cmd_defs.c
@@ -1979,13 +1979,16 @@ static struct cmd_t command_defs[] =
         CMD_NOTAGS
         CMD_SYN(
             "/plugins",
-            "/plugins load <plugin>")
+            "/plugins load <plugin>",
+            "/plugins unload <plugin>")
         CMD_DESC(
             "Manage plugins. Passing no arguments lists currently loaded plugins.")
         CMD_ARGS(
-            { "load <plugin>",       "Load a plugin." })
+            { "load <plugin>",       "Load a plugin." },
+            { "unload <plugin>",     "Unload a plugin." })
         CMD_EXAMPLES(
-            "/plugin load browser.py")
+            "/plugin load browser.py",
+            "/plugin unload pid.so")
     },
 
     { "/prefs",
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index 7f3419e3..0d673248 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -95,6 +95,49 @@ static gboolean _cmd_execute(ProfWin *window, const char *const command, const c
 static gboolean _cmd_execute_default(ProfWin *window, const char *inp);
 static gboolean _cmd_execute_alias(ProfWin *window, const char *const inp, gboolean *ran);
 
+void
+command_help_free(CommandHelp *help)
+{
+    free(help->desc);
+
+    if (help->tags) {
+        int i = 0;
+        while (i < 20 && help->tags[i]) {
+            free(help->tags[i]);
+            i++;
+        }
+        free(help->tags);
+    }
+
+    if (help->synopsis) {
+        int i = 0;
+        while (i < 50 && help->synopsis[i]) {
+            free(help->synopsis[i]);
+            i++;
+        }
+        free(help->synopsis);
+    }
+
+    if (help->examples) {
+        int i = 0;
+        while (i < 20 && help->examples[i]) {
+            free(help->examples[i]);
+            i++;
+        }
+        free(help->examples);
+    }
+
+    if (help->args) {
+        int i = 0;
+        while (i < 120 && help->args[i]) {
+            free(help->args[i][0]);
+            free(help->args[i][1]);
+            free(help->args[i]);
+        }
+        free(help->args);
+    }
+}
+
 /*
  * Take a line of input and process it, return TRUE if profanity is to
  * continue, FALSE otherwise
@@ -3809,7 +3852,7 @@ cmd_form(ProfWin *window, const char *const command, gchar **args)
         } else {
             mucconfwin_form_help(confwin);
 
-            const gchar **help_text = NULL;
+            gchar **help_text = NULL;
             Command *command = cmd_get("/form");
 
             if (command) {
@@ -6039,6 +6082,16 @@ cmd_plugins(ProfWin *window, const char *const command, gchar **args)
         }
 
         return TRUE;
+    } else if (g_strcmp0(args[0], "unload") == 0) {
+        if (args[1] == NULL) {
+            cons_bad_cmd_usage(command);
+            return TRUE;
+        }
+        plugins_unload(args[1]);
+        prefs_remove_plugin(args[1]);
+        cons_show("Unloaded plugin: %s", args[1]);
+
+        return TRUE;
     } else {
         GSList *plugins = plugins_get_list();
         GSList *curr = plugins;
diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h
index 52b9946e..c68efe43 100644
--- a/src/command/cmd_funcs.h
+++ b/src/command/cmd_funcs.h
@@ -39,11 +39,11 @@
 
 // Command help strings
 typedef struct cmd_help_t {
-    const gchar *tags[20];
-    const gchar *synopsis[50];
-    const gchar *desc;
-    const gchar *args[128][2];
-    const gchar *examples[20];
+    gchar *tags[20];
+    gchar *synopsis[50];
+    gchar *desc;
+    gchar *args[128][2];
+    gchar *examples[20];
 } CommandHelp;
 
 /*
@@ -69,6 +69,7 @@ typedef struct cmd_t {
     CommandHelp help;
 } Command;
 
+void command_help_free(CommandHelp *help);
 
 gboolean cmd_process_input(ProfWin *window, char *inp);
 void cmd_execute_connect(ProfWin *window, const char *const account);