119304Speter/*-
219304Speter * Copyright (c) 1991, 1993, 1994
319304Speter *	The Regents of the University of California.  All rights reserved.
419304Speter * Copyright (c) 1991, 1993, 1994, 1995, 1996
519304Speter *	Keith Bostic.  All rights reserved.
619304Speter *
719304Speter * See the LICENSE file for redistribution information.
819304Speter *
919304Speter *	@(#)options.h	10.19 (Berkeley) 10/10/96
1019304Speter */
1119304Speter
1219304Speter/*
1319304Speter * Edit option information.  Historically, if you set a boolean or numeric
1419304Speter * edit option value to its "default" value, it didn't show up in the :set
1519304Speter * display, i.e. it wasn't considered "changed".  String edit options would
1619304Speter * show up as changed, regardless.  We maintain a parallel set of values
1719304Speter * which are the default values and never consider an edit option changed
1819304Speter * if it was reset to the default value.
1919304Speter *
2019304Speter * Macros to retrieve boolean, integral and string option values, and to
2119304Speter * set, clear and test boolean option values.  Some options (secure, lines,
2219304Speter * columns, terminal type) are global in scope, and are therefore stored
2319304Speter * in the global area.  The offset in the global options array is stored
2419304Speter * in the screen's value field.  This is set up when the options are first
2519304Speter * initialized.
2619304Speter */
2719304Speter#define	O_V(sp, o, fld)							\
2819304Speter	(F_ISSET(&(sp)->opts[(o)], OPT_GLOBAL) ?			\
2919304Speter	    (sp)->gp->opts[(sp)->opts[(o)].o_cur.val].fld :		\
3019304Speter	    (sp)->opts[(o)].fld)
3119304Speter
3219304Speter/* Global option macros. */
3319304Speter#define	OG_CLR(gp, o)		((gp)->opts[(o)].o_cur.val) = 0
3419304Speter#define	OG_SET(gp, o)		((gp)->opts[(o)].o_cur.val) = 1
3519304Speter#define	OG_STR(gp, o)		((gp)->opts[(o)].o_cur.str)
3619304Speter#define	OG_VAL(gp, o)		((gp)->opts[(o)].o_cur.val)
3719304Speter#define	OG_ISSET(gp, o)		OG_VAL(gp, o)
3819304Speter
3919304Speter#define	OG_D_STR(gp, o)		((gp)->opts[(o)].o_def.str)
4019304Speter#define	OG_D_VAL(gp, o)		((gp)->opts[(o)].o_def.val)
4119304Speter
4219304Speter/*
4319304Speter * Flags to o_set(); need explicit OS_STR as can be setting the value to
4419304Speter * NULL.
4519304Speter */
4619304Speter#define	OS_DEF		0x01		/* Set the default value. */
4719304Speter#define	OS_NOFREE	0x02		/* Don't free the old string. */
4819304Speter#define	OS_STR		0x04		/* Set to string argument. */
4919304Speter#define	OS_STRDUP	0x08		/* Copy then set to string argument. */
5019304Speter
5119304Speterstruct _option {
5219304Speter	union {
5319304Speter		u_long	 val;		/* Value or boolean. */
5419304Speter		char	*str;		/* String. */
5519304Speter	} o_cur;
5619304Speter#define	O_CLR(sp, o)		o_set(sp, o, 0, NULL, 0)
5719304Speter#define	O_SET(sp, o)		o_set(sp, o, 0, NULL, 1)
5819304Speter#define	O_STR(sp, o)		O_V(sp, o, o_cur.str)
5919304Speter#define	O_VAL(sp, o)		O_V(sp, o, o_cur.val)
6019304Speter#define	O_ISSET(sp, o)		O_VAL(sp, o)
6119304Speter
6219304Speter	union {
6319304Speter		u_long	 val;		/* Value or boolean. */
6419304Speter		char	*str;		/* String. */
6519304Speter	} o_def;
6619304Speter#define	O_D_CLR(sp, o)		o_set(sp, o, OS_DEF, NULL, 0)
6719304Speter#define	O_D_SET(sp, o)		o_set(sp, o, OS_DEF, NULL, 1)
6819304Speter#define	O_D_STR(sp, o)		O_V(sp, o, o_def.str)
6919304Speter#define	O_D_VAL(sp, o)		O_V(sp, o, o_def.val)
7019304Speter#define	O_D_ISSET(sp, o)	O_D_VAL(sp, o)
7119304Speter
7219304Speter#define	OPT_GLOBAL	0x01		/* Option is global. */
7319304Speter#define	OPT_SELECTED	0x02		/* Selected for display. */
7419304Speter	u_int8_t flags;
7519304Speter};
7619304Speter
7719304Speter/* List of option names, associated update functions and information. */
7819304Speterstruct _optlist {
7919304Speter	char	*name;			/* Name. */
8019304Speter					/* Change function. */
8119304Speter	int	(*func) __P((SCR *, OPTION *, char *, u_long *));
8219304Speter					/* Type of object. */
8319304Speter	enum { OPT_0BOOL, OPT_1BOOL, OPT_NUM, OPT_STR } type;
8419304Speter
8519304Speter#define	OPT_ADISP	0x001		/* Always display the option. */
8619304Speter#define	OPT_ALWAYS	0x002		/* Always call the support function. */
8719304Speter#define	OPT_NDISP	0x004		/* Never display the option. */
8819304Speter#define	OPT_NOSAVE	0x008		/* Mkexrc command doesn't save. */
8919304Speter#define	OPT_NOSET	0x010		/* Option may not be set. */
9019304Speter#define	OPT_NOUNSET	0x020		/* Option may not be unset. */
9119304Speter#define	OPT_NOZERO	0x040		/* Option may not be set to 0. */
9219304Speter	u_int8_t flags;
9319304Speter};
9419304Speter
9519304Speter/* Option argument to opts_dump(). */
9619304Speterenum optdisp { NO_DISPLAY, ALL_DISPLAY, CHANGED_DISPLAY, SELECT_DISPLAY };
9719304Speter
9819304Speter/* Options array. */
9919304Speterextern OPTLIST const optlist[];
10019304Speter
10119304Speter#include "options_def.h"
102