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
51struct _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. */
78struct _optlist {
79	CHAR_T	*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#define	OPT_PAIRS	0x080		/* String with even length. */
93	u_int8_t flags;
94};
95
96/* Option argument to opts_dump(). */
97enum optdisp { NO_DISPLAY, ALL_DISPLAY, CHANGED_DISPLAY, SELECT_DISPLAY };
98
99/* Options array. */
100extern OPTLIST const optlist[];
101
102#include "options_def.h"
103