[cmdopts] convert /color
authorMyhailo Danylenko <isbear@ukrpost.net>
Mon, 25 Feb 2013 15:16:29 +0200
changeset 67 a2f3afbc4000
parent 66 5616a2397c3c
child 68 c2334fb31211
[cmdopts] convert /color
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);