cmdopts.diff
changeset 67 a2f3afbc4000
parent 66 5616a2397c3c
child 68 c2334fb31211
equal deleted inserted replaced
66:5616a2397c3c 67:a2f3afbc4000
     4 
     4 
     5   * cmdopts_parse() & cmdopts_free() in utils.c/h
     5   * cmdopts_parse() & cmdopts_free() in utils.c/h
     6   * /roster uses parser
     6   * /roster uses parser
     7     * buddy_search() now expects argument in utf8
     7     * buddy_search() now expects argument in utf8
     8   * /say_to uses parser
     8   * /say_to uses parser
       
     9   * /color uses parser
     9 
    10 
    10 diff -r 92fa48ef53c9 mcabber/mcabber/commands.c
    11 diff -r 92fa48ef53c9 mcabber/mcabber/commands.c
    11 --- a/mcabber/mcabber/commands.c	Sun Jan 27 00:40:37 2013 +0200
    12 --- a/mcabber/mcabber/commands.c	Sun Jan 27 00:40:37 2013 +0200
    12 +++ b/mcabber/mcabber/commands.c	Mon Feb 25 00:57:09 2013 +0200
    13 +++ b/mcabber/mcabber/commands.c	Mon Feb 25 15:15:43 2013 +0200
    13 @@ -755,7 +755,7 @@
    14 @@ -755,7 +755,7 @@
    14    g_slist_free(notes);
    15    g_slist_free(notes);
    15  }
    16  }
    16  
    17  
    17 -static void roster_note(char *arg)
    18 -static void roster_note(char *arg)
    35 +      arg = NULL; // delete note
    36 +      arg = NULL; // delete note
    36 +    xmpp_set_storage_rosternotes(bjid, arg);
    37 +    xmpp_set_storage_rosternotes(bjid, arg);
    37    } else {      // Display a note
    38    } else {      // Display a note
    38      struct annotation *note = xmpp_get_storage_rosternotes(bjid, FALSE);
    39      struct annotation *note = xmpp_get_storage_rosternotes(bjid, FALSE);
    39      if (note) {
    40      if (note) {
    40 @@ -819,86 +814,136 @@
    41 @@ -819,164 +814,246 @@
    41  /* All these do_*() functions will be called with a "arg" parameter */
    42  /* All these do_*() functions will be called with a "arg" parameter */
    42  /* (with arg not null)                                              */
    43  /* (with arg not null)                                              */
    43  
    44  
    44 -static void do_roster(char *arg)
    45 -static void do_roster(char *arg)
    45 +static void do_roster(char *args)
    46 +static void do_roster(char *args)
   181 -  } else if (!strncasecmp(subcmd, "search", 6)) {
   182 -  } else if (!strncasecmp(subcmd, "search", 6)) {
   182 -    strip_arg_special_chars(arg);
   183 -    strip_arg_special_chars(arg);
   183 -    if (!arg || !*arg) {
   184 -    if (!arg || !*arg) {
   184 -      scr_LogPrint(LPRINT_NORMAL, "What name or JID are you looking for?");
   185 -      scr_LogPrint(LPRINT_NORMAL, "What name or JID are you looking for?");
   185 -      free_arg_lst(paramlst);
   186 -      free_arg_lst(paramlst);
   186 -      return;
       
   187 -    }
       
   188 +  } else if (subcmd == roster_scmd_search) {
   187 +  } else if (subcmd == roster_scmd_search) {
   189      scr_roster_search(arg);
   188 +    scr_roster_search(arg);
   190      update_roster = TRUE;
   189 +    update_roster = TRUE;
       
   190 +  } else if (subcmd == roster_scmd_up) {
       
   191 +    roster_updown(-1, arg);
       
   192 +  } else if (subcmd == roster_scmd_down) {
       
   193 +    roster_updown(1, arg);
       
   194 +  } else if (subcmd == roster_scmd_group_prev) {
       
   195 +    scr_roster_prev_group();
       
   196 +  } else if (subcmd == roster_scmd_group_next) {
       
   197 +    scr_roster_next_group();
       
   198 +  } else if (subcmd == roster_scmd_note) {
       
   199 +    roster_note(arg);
       
   200 +  } else if (subcmd == roster_scmd_resource_lock) {
       
   201 +    roster_resourcelock(arg, TRUE);
       
   202 +  } else { // roster_scmd_resource_unlock
       
   203 +    roster_resourcelock(arg, FALSE);
       
   204 +  }
       
   205 +
       
   206 +  cmdopts_free(&options);
       
   207 +}
       
   208 +
       
   209 +void do_color(char *arg)
       
   210 +{
       
   211 +  enum color_scmd_t {
       
   212 +    color_scmd_roster,
       
   213 +    color_scmd_mucnick,
       
   214 +    color_scmd_muc,
       
   215 +  } subcmd;
       
   216 +  cmdopts_t options = {
       
   217 +    NULL,
       
   218 +    (cmdarg_t[1]){
       
   219 +      { CMDOPT_REQUIRED | CMDOPT_SUBCOMMAND | CMDOPT_LAST, { .cmd = NULL } },
       
   220 +    },
       
   221 +    (subcmd_t[3]){
       
   222 +      { 0, "roster",
       
   223 +        {
       
   224 +          NULL,
       
   225 +          (cmdarg_t[3]){
       
   226 +            { CMDOPT_REQUIRED, { .arg = NULL } }, // status mask or "clear"
       
   227 +            { 0,               { .arg = NULL } }, // jid mask
       
   228 +            { CMDOPT_LAST,     { .arg = NULL } }, // color
       
   229 +          },
       
   230 +          NULL,
       
   231 +          NULL,
       
   232 +        },
       
   233 +        (gpointer)color_scmd_roster,
       
   234 +      },
       
   235 +      { 0, "muc",
       
   236 +        {
       
   237 +          NULL,
       
   238 +          (cmdarg_t[2]){
       
   239 +            { CMDOPT_REQUIRED, { .arg = NULL } }, // jid
       
   240 +            { CMDOPT_LAST,     { .arg = "on" } }, // on/off/preset/-
       
   241 +          },
       
   242 +          NULL,
       
   243 +          NULL,
       
   244 +        },
       
   245 +        (gpointer)color_scmd_muc,
       
   246 +      },
       
   247 +      { CMDOPT_LAST, "mucnick",
       
   248 +        {
       
   249 +          NULL,
       
   250 +          (cmdarg_t[2]){
       
   251 +            { CMDOPT_REQUIRED,               { .arg = NULL } }, // nick
       
   252 +            { CMDOPT_REQUIRED | CMDOPT_LAST, { .arg = NULL } }, // color
       
   253 +          },
       
   254 +          NULL,
       
   255 +          NULL,
       
   256 +        },
       
   257 +        (gpointer)color_scmd_mucnick,
       
   258 +      },
       
   259 +    },
       
   260 +    NULL,
       
   261 +  };
       
   262 +
       
   263 +  {
       
   264 +    const char *error = cmdopts_parse(arg, &options);
       
   265 +    if (error != NULL) {
       
   266 +      scr_log_print(LPRINT_NORMAL, error);
       
   267        return;
       
   268      }
       
   269 -    scr_roster_search(arg);
       
   270 -    update_roster = TRUE;
   191 -  } else if (!strcasecmp(subcmd, "up")) {
   271 -  } else if (!strcasecmp(subcmd, "up")) {
   192 +  } else if (subcmd == roster_scmd_up) {
   272 -    roster_updown(-1, arg);
   193      roster_updown(-1, arg);
       
   194 -  } else if (!strcasecmp(subcmd, "down")) {
   273 -  } else if (!strcasecmp(subcmd, "down")) {
   195 +  } else if (subcmd == roster_scmd_down) {
   274 -    roster_updown(1, arg);
   196      roster_updown(1, arg);
       
   197 -  } else if (!strcasecmp(subcmd, "group_prev")) {
   275 -  } else if (!strcasecmp(subcmd, "group_prev")) {
   198 +  } else if (subcmd == roster_scmd_group_prev) {
   276 -    scr_roster_prev_group();
   199      scr_roster_prev_group();
       
   200 -  } else if (!strcasecmp(subcmd, "group_next")) {
   277 -  } else if (!strcasecmp(subcmd, "group_next")) {
   201 +  } else if (subcmd == roster_scmd_group_next) {
   278 -    scr_roster_next_group();
   202      scr_roster_next_group();
       
   203 -  } else if (!strcasecmp(subcmd, "note")) {
   279 -  } else if (!strcasecmp(subcmd, "note")) {
   204 +  } else if (subcmd == roster_scmd_note) {
   280 -    roster_note(arg);
   205      roster_note(arg);
       
   206 -  } else if (!strcasecmp(subcmd, "resource_lock")) {
   281 -  } else if (!strcasecmp(subcmd, "resource_lock")) {
   207 +  } else if (subcmd == roster_scmd_resource_lock) {
   282 -    roster_resourcelock(arg, TRUE);
   208      roster_resourcelock(arg, TRUE);
       
   209 -  } else if (!strcasecmp(subcmd, "resource_unlock")) {
   283 -  } else if (!strcasecmp(subcmd, "resource_unlock")) {
   210 +  } else { // roster_resource_unlock
   284 -    roster_resourcelock(arg, FALSE);
   211      roster_resourcelock(arg, FALSE);
       
   212 -  } else
   285 -  } else
   213 -    scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
   286 -    scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
   214 -  free_arg_lst(paramlst);
   287 -  free_arg_lst(paramlst);
       
   288 -}
       
   289 -
       
   290 -void do_color(char *arg)
       
   291 -{
       
   292 -  char **paramlst;
       
   293 -  char *subcmd;
       
   294 -
       
   295 -  paramlst = split_arg(arg, 2, 1); // subcmd, arg
       
   296 -  subcmd = *paramlst;
       
   297 -  arg = *(paramlst+1);
       
   298 -
       
   299 -  if (!subcmd || !*subcmd) {
       
   300 -    scr_LogPrint(LPRINT_NORMAL, "Missing parameter.");
       
   301 -    free_arg_lst(paramlst);
       
   302 -    return;
       
   303    }
       
   304 -
       
   305 -  if (!strcasecmp(subcmd, "roster")) {
       
   306 -    char *status, *wildcard, *color;
       
   307 -    char **arglist = split_arg(arg, 3, 0);
       
   308 -
       
   309 -    status = *arglist;
       
   310 -    wildcard = to_utf8(arglist[1]);
       
   311 -    color = arglist[2];
       
   312 -
       
   313 -    if (status && !strcmp(status, "clear")) { // Not a color command, clear all
       
   314 +  
       
   315 +  subcmd = (enum color_scmd_t) options.args[0].value.cmd -> userdata;
       
   316 +
       
   317 +  if (subcmd == color_scmd_roster) {
       
   318 +    const gchar *status   = options.cmds[0].options.args[0].value.arg;
       
   319 +    const gchar *wildcard = options.cmds[0].options.args[1].value.arg;
       
   320 +    const gchar *color    = options.cmds[0].options.args[2].value.arg;
       
   321 +    if (!strcmp(status, "clear")) { // Not a color command, clear all
       
   322        scr_roster_clear_color();
       
   323        update_roster = TRUE;
       
   324      } else {
       
   325 -      if (!status || !*status || !wildcard || !*wildcard || !color || !*color) {
       
   326 -        scr_LogPrint(LPRINT_NORMAL, "Missing argument");
       
   327 +      if (!*status || !wildcard || !*wildcard || !color || !*color) {
       
   328 +        scr_log_print(LPRINT_NORMAL, "Missing argument");
       
   329        } else {
       
   330          update_roster = scr_roster_color(status, wildcard, color) ||
       
   331                          update_roster;
       
   332        }
       
   333      }
       
   334 -    free_arg_lst(arglist);
       
   335 -    g_free(wildcard);
       
   336 -  } else if (!strcasecmp(subcmd, "muc")) {
       
   337 -    char **arglist = split_arg(arg, 2, 0);
       
   338 -    char *free_muc = to_utf8(*arglist);
       
   339 -    const char *muc = free_muc, *mode = arglist[1];
       
   340 -    if (!muc || !*muc)
       
   341 -      scr_LogPrint(LPRINT_NORMAL, "What MUC?");
       
   342 -    else {
       
   343 -      if (!strcmp(muc, "."))
       
   344 -        if (!(muc = CURRENT_JID))
       
   345 -          scr_LogPrint(LPRINT_NORMAL, "No JID selected");
       
   346 -      if (muc) {
       
   347 -        if (check_jid_syntax(muc) && strcmp(muc, "*"))
       
   348 -          scr_LogPrint(LPRINT_NORMAL, "Not a JID");
       
   349 -        else {
       
   350 -          if (!mode || !*mode || !strcasecmp(mode, "on"))
       
   351 -            scr_muc_color(muc, MC_ALL);
       
   352 -          else if (!strcasecmp(mode, "preset"))
       
   353 -            scr_muc_color(muc, MC_PRESET);
       
   354 -          else if (!strcasecmp(mode, "off"))
       
   355 -            scr_muc_color(muc, MC_OFF);
       
   356 -          else if (!strcmp(mode, "-"))
       
   357 -            scr_muc_color(muc, MC_REMOVE);
       
   358 -          else
       
   359 -            scr_LogPrint(LPRINT_NORMAL, "Unknown coloring mode");
       
   360 -        }
       
   361 +  } else if (subcmd == color_scmd_muc) {
       
   362 +    const gchar *muc  = options.cmds[1].options.args[0].value.arg;
       
   363 +    const gchar *mode = options.cmds[1].options.args[1].value.arg;
       
   364 +    if (!strcmp(muc, "."))
       
   365 +      if (!(muc = CURRENT_JID))
       
   366 +        scr_LogPrint(LPRINT_NORMAL, "No JID selected");
       
   367 +    if (muc) {
       
   368 +      if (check_jid_syntax(muc) && strcmp(muc, "*"))
       
   369 +        scr_LogPrint(LPRINT_NORMAL, "Not a JID");
       
   370 +      else {
       
   371 +        if (!strcasecmp(mode, "on"))
       
   372 +          scr_muc_color(muc, MC_ALL);
       
   373 +        else if (!strcasecmp(mode, "preset"))
       
   374 +          scr_muc_color(muc, MC_PRESET);
       
   375 +        else if (!strcasecmp(mode, "off"))
       
   376 +          scr_muc_color(muc, MC_OFF);
       
   377 +        else if (!strcmp(mode, "-"))
       
   378 +          scr_muc_color(muc, MC_REMOVE);
       
   379 +        else
       
   380 +          scr_LogPrint(LPRINT_NORMAL, "Unknown coloring mode");
       
   381        }
       
   382      }
       
   383 -    free_arg_lst(arglist);
       
   384 -    g_free(free_muc);
       
   385 -  } else if (!strcasecmp(subcmd, "mucnick")) {
       
   386 -    char **arglist = split_arg(arg, 2, 0);
       
   387 -    const char *nick = *arglist, *color = arglist[1];
       
   388 -    if (!nick || !*nick || !color || !*color)
       
   389 -      scr_LogPrint(LPRINT_NORMAL, "Missing argument");
       
   390 -    else
       
   391 -      scr_muc_nick_color(nick, color);
       
   392 -    free_arg_lst(arglist);
       
   393 -  } else
       
   394 -    scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
       
   395 -  free_arg_lst(paramlst);
       
   396 +  } else { // color_scmd_mucnick
       
   397 +    const gchar *nick  = options.cmds[2].options.args[0].value.arg;
       
   398 +    const gchar *color = options.cmds[2].options.args[1].value.arg;
       
   399 +    scr_muc_nick_color(nick, color);
   215 +  }
   400 +  }
   216 +
   401 +
   217 +  cmdopts_free(&options);
   402 +  cmdopts_free(&options);
   218  }
   403  }
   219  
   404  
   220  void do_color(char *arg)
   405  //  cmd_setstatus(recipient, arg)
   221 @@ -1634,130 +1679,109 @@
   406 @@ -1634,130 +1711,109 @@
   222  
   407  
   223  static void do_say_to(char *arg)
   408  static void do_say_to(char *arg)
   224  {
   409  {
   225 -  char **paramlst;
   410 -  char **paramlst;
   226 -  char *fjid, *msg_utf8;
   411 -  char *fjid, *msg_utf8;
   406  }
   591  }
   407  
   592  
   408  //  buffer_updown(updown, nblines)
   593  //  buffer_updown(updown, nblines)
   409 diff -r 92fa48ef53c9 mcabber/mcabber/roster.c
   594 diff -r 92fa48ef53c9 mcabber/mcabber/roster.c
   410 --- a/mcabber/mcabber/roster.c	Sun Jan 27 00:40:37 2013 +0200
   595 --- a/mcabber/mcabber/roster.c	Sun Jan 27 00:40:37 2013 +0200
   411 +++ b/mcabber/mcabber/roster.c	Mon Feb 25 00:57:09 2013 +0200
   596 +++ b/mcabber/mcabber/roster.c	Mon Feb 25 15:15:43 2013 +0200
   412 @@ -1586,13 +1586,14 @@
   597 @@ -1586,13 +1586,14 @@
   413  // Look for a buddy whose name or jid contains string.
   598  // Look for a buddy whose name or jid contains string.
   414  // Search begins at current_buddy; if no match is found in the the buddylist,
   599  // Search begins at current_buddy; if no match is found in the the buddylist,
   415  // return NULL;
   600  // return NULL;
   416 +// Note: before this function considered its argument to be in local encoding,
   601 +// Note: before this function considered its argument to be in local encoding,
   447        if (found)
   632        if (found)
   448          return buddy;
   633          return buddy;
   449      }
   634      }
   450 diff -r 92fa48ef53c9 mcabber/mcabber/utils.c
   635 diff -r 92fa48ef53c9 mcabber/mcabber/utils.c
   451 --- a/mcabber/mcabber/utils.c	Sun Jan 27 00:40:37 2013 +0200
   636 --- a/mcabber/mcabber/utils.c	Sun Jan 27 00:40:37 2013 +0200
   452 +++ b/mcabber/mcabber/utils.c	Mon Feb 25 00:57:09 2013 +0200
   637 +++ b/mcabber/mcabber/utils.c	Mon Feb 25 15:15:43 2013 +0200
   453 @@ -555,6 +555,313 @@
   638 @@ -555,6 +555,317 @@
   454      *str = tolower(*str);
   639      *str = tolower(*str);
   455  }
   640  }
   456  
   641  
   457 +// in_space        -> in_space, in_optstart, in_argstart
   642 +// in_space        -> in_space, in_optstart, in_argstart
   458 +// in_optstart     -> in_shortoptend, in_longoptstart, in_argstart ('-')
   643 +// in_optstart     -> in_shortoptend, in_longoptstart, in_argstart ('-')
   459 +// in_shortoptend  -> in_space, error
   644 +// in_shortoptend  -> in_space, in_argstart, error
   460 +// in_longoptstart -> in_longopt, in_space, in_argstart ('---')
   645 +// in_longoptstart -> in_longopt, in_space, in_argstart ('---')
   461 +// in_longopt      -> in_longopt, in_space, error
   646 +// in_longopt      -> in_longopt, in_space, error
   462 +// in_argstart     -> in_arg, success
   647 +// in_argstart     -> in_arg, success
   463 +// in_arg          -> in_arg, in_space, error
   648 +// in_arg          -> in_arg, in_space, error
   464 +
   649 +
   549 +          p ++;
   734 +          p ++;
   550 +        } else { // option is unknown
   735 +        } else { // option is unknown
   551 +          error = "Unknown short option";
   736 +          error = "Unknown short option";
   552 +        }
   737 +        }
   553 +      } else { // short option not ended
   738 +      } else { // short option not ended
   554 +        error = "Extra characters at short option end";
   739 +        // consider it argument (to allow -autojoin)
       
   740 +        p --;
       
   741 +        opts_ended = TRUE;
       
   742 +        s = p - 1;
       
   743 +        state = in_argstart;
   555 +      }
   744 +      }
   556 +    } else if (state == in_longoptstart) { // long option initialization
   745 +    } else if (state == in_longoptstart) { // long option initialization
   557 +      if (*p == ' ' || *p == '\0') { // end of options '--'
   746 +      if (*p == ' ' || *p == '\0') { // end of options '--'
   558 +        opts_ended = TRUE;
   747 +        opts_ended = TRUE;
   559 +        state = in_space;
   748 +        state = in_space;
   764  //  strip_arg_special_chars(string)
   953  //  strip_arg_special_chars(string)
   765  // Remove quotes and backslashes before an escaped quote
   954  // Remove quotes and backslashes before an escaped quote
   766  // Only quotes need a backslash
   955  // Only quotes need a backslash
   767 diff -r 92fa48ef53c9 mcabber/mcabber/utils.h
   956 diff -r 92fa48ef53c9 mcabber/mcabber/utils.h
   768 --- a/mcabber/mcabber/utils.h	Sun Jan 27 00:40:37 2013 +0200
   957 --- a/mcabber/mcabber/utils.h	Sun Jan 27 00:40:37 2013 +0200
   769 +++ b/mcabber/mcabber/utils.h	Mon Feb 25 00:57:09 2013 +0200
   958 +++ b/mcabber/mcabber/utils.h	Mon Feb 25 15:15:43 2013 +0200
   770 @@ -43,6 +43,101 @@
   959 @@ -43,6 +43,101 @@
   771  char **split_arg(const char *arg, unsigned int n, int dontstriplast);
   960  char **split_arg(const char *arg, unsigned int n, int dontstriplast);
   772  void free_arg_lst(char **arglst);
   961  void free_arg_lst(char **arglst);
   773  
   962  
   774 +//  error cmdopts_parse (argstring, optionlist)
   963 +//  error cmdopts_parse (argstring, optionlist)