--- a/cmdopts.diff Mon Feb 25 01:01:36 2013 +0200
+++ b/cmdopts.diff Mon Feb 25 15:16:29 2013 +0200
@@ -6,10 +6,11 @@
* /roster uses parser
* buddy_search() now expects argument in utf8
* /say_to uses parser
+ * /color uses parser
diff -r 92fa48ef53c9 mcabber/mcabber/commands.c
--- a/mcabber/mcabber/commands.c Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/commands.c Mon Feb 25 00:57:09 2013 +0200
++++ b/mcabber/mcabber/commands.c Mon Feb 25 15:15:43 2013 +0200
@@ -755,7 +755,7 @@
g_slist_free(notes);
}
@@ -37,7 +38,7 @@
} else { // Display a note
struct annotation *note = xmpp_get_storage_rosternotes(bjid, FALSE);
if (note) {
-@@ -819,86 +814,136 @@
+@@ -819,164 +814,246 @@
/* All these do_*() functions will be called with a "arg" parameter */
/* (with arg not null) */
@@ -183,42 +184,226 @@
- if (!arg || !*arg) {
- scr_LogPrint(LPRINT_NORMAL, "What name or JID are you looking for?");
- free_arg_lst(paramlst);
-- return;
-- }
+ } else if (subcmd == roster_scmd_search) {
- scr_roster_search(arg);
- update_roster = TRUE;
-- } else if (!strcasecmp(subcmd, "up")) {
++ scr_roster_search(arg);
++ update_roster = TRUE;
+ } else if (subcmd == roster_scmd_up) {
- roster_updown(-1, arg);
-- } else if (!strcasecmp(subcmd, "down")) {
++ roster_updown(-1, arg);
+ } else if (subcmd == roster_scmd_down) {
- roster_updown(1, arg);
-- } else if (!strcasecmp(subcmd, "group_prev")) {
++ roster_updown(1, arg);
+ } else if (subcmd == roster_scmd_group_prev) {
- scr_roster_prev_group();
-- } else if (!strcasecmp(subcmd, "group_next")) {
++ scr_roster_prev_group();
+ } else if (subcmd == roster_scmd_group_next) {
- scr_roster_next_group();
-- } else if (!strcasecmp(subcmd, "note")) {
++ scr_roster_next_group();
+ } else if (subcmd == roster_scmd_note) {
- roster_note(arg);
-- } else if (!strcasecmp(subcmd, "resource_lock")) {
++ roster_note(arg);
+ } else if (subcmd == roster_scmd_resource_lock) {
- roster_resourcelock(arg, TRUE);
++ roster_resourcelock(arg, TRUE);
++ } else { // roster_scmd_resource_unlock
++ roster_resourcelock(arg, FALSE);
++ }
++
++ cmdopts_free(&options);
++}
++
++void do_color(char *arg)
++{
++ enum color_scmd_t {
++ color_scmd_roster,
++ color_scmd_mucnick,
++ color_scmd_muc,
++ } subcmd;
++ cmdopts_t options = {
++ NULL,
++ (cmdarg_t[1]){
++ { CMDOPT_REQUIRED | CMDOPT_SUBCOMMAND | CMDOPT_LAST, { .cmd = NULL } },
++ },
++ (subcmd_t[3]){
++ { 0, "roster",
++ {
++ NULL,
++ (cmdarg_t[3]){
++ { CMDOPT_REQUIRED, { .arg = NULL } }, // status mask or "clear"
++ { 0, { .arg = NULL } }, // jid mask
++ { CMDOPT_LAST, { .arg = NULL } }, // color
++ },
++ NULL,
++ NULL,
++ },
++ (gpointer)color_scmd_roster,
++ },
++ { 0, "muc",
++ {
++ NULL,
++ (cmdarg_t[2]){
++ { CMDOPT_REQUIRED, { .arg = NULL } }, // jid
++ { CMDOPT_LAST, { .arg = "on" } }, // on/off/preset/-
++ },
++ NULL,
++ NULL,
++ },
++ (gpointer)color_scmd_muc,
++ },
++ { CMDOPT_LAST, "mucnick",
++ {
++ NULL,
++ (cmdarg_t[2]){
++ { CMDOPT_REQUIRED, { .arg = NULL } }, // nick
++ { CMDOPT_REQUIRED | CMDOPT_LAST, { .arg = NULL } }, // color
++ },
++ NULL,
++ NULL,
++ },
++ (gpointer)color_scmd_mucnick,
++ },
++ },
++ NULL,
++ };
++
++ {
++ const char *error = cmdopts_parse(arg, &options);
++ if (error != NULL) {
++ scr_log_print(LPRINT_NORMAL, error);
+ return;
+ }
+- scr_roster_search(arg);
+- update_roster = TRUE;
+- } else if (!strcasecmp(subcmd, "up")) {
+- roster_updown(-1, arg);
+- } else if (!strcasecmp(subcmd, "down")) {
+- roster_updown(1, arg);
+- } else if (!strcasecmp(subcmd, "group_prev")) {
+- scr_roster_prev_group();
+- } else if (!strcasecmp(subcmd, "group_next")) {
+- scr_roster_next_group();
+- } else if (!strcasecmp(subcmd, "note")) {
+- roster_note(arg);
+- } else if (!strcasecmp(subcmd, "resource_lock")) {
+- roster_resourcelock(arg, TRUE);
- } else if (!strcasecmp(subcmd, "resource_unlock")) {
-+ } else { // roster_resource_unlock
- roster_resourcelock(arg, FALSE);
+- roster_resourcelock(arg, FALSE);
- } else
- scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
- free_arg_lst(paramlst);
+-}
+-
+-void do_color(char *arg)
+-{
+- char **paramlst;
+- char *subcmd;
+-
+- paramlst = split_arg(arg, 2, 1); // subcmd, arg
+- subcmd = *paramlst;
+- arg = *(paramlst+1);
+-
+- if (!subcmd || !*subcmd) {
+- scr_LogPrint(LPRINT_NORMAL, "Missing parameter.");
+- free_arg_lst(paramlst);
+- return;
+ }
+-
+- if (!strcasecmp(subcmd, "roster")) {
+- char *status, *wildcard, *color;
+- char **arglist = split_arg(arg, 3, 0);
+-
+- status = *arglist;
+- wildcard = to_utf8(arglist[1]);
+- color = arglist[2];
+-
+- if (status && !strcmp(status, "clear")) { // Not a color command, clear all
++
++ subcmd = (enum color_scmd_t) options.args[0].value.cmd -> userdata;
++
++ if (subcmd == color_scmd_roster) {
++ const gchar *status = options.cmds[0].options.args[0].value.arg;
++ const gchar *wildcard = options.cmds[0].options.args[1].value.arg;
++ const gchar *color = options.cmds[0].options.args[2].value.arg;
++ if (!strcmp(status, "clear")) { // Not a color command, clear all
+ scr_roster_clear_color();
+ update_roster = TRUE;
+ } else {
+- if (!status || !*status || !wildcard || !*wildcard || !color || !*color) {
+- scr_LogPrint(LPRINT_NORMAL, "Missing argument");
++ if (!*status || !wildcard || !*wildcard || !color || !*color) {
++ scr_log_print(LPRINT_NORMAL, "Missing argument");
+ } else {
+ update_roster = scr_roster_color(status, wildcard, color) ||
+ update_roster;
+ }
+ }
+- free_arg_lst(arglist);
+- g_free(wildcard);
+- } else if (!strcasecmp(subcmd, "muc")) {
+- char **arglist = split_arg(arg, 2, 0);
+- char *free_muc = to_utf8(*arglist);
+- const char *muc = free_muc, *mode = arglist[1];
+- if (!muc || !*muc)
+- scr_LogPrint(LPRINT_NORMAL, "What MUC?");
+- else {
+- if (!strcmp(muc, "."))
+- if (!(muc = CURRENT_JID))
+- scr_LogPrint(LPRINT_NORMAL, "No JID selected");
+- if (muc) {
+- if (check_jid_syntax(muc) && strcmp(muc, "*"))
+- scr_LogPrint(LPRINT_NORMAL, "Not a JID");
+- else {
+- if (!mode || !*mode || !strcasecmp(mode, "on"))
+- scr_muc_color(muc, MC_ALL);
+- else if (!strcasecmp(mode, "preset"))
+- scr_muc_color(muc, MC_PRESET);
+- else if (!strcasecmp(mode, "off"))
+- scr_muc_color(muc, MC_OFF);
+- else if (!strcmp(mode, "-"))
+- scr_muc_color(muc, MC_REMOVE);
+- else
+- scr_LogPrint(LPRINT_NORMAL, "Unknown coloring mode");
+- }
++ } else if (subcmd == color_scmd_muc) {
++ const gchar *muc = options.cmds[1].options.args[0].value.arg;
++ const gchar *mode = options.cmds[1].options.args[1].value.arg;
++ if (!strcmp(muc, "."))
++ if (!(muc = CURRENT_JID))
++ scr_LogPrint(LPRINT_NORMAL, "No JID selected");
++ if (muc) {
++ if (check_jid_syntax(muc) && strcmp(muc, "*"))
++ scr_LogPrint(LPRINT_NORMAL, "Not a JID");
++ else {
++ if (!strcasecmp(mode, "on"))
++ scr_muc_color(muc, MC_ALL);
++ else if (!strcasecmp(mode, "preset"))
++ scr_muc_color(muc, MC_PRESET);
++ else if (!strcasecmp(mode, "off"))
++ scr_muc_color(muc, MC_OFF);
++ else if (!strcmp(mode, "-"))
++ scr_muc_color(muc, MC_REMOVE);
++ else
++ scr_LogPrint(LPRINT_NORMAL, "Unknown coloring mode");
+ }
+ }
+- free_arg_lst(arglist);
+- g_free(free_muc);
+- } else if (!strcasecmp(subcmd, "mucnick")) {
+- char **arglist = split_arg(arg, 2, 0);
+- const char *nick = *arglist, *color = arglist[1];
+- if (!nick || !*nick || !color || !*color)
+- scr_LogPrint(LPRINT_NORMAL, "Missing argument");
+- else
+- scr_muc_nick_color(nick, color);
+- free_arg_lst(arglist);
+- } else
+- scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
+- free_arg_lst(paramlst);
++ } else { // color_scmd_mucnick
++ const gchar *nick = options.cmds[2].options.args[0].value.arg;
++ const gchar *color = options.cmds[2].options.args[1].value.arg;
++ scr_muc_nick_color(nick, color);
+ }
+
+ cmdopts_free(&options);
}
- void do_color(char *arg)
-@@ -1634,130 +1679,109 @@
+ // cmd_setstatus(recipient, arg)
+@@ -1634,130 +1711,109 @@
static void do_say_to(char *arg)
{
@@ -408,7 +593,7 @@
// buffer_updown(updown, nblines)
diff -r 92fa48ef53c9 mcabber/mcabber/roster.c
--- a/mcabber/mcabber/roster.c Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/roster.c Mon Feb 25 00:57:09 2013 +0200
++++ b/mcabber/mcabber/roster.c Mon Feb 25 15:15:43 2013 +0200
@@ -1586,13 +1586,14 @@
// Look for a buddy whose name or jid contains string.
// Search begins at current_buddy; if no match is found in the the buddylist,
@@ -449,14 +634,14 @@
}
diff -r 92fa48ef53c9 mcabber/mcabber/utils.c
--- a/mcabber/mcabber/utils.c Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/utils.c Mon Feb 25 00:57:09 2013 +0200
-@@ -555,6 +555,313 @@
++++ b/mcabber/mcabber/utils.c Mon Feb 25 15:15:43 2013 +0200
+@@ -555,6 +555,317 @@
*str = tolower(*str);
}
+// in_space -> in_space, in_optstart, in_argstart
+// in_optstart -> in_shortoptend, in_longoptstart, in_argstart ('-')
-+// in_shortoptend -> in_space, error
++// in_shortoptend -> in_space, in_argstart, error
+// in_longoptstart -> in_longopt, in_space, in_argstart ('---')
+// in_longopt -> in_longopt, in_space, error
+// in_argstart -> in_arg, success
@@ -551,7 +736,11 @@
+ error = "Unknown short option";
+ }
+ } else { // short option not ended
-+ error = "Extra characters at short option end";
++ // consider it argument (to allow -autojoin)
++ p --;
++ opts_ended = TRUE;
++ s = p - 1;
++ state = in_argstart;
+ }
+ } else if (state == in_longoptstart) { // long option initialization
+ if (*p == ' ' || *p == '\0') { // end of options '--'
@@ -766,7 +955,7 @@
// Only quotes need a backslash
diff -r 92fa48ef53c9 mcabber/mcabber/utils.h
--- a/mcabber/mcabber/utils.h Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/utils.h Mon Feb 25 00:57:09 2013 +0200
++++ b/mcabber/mcabber/utils.h Mon Feb 25 15:15:43 2013 +0200
@@ -43,6 +43,101 @@
char **split_arg(const char *arg, unsigned int n, int dontstriplast);
void free_arg_lst(char **arglst);