/* Dispatch actions according to program flags (NOT commands or * command options). */ static void cli_context_flag_dispatch (cli_context_t *ctx, gint in_argc, gchar **in_argv) { command_t *cmd; gboolean check; GOptionEntry flagdefs[] = { { "help", 'h', 0, G_OPTION_ARG_NONE, NULL, _("Display this help and exit."), NULL }, { "version", 'v', 0, G_OPTION_ARG_NONE, NULL, _("Output version information and exit."), NULL }, { NULL } }; /* Include one command token as a workaround for the bug that * the option parser does not parse commands starting with a * flag properly (e.g. "-p foo arg1"). Will be skipped by the * command utils. */ cmd = command_new (flagdefs, in_argc + 1, in_argv - 1); if (!cmd) { /* An error message has already been printed, so we just return. */ return; } if (command_flag_boolean_get (cmd, "help", &check) && check) { if (command_arg_count (cmd) >= 1) { help_command (ctx, cli_context_command_names (ctx), command_argv_get (cmd), command_arg_count (cmd), CMD_TYPE_COMMAND); } else { /* FIXME: explain -h and -v flags here (reuse help_command code?) */ g_printf (_("usage: xmms2 [<command> [args]]\n\n")); g_printf (_("XMMS2 CLI, the awesome command-line XMMS2 client from the future, " "v" XMMS_VERSION ".\n\n")); g_printf (_("If given a command, runs it inline and exit.\n")); g_printf (_("If not, enters a shell-like interface to execute commands.\n\n")); g_printf (_("Type 'help <command>' for detailed help about a command.\n")); } } else if (command_flag_boolean_get (cmd, "version", &check) && check) { g_printf (_("XMMS2 CLI version " XMMS_VERSION "\n")); g_printf (_("Copyright (C) 2008-2014 XMMS2 Team\n")); g_printf (_("This is free software; see the source for copying conditions.\n")); g_printf (_("There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" "PARTICULAR PURPOSE.\n")); /* FIXME: compiled against? use RL_READLINE_VERSION? */ g_printf (_(" Using readline version %s\n"), rl_library_version); } else { /* Call help to print the "no such command" error */ /* FIXME: Could be a more helpful "invalid flag"?*/ help_command (ctx, cli_context_command_names (ctx), in_argv, in_argc, CMD_TYPE_COMMAND); } command_free (cmd); }
gboolean cli_help (cli_context_t *ctx, command_t *cmd) { cmd_type_t cmdtype; GList *names; gint num_args; gboolean alias; num_args = command_arg_count (cmd); if (command_flag_boolean_get (cmd, "alias", &alias) && alias) { names = cli_context_alias_names (ctx); cmdtype = CMD_TYPE_ALIAS; } else { names = cli_context_command_names (ctx); cmdtype = CMD_TYPE_COMMAND; } /* No argument, display the list of commands */ if (num_args == 0) { help_list (names, NULL, cmdtype); } else { help_command (ctx, names, command_argv_get (cmd), num_args, cmdtype); } /* No data pending */ return FALSE; }
/* Grab all the arguments after the index as a single string. * Warning: the string must be freed manually afterwards! */ gboolean command_arg_longstring_get (command_context_t *ctx, gint at, gchar **v) { gboolean retval = FALSE; if (at < command_arg_count (ctx)) { *v = g_strjoinv (" ", &(command_arg_get (ctx, at))); retval = TRUE; } return retval; }
gboolean command_arg_string_get (command_context_t *ctx, gint at, const gchar **v) { gboolean retval = FALSE; if (at < command_arg_count (ctx)) { *v = command_arg_get (ctx, at); retval = TRUE; } return retval; }
gboolean command_arg_int_get (command_context_t *ctx, gint at, gint *v) { gboolean retval = FALSE; if (at < command_arg_count (ctx)) { *v = strtol (command_arg_get (ctx, at), NULL, 10); retval = TRUE; } return retval; }
/* Like command_arg_longstring_get but escape spaces with '\'. */ gboolean command_arg_longstring_get_escaped (command_context_t *ctx, gint at, gchar **v) { gboolean retval = FALSE; gchar **args; gint i, len, count = command_arg_count (ctx); len = count-at+1; if (at < count) { args = g_new0 (gchar *, len); args[len-1] = NULL; for (i = at; i < count; i++) { args[i-at] = strescape (command_arg_get (ctx, i), " ", '\\'); } *v = g_strjoinv (" ", args); for (i = at; i < count; i++) { g_free (args[i-at]); } g_free (args); retval = TRUE; }