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