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