Update of /cvsroot/tmux/tmux
In directory vz-cvs-2.sog:/tmp/cvs-serv20216

Modified Files:
        cmd-set-option.c 
Log Message:
|PatchSet 879
|Date: 2011/03/29 22:09:13
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|For convenience, work out what type of option is being set by name
|regardless of the -s or -w flags (these remain documented however).



Index: cmd-set-option.c
===================================================================
RCS file: /cvsroot/tmux/tmux/cmd-set-option.c,v
retrieving revision 1.110
retrieving revision 1.111
diff -u -d -r1.110 -r1.111
--- cmd-set-option.c    6 Apr 2011 22:22:25 -0000       1.110
+++ cmd-set-option.c    6 Apr 2011 22:22:49 -0000       1.111
@@ -29,6 +29,9 @@
 
 int    cmd_set_option_exec(struct cmd *, struct cmd_ctx *);
 
+int    cmd_set_option_find(const char *, const struct options_table_entry **,
+           const struct options_table_entry **);
+
 int    cmd_set_option_unset(struct cmd *, struct cmd_ctx *,
            const struct options_table_entry *, struct options *,
            const char *);
@@ -78,11 +81,44 @@
        cmd_set_option_exec
 };
 
+/* Look for an option in all three tables. */
+int
+cmd_set_option_find(
+    const char *optstr, const struct options_table_entry **table,
+    const struct options_table_entry **oe)
+{
+       static const struct options_table_entry *tables[] = {
+               server_options_table,
+               window_options_table,
+               session_options_table
+       };
+       const struct options_table_entry        *oe_loop;
+       u_int                                    i;
+
+       for (i = 0; i < nitems(tables); i++) {
+               for (oe_loop = tables[i]; oe_loop->name != NULL; oe_loop++) {
+                       if (strncmp(oe_loop->name, optstr, strlen(optstr)) != 0)
+                               continue;
+
+                       /* If already found, ambiguous. */
+                       if (*oe != NULL)
+                               return (-1);
+                       *oe = oe_loop;
+                       *table = tables[i];
+
+                       /* Bail now if an exact match. */
+                       if (strcmp((*oe)->name, optstr) == 0)
+                               break;
+               }
+       }
+       return (0);
+}
+
 int
 cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
 {
        struct args                             *args = self->args;
-       const struct options_table_entry        *table, *oe, *oe_loop;
+       const struct options_table_entry        *table, *oe;
        struct session                          *s;
        struct winlink                          *wl;
        struct client                           *c;
@@ -90,13 +126,32 @@
        const char                              *optstr, *valstr;
        u_int                                    i;
 
-       /* Work out the options tree and table to use. */
-       if (args_has(self->args, 's')) {
+       /* Get the option name and value. */
+       optstr = args->argv[0];
+       if (*optstr == '\0') {
+               ctx->error(ctx, "invalid option");
+               return (-1);
+       }
+       if (args->argc < 2)
+               valstr = NULL;
+       else
+               valstr = args->argv[1];
+
+       /* Find the option entry, try each table. */
+       table = oe = NULL;
+       if (cmd_set_option_find(optstr, &table, &oe) != 0) {
+               ctx->error(ctx, "ambiguous option: %s", optstr);
+               return (-1);
+       }
+       if (oe == NULL) {
+               ctx->error(ctx, "unknown option: %s", optstr);
+               return (-1);
+       }
+
+       /* Work out the tree from the table. */
+       if (table == server_options_table)
                oo = &global_options;
-               table = server_options_table;
-       } else if (args_has(self->args, 'w') ||
-           self->entry == &cmd_set_window_option_entry) {
-               table = window_options_table;
+       else if (table == window_options_table) {
                if (args_has(self->args, 'g'))
                        oo = &global_w_options;
                else {
@@ -105,8 +160,7 @@
                                return (-1);
                        oo = &wl->window->options;
                }
-       } else {
-               table = session_options_table;
+       } else if (table == session_options_table) {
                if (args_has(self->args, 'g'))
                        oo = &global_s_options;
                else {
@@ -115,37 +169,8 @@
                                return (-1);
                        oo = &s->options;
                }
-       }
-
-       /* Get the option name and value. */
-       optstr = args->argv[0];
-       if (*optstr == '\0') {
-               ctx->error(ctx, "invalid option");
-               return (-1);
-       }
-       if (args->argc < 2)
-               valstr = NULL;
-       else
-               valstr = args->argv[1];
-
-       /* Find the option table entry. */
-       oe = NULL;
-       for (oe_loop = table; oe_loop->name != NULL; oe_loop++) {
-               if (strncmp(oe_loop->name, optstr, strlen(optstr)) != 0)
-                       continue;
-
-               if (oe != NULL) {
-                       ctx->error(ctx, "ambiguous option: %s", optstr);
-                       return (-1);
-               }
-               oe = oe_loop;
-
-               /* Bail now if an exact match. */
-               if (strcmp(oe->name, optstr) == 0)
-                       break;
-       }
-       if (oe == NULL) {
-               ctx->error(ctx, "unknown option: %s", optstr);
+       } else {
+               ctx->error(ctx, "unknown table");
                return (-1);
        }
 


------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to