diff options
-rw-r--r-- | src/command/cmd_defs.c | 124 | ||||
-rw-r--r-- | src/command/cmd_defs.h | 16 | ||||
-rw-r--r-- | src/command/cmd_funcs.c | 138 | ||||
-rw-r--r-- | src/command/cmd_funcs.h | 91 |
4 files changed, 188 insertions, 181 deletions
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index aa041c6a..100f044e 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -103,8 +103,6 @@ #define CMD_NOEXAMPLES { NULL } } #define CMD_EXAMPLES(...) { __VA_ARGS__, NULL } } -static gboolean _cmd_execute(ProfWin *window, const char *const command, const char *const inp); - GHashTable *commands = NULL; /* @@ -2241,116 +2239,38 @@ cmd_has_tag(Command *pcmd, const char *const tag) return FALSE; } -/* - * Take a line of input and process it, return TRUE if profanity is to - * continue, FALSE otherwise - */ -gboolean -cmd_process_input(ProfWin *window, char *inp) +Command* +cmd_get(const char *const command) { - log_debug("Input received: %s", inp); - gboolean result = FALSE; - g_strchomp(inp); - - // just carry on if no input - if (strlen(inp) == 0) { - result = TRUE; - - // handle command if input starts with a '/' - } else if (inp[0] == '/') { - char *inp_cpy = strdup(inp); - char *command = strtok(inp_cpy, " "); - char *question_mark = strchr(command, '?'); - if (question_mark) { - *question_mark = '\0'; - char *fakeinp; - if (asprintf(&fakeinp, "/help %s", command+1)) { - result = _cmd_execute(window, "/help", fakeinp); - free(fakeinp); - } - } else { - result = _cmd_execute(window, command, inp); - } - free(inp_cpy); - - // call a default handler if input didn't start with '/' + if (commands) { + return g_hash_table_lookup(commands, command); } else { - result = cmd_execute_default(window, inp); + return NULL; } - - return result; } -// Command execution - -void -cmd_execute_connect(ProfWin *window, const char *const account) +GList* +cmd_get_ordered(const char *const tag) { - GString *command = g_string_new("/connect "); - g_string_append(command, account); - cmd_process_input(window, command->str); - g_string_free(command, TRUE); -} - -static gboolean -_cmd_execute(ProfWin *window, const char *const command, const char *const inp) -{ - if (g_str_has_prefix(command, "/field") && window->type == WIN_MUC_CONFIG) { - gboolean result = FALSE; - gchar **args = parse_args_with_freetext(inp, 1, 2, &result); - if (!result) { - ui_current_print_formatted_line('!', 0, "Invalid command, see /form help"); - result = TRUE; - } else { - gchar **tokens = g_strsplit(inp, " ", 2); - char *field = tokens[0] + 1; - result = cmd_form_field(window, field, args); - g_strfreev(tokens); - } - - g_strfreev(args); - return result; - } - - Command *cmd = g_hash_table_lookup(commands, command); - gboolean result = FALSE; - - if (cmd) { - gchar **args = cmd->parser(inp, cmd->min_args, cmd->max_args, &result); - if (result == FALSE) { - ui_invalid_command_usage(cmd->cmd, cmd->setting_func); - return TRUE; - } - if (args[0] && cmd->sub_funcs[0][0]) { - int i = 0; - while (cmd->sub_funcs[i][0]) { - if (g_strcmp0(args[0], (char*)cmd->sub_funcs[i][0]) == 0) { - gboolean (*func)(ProfWin *window, const char *const command, gchar **args) = cmd->sub_funcs[i][1]; - gboolean result = func(window, command, args); - g_strfreev(args); - return result; - } - i++; + GList *ordered_commands = NULL; + + GHashTableIter iter; + gpointer key; + gpointer value; + + g_hash_table_iter_init(&iter, commands); + while (g_hash_table_iter_next(&iter, &key, &value)) { + Command *pcmd = (Command *)value; + if (tag) { + if (cmd_has_tag(pcmd, tag)) { + ordered_commands = g_list_insert_sorted(ordered_commands, pcmd->cmd, (GCompareFunc)g_strcmp0); } - } - if (!cmd->func) { - ui_invalid_command_usage(cmd->cmd, cmd->setting_func); - return TRUE; - } - gboolean result = cmd->func(window, command, args); - g_strfreev(args); - return result; - } else if (plugins_run_command(inp)) { - return TRUE; - } else { - gboolean ran_alias = FALSE; - gboolean alias_result = cmd_execute_alias(window, inp, &ran_alias); - if (!ran_alias) { - return cmd_execute_default(window, inp); } else { - return alias_result; + ordered_commands = g_list_insert_sorted(ordered_commands, pcmd->cmd, (GCompareFunc)g_strcmp0); } } + + return ordered_commands; } static int diff --git a/src/command/cmd_defs.h b/src/command/cmd_defs.h index 7ff98d24..52af140a 100644 --- a/src/command/cmd_defs.h +++ b/src/command/cmd_defs.h @@ -39,25 +39,15 @@ #include "ui/ui.h" -GHashTable *commands; - void cmd_init(void); void cmd_uninit(void); +Command* cmd_get(const char *const command); +GList* cmd_get_ordered(const char *const tag); + gboolean cmd_valid_tag(const char *const str); gboolean cmd_has_tag(Command *pcmd, const char *const tag); -gboolean cmd_process_input(ProfWin *window, char *inp); -void cmd_execute_connect(ProfWin *window, const char *const account); - -GSList* cmd_get_basic_help(void); -GSList* cmd_get_settings_help(void); -GSList* cmd_get_presence_help(void); - -void cmd_history_append(char *inp); -char* cmd_history_previous(char *inp); -char* cmd_history_next(char *inp); - void command_docgen(void); #endif diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 5b267f90..6e7d9040 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -91,8 +91,120 @@ static void _cmd_set_boolean_preference(gchar *arg, const char *const command, const char *const display, preference_t pref); static void _who_room(ProfWin *window, const char *const command, gchar **args); static void _who_roster(ProfWin *window, const char *const command, gchar **args); +static gboolean _cmd_execute(ProfWin *window, const char *const command, const char *const inp); +static gboolean _cmd_execute_alias(ProfWin *window, const char *const inp, gboolean *ran); -extern GHashTable *commands; +/* + * Take a line of input and process it, return TRUE if profanity is to + * continue, FALSE otherwise + */ +gboolean +cmd_process_input(ProfWin *window, char *inp) +{ + log_debug("Input received: %s", inp); + gboolean result = FALSE; + g_strchomp(inp); + + // just carry on if no input + if (strlen(inp) == 0) { + result = TRUE; + + // handle command if input starts with a '/' + } else if (inp[0] == '/') { + char *inp_cpy = strdup(inp); + char *command = strtok(inp_cpy, " "); + char *question_mark = strchr(command, '?'); + if (question_mark) { + *question_mark = '\0'; + char *fakeinp; + if (asprintf(&fakeinp, "/help %s", command+1)) { + result = _cmd_execute(window, "/help", fakeinp); + free(fakeinp); + } + } else { + result = _cmd_execute(window, command, inp); + } + free(inp_cpy); + + // call a default handler if input didn't start with '/' + } else { + result = cmd_execute_default(window, inp); + } + + return result; +} + +// Command execution + +void +cmd_execute_connect(ProfWin *window, const char *const account) +{ + GString *command = g_string_new("/connect "); + g_string_append(command, account); + cmd_process_input(window, command->str); + g_string_free(command, TRUE); +} + +static gboolean +_cmd_execute(ProfWin *window, const char *const command, const char *const inp) +{ + if (g_str_has_prefix(command, "/field") && window->type == WIN_MUC_CONFIG) { + gboolean result = FALSE; + gchar **args = parse_args_with_freetext(inp, 1, 2, &result); + if (!result) { + ui_current_print_formatted_line('!', 0, "Invalid command, see /form help"); + result = TRUE; + } else { + gchar **tokens = g_strsplit(inp, " ", 2); + char *field = tokens[0] + 1; + result = cmd_form_field(window, field, args); + g_strfreev(tokens); + } + + g_strfreev(args); + return result; + } + + Command *cmd = cmd_get(command); + gboolean result = FALSE; + + if (cmd) { + gchar **args = cmd->parser(inp, cmd->min_args, cmd->max_args, &result); + if (result == FALSE) { + ui_invalid_command_usage(cmd->cmd, cmd->setting_func); + return TRUE; + } + if (args[0] && cmd->sub_funcs[0][0]) { + int i = 0; + while (cmd->sub_funcs[i][0]) { + if (g_strcmp0(args[0], (char*)cmd->sub_funcs[i][0]) == 0) { + gboolean (*func)(ProfWin *window, const char *const command, gchar **args) = cmd->sub_funcs[i][1]; + gboolean result = func(window, command, args); + g_strfreev(args); + return result; + } + i++; + } + } + if (!cmd->func) { + ui_invalid_command_usage(cmd->cmd, cmd->setting_func); + return TRUE; + } + gboolean result = cmd->func(window, command, args); + g_strfreev(args); + return result; + } else if (plugins_run_command(inp)) { + return TRUE; + } else { + gboolean ran_alias = FALSE; + gboolean alias_result = _cmd_execute_alias(window, inp, &ran_alias); + if (!ran_alias) { + return cmd_execute_default(window, inp); + } else { + return alias_result; + } + } +} gboolean cmd_execute_default(ProfWin *window, const char *inp) @@ -161,8 +273,8 @@ cmd_execute_default(ProfWin *window, const char *inp) return TRUE; } -gboolean -cmd_execute_alias(ProfWin *window, const char *const inp, gboolean *ran) +static gboolean +_cmd_execute_alias(ProfWin *window, const char *const inp, gboolean *ran) { if (inp[0] != '/') { ran = FALSE; @@ -1523,21 +1635,7 @@ _cmd_help_cmd_list(const char *const tag) } g_list_free(plugins_cmds); } else { - GHashTableIter iter; - gpointer key; - gpointer value; - - g_hash_table_iter_init(&iter, commands); - while (g_hash_table_iter_next(&iter, &key, &value)) { - Command *pcmd = (Command *)value; - if (tag) { - if (cmd_has_tag(pcmd, tag)) { - ordered_commands = g_list_insert_sorted(ordered_commands, pcmd->cmd, (GCompareFunc)g_strcmp0); - } - } else { - ordered_commands = g_list_insert_sorted(ordered_commands, pcmd->cmd, (GCompareFunc)g_strcmp0); - } - } + ordered_commands = cmd_get_ordered(tag); // add plugins if showing all commands if (!tag) { @@ -1608,7 +1706,7 @@ cmd_help(ProfWin *window, const char *const command, gchar **args) char cmd_with_slash[1 + strlen(cmd) + 1]; sprintf(cmd_with_slash, "/%s", cmd); - Command *command = g_hash_table_lookup(commands, cmd_with_slash); + Command *command = cmd_get(cmd_with_slash); if (command) { cons_show_help(cmd_with_slash, &command->help); } else { @@ -3861,7 +3959,7 @@ cmd_form(ProfWin *window, const char *const command, gchar **args) mucconfwin_form_help(confwin); const gchar **help_text = NULL; - Command *command = g_hash_table_lookup(commands, "/form"); + Command *command = cmd_get("/form"); if (command) { help_text = command->help.synopsis; diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h index 9b399a71..5084ecb5 100644 --- a/src/command/cmd_funcs.h +++ b/src/command/cmd_funcs.h @@ -69,22 +69,12 @@ typedef struct cmd_t { CommandHelp help; } Command; -gboolean cmd_execute_alias(ProfWin *window, const char *const inp, gboolean *ran); -gboolean cmd_execute_default(ProfWin *window, const char *inp); -gboolean cmd_about(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_list(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_show(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_add(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_remove(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_enable(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_disable(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_rename(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_default(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_set(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_account_clear(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_process_input(ProfWin *window, char *inp); +void cmd_execute_connect(ProfWin *window, const char *const account); +gboolean cmd_execute_default(ProfWin *window, const char *inp); +gboolean cmd_about(ProfWin *window, const char *const command, gchar **args); gboolean cmd_autoaway(ProfWin *window, const char *const command, gchar **args); gboolean cmd_autoconnect(ProfWin *window, const char *const command, gchar **args); gboolean cmd_autoping(ProfWin *window, const char *const command, gchar **args); @@ -96,14 +86,6 @@ gboolean cmd_chlog(ProfWin *window, const char *const command, gchar **args); gboolean cmd_clear(ProfWin *window, const char *const command, gchar **args); gboolean cmd_close(ProfWin *window, const char *const command, gchar **args); gboolean cmd_connect(ProfWin *window, const char *const command, gchar **args); - -gboolean cmd_tls_certpath(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_tls_trust(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_tls_trusted(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_tls_revoke(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_tls_show(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_tls_cert(ProfWin *window, const char *const command, gchar **args); - gboolean cmd_decline(ProfWin *window, const char *const command, gchar **args); gboolean cmd_disco(ProfWin *window, const char *const command, gchar **args); gboolean cmd_sendfile(ProfWin *window, const char *const command, gchar **args); @@ -130,22 +112,6 @@ gboolean cmd_msg(ProfWin *window, const char *const command, gchar **args); gboolean cmd_nick(ProfWin *window, const char *const command, gchar **args); gboolean cmd_notify(ProfWin *window, const char *const command, gchar **args); gboolean cmd_online(ProfWin *window, const char *const command, gchar **args); - -gboolean cmd_otr_char(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_log(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_libver(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_policy(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_gen(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_myfp(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_theirfp(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_start(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_end(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_trust(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_untrust(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_secret(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_question(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_otr_answer(ProfWin *window, const char *const command, gchar **args); - gboolean cmd_pgp(ProfWin *window, const char *const command, gchar **args); gboolean cmd_outtype(ProfWin *window, const char *const command, gchar **args); gboolean cmd_prefs(ProfWin *window, const char *const command, gchar **args); @@ -168,14 +134,6 @@ gboolean cmd_titlebar(ProfWin *window, const char *const command, gchar **args); gboolean cmd_vercheck(ProfWin *window, const char *const command, gchar **args); gboolean cmd_who(ProfWin *window, const char *const command, gchar **args); gboolean cmd_win(ProfWin *window, const char *const command, gchar **args); - -gboolean cmd_wins(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_wins_unread(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_wins_tidy(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_wins_prune(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_wins_swap(ProfWin *window, const char *const command, gchar **args); -gboolean cmd_wins_autotidy(ProfWin *window, const char *const command, gchar **args); - gboolean cmd_xa(ProfWin *window, const char *const command, gchar **args); gboolean cmd_alias(ProfWin *window, const char *const command, gchar **args); gboolean cmd_xmlconsole(ProfWin *window, const char *const command, gchar **args); @@ -201,6 +159,47 @@ gboolean cmd_console(ProfWin *window, const char *const command, gchar **args); gboolean cmd_plugins(ProfWin *window, const char *const command, gchar **args); gboolean cmd_blocked(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_list(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_show(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_add(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_remove(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_enable(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_disable(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_rename(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_default(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_set(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_account_clear(ProfWin *window, const char *const command, gchar **args); + +gboolean cmd_tls_certpath(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_tls_trust(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_tls_trusted(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_tls_revoke(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_tls_show(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_tls_cert(ProfWin *window, const char *const command, gchar **args); + +gboolean cmd_otr_char(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_log(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_libver(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_policy(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_gen(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_myfp(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_theirfp(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_start(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_end(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_trust(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_untrust(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_secret(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_question(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_otr_answer(ProfWin *window, const char *const command, gchar **args); + +gboolean cmd_wins(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_wins_unread(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_wins_tidy(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_wins_prune(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_wins_swap(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_wins_autotidy(ProfWin *window, const char *const command, gchar **args); + gboolean cmd_form_field(ProfWin *window, char *tag, gchar **args); #endif |