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