# HG changeset patch # User Myhailo Danylenko # Date 1361798189 -7200 # Node ID a2f3afbc4000d727cc47ba6ce61f71a77505b1ba # Parent 5616a2397c3c453bbc3bbfae04fd40b52ae0a670 [cmdopts] convert /color diff -r 5616a2397c3c -r a2f3afbc4000 cmdopts.diff --- 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);