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