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 { 77f0957ccaSPeter Wemm CHAR_T *name; /* Name. */ 78b8ba871bSPeter Wemm /* Change function. */ 79c271fa92SBaptiste Daroussin 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. */ 90f0957ccaSPeter 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 100*6680e5a5SBaptiste Daroussin #ifdef O_PATH 101*6680e5a5SBaptiste Daroussin #undef O_PATH /* bits/fcntl-linux.h may have defined O_PATH. */ 102*6680e5a5SBaptiste Daroussin #endif 103*6680e5a5SBaptiste Daroussin 104b8ba871bSPeter Wemm #include "options_def.h" 105