Change terminal-overrides to a server option (now that we have them), it
[tmux-openbsd.git] / options-table.c
blobea8482593514706c9f7d3b2ff0d6d83df9113576
1 /* $OpenBSD$ */
3 /*
4 * Copyright (c) 2011 Nicholas Marriott <nicm@users.sourceforge.net>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
21 #include <string.h>
22 #include <paths.h>
24 #include "tmux.h"
27 * This file has a tables with all the server, session and window
28 * options. These tables are the master copy of the options with their real
29 * (user-visible) types, range limits and default values. At start these are
30 * copied into the runtime global options trees (which only has number and
31 * string types). These tables are then used to loop up the real type when
32 * the user sets an option or its value needs to be shown.
35 /* Choice option type lists. */
36 const char *options_table_mode_keys_list[] = {
37 "emacs", "vi", NULL
39 const char *options_table_mode_mouse_list[] = {
40 "off", "on", "copy-mode", NULL
42 const char *options_table_clock_mode_style_list[] = {
43 "12", "24", NULL
45 const char *options_table_status_keys_list[] = {
46 "emacs", "vi", NULL
48 const char *options_table_status_justify_list[] = {
49 "left", "centre", "right", NULL
51 const char *options_table_status_position_list[] = {
52 "top", "bottom", NULL
54 const char *options_table_bell_action_list[] = {
55 "none", "any", "current", NULL
58 /* Server options. */
59 const struct options_table_entry server_options_table[] = {
60 { .name = "buffer-limit",
61 .type = OPTIONS_TABLE_NUMBER,
62 .minimum = 1,
63 .maximum = INT_MAX,
64 .default_num = 20
67 { .name = "escape-time",
68 .type = OPTIONS_TABLE_NUMBER,
69 .minimum = 0,
70 .maximum = INT_MAX,
71 .default_num = 500
74 { .name = "exit-unattached",
75 .type = OPTIONS_TABLE_FLAG,
76 .default_num = 0
79 { .name = "focus-events",
80 .type = OPTIONS_TABLE_FLAG,
81 .default_num = 0
84 { .name = "quiet",
85 .type = OPTIONS_TABLE_FLAG,
86 .default_num = 0 /* overridden in main() */
89 { .name = "set-clipboard",
90 .type = OPTIONS_TABLE_FLAG,
91 .default_num = 1
94 { .name = "terminal-overrides",
95 .type = OPTIONS_TABLE_STRING,
96 .default_str = "*256col*:colors=256"
97 ",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007"
98 ":Cs=\\E]12;%p1%s\\007:Cr=\\E]112\\007"
99 ":Ss=\\E[%p1%d q:Se=\\E[2 q,screen*:XT"
102 { .name = NULL }
105 /* Session options. */
106 const struct options_table_entry session_options_table[] = {
107 { .name = "assume-paste-time",
108 .type = OPTIONS_TABLE_NUMBER,
109 .minimum = 0,
110 .maximum = INT_MAX,
111 .default_num = 1,
114 { .name = "base-index",
115 .type = OPTIONS_TABLE_NUMBER,
116 .minimum = 0,
117 .maximum = INT_MAX,
118 .default_num = 0
121 { .name = "bell-action",
122 .type = OPTIONS_TABLE_CHOICE,
123 .choices = options_table_bell_action_list,
124 .default_num = BELL_ANY
127 { .name = "bell-on-alert",
128 .type = OPTIONS_TABLE_FLAG,
129 .default_num = 0
132 { .name = "default-command",
133 .type = OPTIONS_TABLE_STRING,
134 .default_str = ""
137 { .name = "default-shell",
138 .type = OPTIONS_TABLE_STRING,
139 .default_str = _PATH_BSHELL
142 { .name = "default-terminal",
143 .type = OPTIONS_TABLE_STRING,
144 .default_str = "screen"
147 { .name = "destroy-unattached",
148 .type = OPTIONS_TABLE_FLAG,
149 .default_num = 0
152 { .name = "detach-on-destroy",
153 .type = OPTIONS_TABLE_FLAG,
154 .default_num = 1
157 { .name = "display-panes-active-colour",
158 .type = OPTIONS_TABLE_COLOUR,
159 .default_num = 1
162 { .name = "display-panes-colour",
163 .type = OPTIONS_TABLE_COLOUR,
164 .default_num = 4
167 { .name = "display-panes-time",
168 .type = OPTIONS_TABLE_NUMBER,
169 .minimum = 1,
170 .maximum = INT_MAX,
171 .default_num = 1000
174 { .name = "display-time",
175 .type = OPTIONS_TABLE_NUMBER,
176 .minimum = 1,
177 .maximum = INT_MAX,
178 .default_num = 750
181 { .name = "history-limit",
182 .type = OPTIONS_TABLE_NUMBER,
183 .minimum = 0,
184 .maximum = INT_MAX,
185 .default_num = 2000
188 { .name = "lock-after-time",
189 .type = OPTIONS_TABLE_NUMBER,
190 .minimum = 0,
191 .maximum = INT_MAX,
192 .default_num = 0
195 { .name = "lock-command",
196 .type = OPTIONS_TABLE_STRING,
197 .default_str = "lock -np"
200 { .name = "lock-server",
201 .type = OPTIONS_TABLE_FLAG,
202 .default_num = 1
205 { .name = "message-attr",
206 .type = OPTIONS_TABLE_ATTRIBUTES,
207 .default_num = 0,
208 .style = "message-style"
211 { .name = "message-bg",
212 .type = OPTIONS_TABLE_COLOUR,
213 .default_num = 3,
214 .style = "message-style"
217 { .name = "message-command-attr",
218 .type = OPTIONS_TABLE_ATTRIBUTES,
219 .default_num = 0,
220 .style = "message-command-style"
223 { .name = "message-command-bg",
224 .type = OPTIONS_TABLE_COLOUR,
225 .default_num = 0,
226 .style = "message-command-style"
229 { .name = "message-command-fg",
230 .type = OPTIONS_TABLE_COLOUR,
231 .default_num = 3,
232 .style = "message-command-style"
235 { .name = "message-command-style",
236 .type = OPTIONS_TABLE_STYLE,
237 .default_str = "bg=black,fg=yellow"
240 { .name = "message-fg",
241 .type = OPTIONS_TABLE_COLOUR,
242 .default_num = 0,
243 .style = "message-style"
246 { .name = "message-limit",
247 .type = OPTIONS_TABLE_NUMBER,
248 .minimum = 0,
249 .maximum = INT_MAX,
250 .default_num = 20
253 { .name = "message-style",
254 .type = OPTIONS_TABLE_STYLE,
255 .default_str = "bg=yellow,fg=black"
258 { .name = "mouse-resize-pane",
259 .type = OPTIONS_TABLE_FLAG,
260 .default_num = 0
263 { .name = "mouse-select-pane",
264 .type = OPTIONS_TABLE_FLAG,
265 .default_num = 0
268 { .name = "mouse-select-window",
269 .type = OPTIONS_TABLE_FLAG,
270 .default_num = 0
273 { .name = "mouse-utf8",
274 .type = OPTIONS_TABLE_FLAG,
275 .default_num = 0
278 { .name = "pane-active-border-bg",
279 .type = OPTIONS_TABLE_COLOUR,
280 .default_num = 8,
281 .style = "pane-active-border-style"
284 { .name = "pane-active-border-fg",
285 .type = OPTIONS_TABLE_COLOUR,
286 .default_num = 2,
287 .style = "pane-active-border-style"
290 { .name = "pane-active-border-style",
291 .type = OPTIONS_TABLE_STYLE,
292 .default_str = "fg=green"
295 { .name = "pane-border-bg",
296 .type = OPTIONS_TABLE_COLOUR,
297 .default_num = 8,
298 .style = "pane-border-style"
301 { .name = "pane-border-fg",
302 .type = OPTIONS_TABLE_COLOUR,
303 .default_num = 8,
304 .style = "pane-border-style"
307 { .name = "pane-border-style",
308 .type = OPTIONS_TABLE_STYLE,
309 .default_str = "default"
312 { .name = "prefix",
313 .type = OPTIONS_TABLE_KEY,
314 .default_num = '\002',
317 { .name = "prefix2",
318 .type = OPTIONS_TABLE_KEY,
319 .default_num = KEYC_NONE,
322 { .name = "renumber-windows",
323 .type = OPTIONS_TABLE_FLAG,
324 .default_num = 0
327 { .name = "repeat-time",
328 .type = OPTIONS_TABLE_NUMBER,
329 .minimum = 0,
330 .maximum = SHRT_MAX,
331 .default_num = 500
334 { .name = "set-remain-on-exit",
335 .type = OPTIONS_TABLE_FLAG,
336 .default_num = 0
339 { .name = "set-titles",
340 .type = OPTIONS_TABLE_FLAG,
341 .default_num = 0
344 { .name = "set-titles-string",
345 .type = OPTIONS_TABLE_STRING,
346 .default_str = "#S:#I:#W - \"#T\""
349 { .name = "status",
350 .type = OPTIONS_TABLE_FLAG,
351 .default_num = 1
354 { .name = "status-attr",
355 .type = OPTIONS_TABLE_ATTRIBUTES,
356 .default_num = 0,
357 .style = "status-style"
360 { .name = "status-bg",
361 .type = OPTIONS_TABLE_COLOUR,
362 .default_num = 2,
363 .style = "status-style"
366 { .name = "status-fg",
367 .type = OPTIONS_TABLE_COLOUR,
368 .default_num = 0,
369 .style = "status-style"
372 { .name = "status-interval",
373 .type = OPTIONS_TABLE_NUMBER,
374 .minimum = 0,
375 .maximum = INT_MAX,
376 .default_num = 15
379 { .name = "status-justify",
380 .type = OPTIONS_TABLE_CHOICE,
381 .choices = options_table_status_justify_list,
382 .default_num = 0
385 { .name = "status-keys",
386 .type = OPTIONS_TABLE_CHOICE,
387 .choices = options_table_status_keys_list,
388 .default_num = MODEKEY_EMACS
391 { .name = "status-left",
392 .type = OPTIONS_TABLE_STRING,
393 .default_str = "[#S]"
396 { .name = "status-left-attr",
397 .type = OPTIONS_TABLE_ATTRIBUTES,
398 .default_num = 0,
399 .style = "status-left-style"
402 { .name = "status-left-bg",
403 .type = OPTIONS_TABLE_COLOUR,
404 .default_num = 8,
405 .style = "status-left-style"
408 { .name = "status-left-fg",
409 .type = OPTIONS_TABLE_COLOUR,
410 .default_num = 8,
411 .style = "status-left-style"
414 { .name = "status-left-length",
415 .type = OPTIONS_TABLE_NUMBER,
416 .minimum = 0,
417 .maximum = SHRT_MAX,
418 .default_num = 10
421 { .name = "status-left-style",
422 .type = OPTIONS_TABLE_STYLE,
423 .default_str = "default"
426 { .name = "status-position",
427 .type = OPTIONS_TABLE_CHOICE,
428 .choices = options_table_status_position_list,
429 .default_num = 1
432 { .name = "status-right",
433 .type = OPTIONS_TABLE_STRING,
434 .default_str = "\"#{=22:pane_title}\" %H:%M %d-%b-%y"
437 { .name = "status-right-attr",
438 .type = OPTIONS_TABLE_ATTRIBUTES,
439 .default_num = 0,
440 .style = "status-right-style"
443 { .name = "status-right-bg",
444 .type = OPTIONS_TABLE_COLOUR,
445 .default_num = 8,
446 .style = "status-right-style"
449 { .name = "status-right-fg",
450 .type = OPTIONS_TABLE_COLOUR,
451 .default_num = 8,
452 .style = "status-right-style"
455 { .name = "status-right-length",
456 .type = OPTIONS_TABLE_NUMBER,
457 .minimum = 0,
458 .maximum = SHRT_MAX,
459 .default_num = 40
462 { .name = "status-right-style",
463 .type = OPTIONS_TABLE_STYLE,
464 .default_str = "default"
467 { .name = "status-style",
468 .type = OPTIONS_TABLE_STYLE,
469 .default_str = "bg=green,fg=black"
472 { .name = "status-utf8",
473 .type = OPTIONS_TABLE_FLAG,
474 .default_num = 0 /* overridden in main() */
477 { .name = "update-environment",
478 .type = OPTIONS_TABLE_STRING,
479 .default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
480 "SSH_CONNECTION WINDOWID XAUTHORITY"
484 { .name = "visual-activity",
485 .type = OPTIONS_TABLE_FLAG,
486 .default_num = 0
489 { .name = "visual-bell",
490 .type = OPTIONS_TABLE_FLAG,
491 .default_num = 0
494 { .name = "visual-content",
495 .type = OPTIONS_TABLE_FLAG,
496 .default_num = 0
499 { .name = "visual-silence",
500 .type = OPTIONS_TABLE_FLAG,
501 .default_num = 0
504 { .name = "word-separators",
505 .type = OPTIONS_TABLE_STRING,
506 .default_str = " -_@"
509 { .name = NULL }
512 /* Window options. */
513 const struct options_table_entry window_options_table[] = {
514 { .name = "aggressive-resize",
515 .type = OPTIONS_TABLE_FLAG,
516 .default_num = 0
519 { .name = "allow-rename",
520 .type = OPTIONS_TABLE_FLAG,
521 .default_num = 1
524 { .name = "alternate-screen",
525 .type = OPTIONS_TABLE_FLAG,
526 .default_num = 1
529 { .name = "automatic-rename",
530 .type = OPTIONS_TABLE_FLAG,
531 .default_num = 1
534 { .name = "automatic-rename-format",
535 .type = OPTIONS_TABLE_STRING,
536 .default_str = "#{?pane_in_mode,[tmux],#{pane_current_command}}#{?pane_dead,[dead],}"
539 { .name = "c0-change-trigger",
540 .type = OPTIONS_TABLE_NUMBER,
541 .default_num = 250,
542 .minimum = 0,
543 .maximum = USHRT_MAX
546 { .name = "c0-change-interval",
547 .type = OPTIONS_TABLE_NUMBER,
548 .default_num = 100,
549 .minimum = 1,
550 .maximum = USHRT_MAX
553 { .name = "clock-mode-colour",
554 .type = OPTIONS_TABLE_COLOUR,
555 .default_num = 4
558 { .name = "clock-mode-style",
559 .type = OPTIONS_TABLE_CHOICE,
560 .choices = options_table_clock_mode_style_list,
561 .default_num = 1
564 { .name = "force-height",
565 .type = OPTIONS_TABLE_NUMBER,
566 .minimum = 0,
567 .maximum = INT_MAX,
568 .default_num = 0
571 { .name = "force-width",
572 .type = OPTIONS_TABLE_NUMBER,
573 .minimum = 0,
574 .maximum = INT_MAX,
575 .default_num = 0
578 { .name = "main-pane-height",
579 .type = OPTIONS_TABLE_NUMBER,
580 .minimum = 1,
581 .maximum = INT_MAX,
582 .default_num = 24
585 { .name = "main-pane-width",
586 .type = OPTIONS_TABLE_NUMBER,
587 .minimum = 1,
588 .maximum = INT_MAX,
589 .default_num = 80
592 { .name = "mode-attr",
593 .type = OPTIONS_TABLE_ATTRIBUTES,
594 .default_num = 0,
595 .style = "mode-style"
598 { .name = "mode-bg",
599 .type = OPTIONS_TABLE_COLOUR,
600 .default_num = 3,
601 .style = "mode-style"
604 { .name = "mode-fg",
605 .type = OPTIONS_TABLE_COLOUR,
606 .default_num = 0,
607 .style = "mode-style"
610 { .name = "mode-keys",
611 .type = OPTIONS_TABLE_CHOICE,
612 .choices = options_table_mode_keys_list,
613 .default_num = MODEKEY_EMACS
616 { .name = "mode-mouse",
617 .type = OPTIONS_TABLE_CHOICE,
618 .choices = options_table_mode_mouse_list,
619 .default_num = 0
622 { .name = "mode-style",
623 .type = OPTIONS_TABLE_STYLE,
624 .default_str = "bg=yellow,fg=black"
627 { .name = "monitor-activity",
628 .type = OPTIONS_TABLE_FLAG,
629 .default_num = 0
632 { .name = "monitor-content",
633 .type = OPTIONS_TABLE_STRING,
634 .default_str = ""
637 { .name = "monitor-silence",
638 .type = OPTIONS_TABLE_NUMBER,
639 .minimum = 0,
640 .maximum = INT_MAX,
641 .default_num = 0
644 { .name = "other-pane-height",
645 .type = OPTIONS_TABLE_NUMBER,
646 .minimum = 0,
647 .maximum = INT_MAX,
648 .default_num = 0
651 { .name = "other-pane-width",
652 .type = OPTIONS_TABLE_NUMBER,
653 .minimum = 0,
654 .maximum = INT_MAX,
655 .default_num = 0
658 { .name = "pane-base-index",
659 .type = OPTIONS_TABLE_NUMBER,
660 .minimum = 0,
661 .maximum = USHRT_MAX,
662 .default_num = 0
665 { .name = "remain-on-exit",
666 .type = OPTIONS_TABLE_FLAG,
667 .default_num = 0
670 { .name = "synchronize-panes",
671 .type = OPTIONS_TABLE_FLAG,
672 .default_num = 0
675 { .name = "utf8",
676 .type = OPTIONS_TABLE_FLAG,
677 .default_num = 0 /* overridden in main() */
680 { .name = "window-status-activity-attr",
681 .type = OPTIONS_TABLE_ATTRIBUTES,
682 .default_num = GRID_ATTR_REVERSE,
683 .style = "window-status-activity-style"
686 { .name = "window-status-activity-bg",
687 .type = OPTIONS_TABLE_COLOUR,
688 .default_num = 8,
689 .style = "window-status-activity-style"
692 { .name = "window-status-activity-fg",
693 .type = OPTIONS_TABLE_COLOUR,
694 .default_num = 8,
695 .style = "window-status-activity-style"
698 { .name = "window-status-activity-style",
699 .type = OPTIONS_TABLE_STYLE,
700 .default_str = "reverse"
703 { .name = "window-status-attr",
704 .type = OPTIONS_TABLE_ATTRIBUTES,
705 .default_num = 0,
706 .style = "window-status-style"
709 { .name = "window-status-bell-attr",
710 .type = OPTIONS_TABLE_ATTRIBUTES,
711 .default_num = GRID_ATTR_REVERSE,
712 .style = "window-status-bell-style"
715 { .name = "window-status-bell-bg",
716 .type = OPTIONS_TABLE_COLOUR,
717 .default_num = 8,
718 .style = "window-status-bell-style"
721 { .name = "window-status-bell-fg",
722 .type = OPTIONS_TABLE_COLOUR,
723 .default_num = 8,
724 .style = "window-status-bell-style"
727 { .name = "window-status-bell-style",
728 .type = OPTIONS_TABLE_STYLE,
729 .default_str = "reverse"
732 { .name = "window-status-bg",
733 .type = OPTIONS_TABLE_COLOUR,
734 .default_num = 8,
735 .style = "window-status-style"
738 { .name = "window-status-content-attr",
739 .type = OPTIONS_TABLE_ATTRIBUTES,
740 .default_num = GRID_ATTR_REVERSE,
741 .style = "window-status-content-style"
744 { .name = "window-status-content-bg",
745 .type = OPTIONS_TABLE_COLOUR,
746 .default_num = 8,
747 .style = "window-status-content-style"
750 { .name = "window-status-content-fg",
751 .type = OPTIONS_TABLE_COLOUR,
752 .default_num = 8,
753 .style = "window-status-content-style"
756 { .name = "window-status-content-style",
757 .type = OPTIONS_TABLE_STYLE,
758 .default_str = "reverse"
761 { .name = "window-status-current-attr",
762 .type = OPTIONS_TABLE_ATTRIBUTES,
763 .default_num = 0,
764 .style = "window-status-current-style"
767 { .name = "window-status-current-bg",
768 .type = OPTIONS_TABLE_COLOUR,
769 .default_num = 8,
770 .style = "window-status-current-style"
773 { .name = "window-status-current-fg",
774 .type = OPTIONS_TABLE_COLOUR,
775 .default_num = 8,
776 .style = "window-status-current-style"
779 { .name = "window-status-current-format",
780 .type = OPTIONS_TABLE_STRING,
781 .default_str = "#I:#W#F"
784 { .name = "window-status-current-style",
785 .type = OPTIONS_TABLE_STYLE,
786 .default_str = "default"
789 { .name = "window-status-fg",
790 .type = OPTIONS_TABLE_COLOUR,
791 .default_num = 8,
792 .style = "window-status-style"
795 { .name = "window-status-format",
796 .type = OPTIONS_TABLE_STRING,
797 .default_str = "#I:#W#F"
800 { .name = "window-status-last-attr",
801 .type = OPTIONS_TABLE_ATTRIBUTES,
802 .default_num = 0,
803 .style = "window-status-last-style"
806 { .name = "window-status-last-bg",
807 .type = OPTIONS_TABLE_COLOUR,
808 .default_num = 8,
809 .style = "window-status-last-style"
812 { .name = "window-status-last-fg",
813 .type = OPTIONS_TABLE_COLOUR,
814 .default_num = 8,
815 .style = "window-status-last-style"
818 { .name = "window-status-last-style",
819 .type = OPTIONS_TABLE_STYLE,
820 .default_str = "default"
823 { .name = "window-status-separator",
824 .type = OPTIONS_TABLE_STRING,
825 .default_str = " "
828 { .name = "window-status-style",
829 .type = OPTIONS_TABLE_STYLE,
830 .default_str = "default"
833 { .name = "wrap-search",
834 .type = OPTIONS_TABLE_FLAG,
835 .default_num = 1
838 { .name = "xterm-keys",
839 .type = OPTIONS_TABLE_FLAG,
840 .default_num = 0
843 { .name = NULL }
846 /* Populate an options tree from a table. */
847 void
848 options_table_populate_tree(
849 const struct options_table_entry *table, struct options *oo)
851 const struct options_table_entry *oe;
853 for (oe = table; oe->name != NULL; oe++) {
854 switch (oe->type) {
855 case OPTIONS_TABLE_STRING:
856 options_set_string(oo, oe->name, "%s", oe->default_str);
857 break;
858 case OPTIONS_TABLE_STYLE:
859 options_set_style(oo, oe->name, oe->default_str, 0);
860 break;
861 default:
862 options_set_number(oo, oe->name, oe->default_num);
863 break;
868 /* Print an option using its type from the table. */
869 const char *
870 options_table_print_entry(const struct options_table_entry *oe,
871 struct options_entry *o, int no_quotes)
873 static char out[BUFSIZ];
874 const char *s;
876 *out = '\0';
877 switch (oe->type) {
878 case OPTIONS_TABLE_STRING:
879 if (no_quotes)
880 xsnprintf(out, sizeof out, "%s", o->str);
881 else
882 xsnprintf(out, sizeof out, "\"%s\"", o->str);
883 break;
884 case OPTIONS_TABLE_NUMBER:
885 xsnprintf(out, sizeof out, "%lld", o->num);
886 break;
887 case OPTIONS_TABLE_KEY:
888 xsnprintf(out, sizeof out, "%s",
889 key_string_lookup_key(o->num));
890 break;
891 case OPTIONS_TABLE_COLOUR:
892 s = colour_tostring(o->num);
893 xsnprintf(out, sizeof out, "%s", s);
894 break;
895 case OPTIONS_TABLE_ATTRIBUTES:
896 s = attributes_tostring(o->num);
897 xsnprintf(out, sizeof out, "%s", s);
898 break;
899 case OPTIONS_TABLE_FLAG:
900 if (o->num)
901 strlcpy(out, "on", sizeof out);
902 else
903 strlcpy(out, "off", sizeof out);
904 break;
905 case OPTIONS_TABLE_CHOICE:
906 s = oe->choices[o->num];
907 xsnprintf(out, sizeof out, "%s", s);
908 break;
909 case OPTIONS_TABLE_STYLE:
910 s = style_tostring(&o->style);
911 xsnprintf(out, sizeof out, "%s", s);
912 break;
914 return (out);
917 /* Find an option. */
919 options_table_find(
920 const char *optstr, const struct options_table_entry **table,
921 const struct options_table_entry **oe)
923 static const struct options_table_entry *tables[] = {
924 server_options_table,
925 window_options_table,
926 session_options_table
928 const struct options_table_entry *oe_loop;
929 u_int i;
931 for (i = 0; i < nitems(tables); i++) {
932 for (oe_loop = tables[i]; oe_loop->name != NULL; oe_loop++) {
933 if (strncmp(oe_loop->name, optstr, strlen(optstr)) != 0)
934 continue;
936 /* If already found, ambiguous. */
937 if (*oe != NULL)
938 return (-1);
939 *oe = oe_loop;
940 *table = tables[i];
942 /* Bail now if an exact match. */
943 if (strcmp((*oe)->name, optstr) == 0)
944 break;
947 return (0);