xref: /freebsd/contrib/nvi/common/options.h (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
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  *	@(#)options.h	10.19 (Berkeley) 10/10/96
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	*name;			/* Name. */
80 					/* Change function. */
81 	int	(*func) __P((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 	u_int8_t flags;
93 };
94 
95 /* Option argument to opts_dump(). */
96 enum optdisp { NO_DISPLAY, ALL_DISPLAY, CHANGED_DISPLAY, SELECT_DISPLAY };
97 
98 /* Options array. */
99 extern OPTLIST const optlist[];
100 
101 #include "options_def.h"
102