1 /*        $NetBSD: options.h,v 1.2 2013/11/22 15:52:05 christos Exp $ */
2 /*-
3  * Copyright (c) 1991, 1993, 1994
4  *        The Regents of the University of California.  All rights reserved.
5  * Copyright (c) 1991, 1993, 1994, 1995, 1996
6  *        Keith Bostic.  All rights reserved.
7  *
8  * See the LICENSE file for redistribution information.
9  *
10  *        Id: options.h,v 10.20 2001/06/09 18:26:28 skimo Exp  (Berkeley) Date: 2001/06/09 18:26:28
11  */
12 
13 /*
14  * Edit option information.  Historically, if you set a boolean or numeric
15  * edit option value to its "default" value, it didn't show up in the :set
16  * display, i.e. it wasn't considered "changed".  String edit options would
17  * show up as changed, regardless.  We maintain a parallel set of values
18  * which are the default values and never consider an edit option changed
19  * if it was reset to the default value.
20  *
21  * Macros to retrieve boolean, integral and string option values, and to
22  * set, clear and test boolean option values.  Some options (secure, lines,
23  * columns, terminal type) are global in scope, and are therefore stored
24  * in the global area.  The offset in the global options array is stored
25  * in the screen's value field.  This is set up when the options are first
26  * initialized.
27  */
28 #define   O_V(sp, o, fld)                                                                 \
29           (F_ISSET(&(sp)->opts[(o)], OPT_GLOBAL) ?                              \
30               (sp)->gp->opts[(sp)->opts[(o)].o_cur.val].fld :                   \
31               (sp)->opts[(o)].fld)
32 
33 /* Global option macros. */
34 #define   OG_CLR(gp, o)                 ((gp)->opts[(o)].o_cur.val) = 0
35 #define   OG_SET(gp, o)                 ((gp)->opts[(o)].o_cur.val) = 1
36 #define   OG_STR(gp, o)                 ((gp)->opts[(o)].o_cur.str)
37 #define   OG_VAL(gp, o)                 ((gp)->opts[(o)].o_cur.val)
38 #define   OG_ISSET(gp, o)               OG_VAL(gp, o)
39 
40 #define   OG_D_STR(gp, o)               ((gp)->opts[(o)].o_def.str)
41 #define   OG_D_VAL(gp, o)               ((gp)->opts[(o)].o_def.val)
42 
43 /*
44  * Flags to o_set(); need explicit OS_STR as can be setting the value to
45  * NULL.
46  */
47 #define   OS_DEF              0x01                /* Set the default value. */
48 #define   OS_NOFREE 0x02                /* Don't free the old string. */
49 #define   OS_STR              0x04                /* Set to string argument. */
50 #define   OS_STRDUP 0x08                /* Copy then set to string argument. */
51 
52 struct _option {
53           union {
54                     u_long     val;               /* Value or boolean. */
55                     const char *str;    /* String. */
56           } o_cur;
57 #define   O_CLR(sp, o)                  o_set(sp, o, 0, NULL, 0)
58 #define   O_SET(sp, o)                  o_set(sp, o, 0, NULL, 1)
59 #define   O_STR(sp, o)                  O_V(sp, o, o_cur.str)
60 #define   O_VAL(sp, o)                  O_V(sp, o, o_cur.val)
61 #define   O_ISSET(sp, o)                O_VAL(sp, o)
62 
63           union {
64                     u_long     val;               /* Value or boolean. */
65                     const char *str;    /* String. */
66           } o_def;
67 #define   O_D_CLR(sp, o)                o_set(sp, o, OS_DEF, NULL, 0)
68 #define   O_D_SET(sp, o)                o_set(sp, o, OS_DEF, NULL, 1)
69 #define   O_D_STR(sp, o)                O_V(sp, o, o_def.str)
70 #define   O_D_VAL(sp, o)                O_V(sp, o, o_def.val)
71 #define   O_D_ISSET(sp, o)    O_D_VAL(sp, o)
72 
73 #define   OPT_GLOBAL          0x01                /* Option is global. */
74 #define   OPT_SELECTED        0x02                /* Selected for display. */
75           u_int8_t flags;
76 };
77 
78 /* List of option names, associated update functions and information. */
79 struct _optlist {
80           const CHAR_T *name;           /* Name. */
81                                                   /* Change function. */
82           int       (*func) __P((SCR *, OPTION *, const char *, u_long *));
83                                                   /* Type of object. */
84           enum { OPT_0BOOL, OPT_1BOOL, OPT_NUM, OPT_STR } type;
85 
86 #define   OPT_ADISP 0x001               /* Always display the option. */
87 #define   OPT_ALWAYS          0x002               /* Always call the support function. */
88 #define   OPT_NDISP 0x004               /* Never display the option. */
89 #define   OPT_NOSAVE          0x008               /* Mkexrc command doesn't save. */
90 #define   OPT_NOSET 0x010               /* Option may not be set. */
91 #define   OPT_NOUNSET         0x020               /* Option may not be unset. */
92 #define   OPT_NOZERO          0x040               /* Option may not be set to 0. */
93 #define   OPT_PAIRS 0x080               /* String with even length */
94           u_int8_t flags;
95 };
96 
97 /* Option argument to opts_dump(). */
98 enum optdisp { NO_DISPLAY, ALL_DISPLAY, CHANGED_DISPLAY, SELECT_DISPLAY };
99 
100 /* Options array. */
101 extern OPTLIST const optlist[];
102 
103 #include "options_def.h"
104