1b8ba871bSPeter Wemm /*- 2b8ba871bSPeter Wemm * Copyright (c) 1993, 1994 3b8ba871bSPeter Wemm * The Regents of the University of California. All rights reserved. 4b8ba871bSPeter Wemm * Copyright (c) 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 #define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */ 11b8ba871bSPeter Wemm 12b8ba871bSPeter Wemm #include <nl_types.h> 13b8ba871bSPeter Wemm 14b8ba871bSPeter Wemm /* 15b8ba871bSPeter Wemm * File reference structure (FREF). The structure contains the name of the 16b8ba871bSPeter Wemm * file, along with the information that follows the name. 17b8ba871bSPeter Wemm * 18b8ba871bSPeter Wemm * !!! 19b8ba871bSPeter Wemm * The read-only bit follows the file name, not the file itself. 20b8ba871bSPeter Wemm */ 21b8ba871bSPeter Wemm struct _fref { 22b8ba871bSPeter Wemm TAILQ_ENTRY(_fref) q; /* Linked list of file references. */ 23b8ba871bSPeter Wemm char *name; /* File name. */ 24b8ba871bSPeter Wemm char *tname; /* Backing temporary file name. */ 25b8ba871bSPeter Wemm 26b8ba871bSPeter Wemm recno_t lno; /* 1-N: file cursor line. */ 27b8ba871bSPeter Wemm size_t cno; /* 0-N: file cursor column. */ 28b8ba871bSPeter Wemm 29b8ba871bSPeter Wemm #define FR_CURSORSET 0x0001 /* If lno/cno values valid. */ 30b8ba871bSPeter Wemm #define FR_DONTDELETE 0x0002 /* Don't delete the temporary file. */ 31b8ba871bSPeter Wemm #define FR_EXNAMED 0x0004 /* Read/write renamed the file. */ 32b8ba871bSPeter Wemm #define FR_NAMECHANGE 0x0008 /* If the name changed. */ 33b8ba871bSPeter Wemm #define FR_NEWFILE 0x0010 /* File doesn't really exist yet. */ 34b8ba871bSPeter Wemm #define FR_RECOVER 0x0020 /* File is being recovered. */ 35b8ba871bSPeter Wemm #define FR_TMPEXIT 0x0040 /* Modified temporary file, no exit. */ 36b8ba871bSPeter Wemm #define FR_TMPFILE 0x0080 /* If file has no name. */ 37b8ba871bSPeter Wemm #define FR_UNLOCKED 0x0100 /* File couldn't be locked. */ 38b8ba871bSPeter Wemm u_int16_t flags; 39b8ba871bSPeter Wemm }; 40b8ba871bSPeter Wemm 41b8ba871bSPeter Wemm /* Action arguments to scr_exadjust(). */ 42b8ba871bSPeter Wemm typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t; 43b8ba871bSPeter Wemm 44b8ba871bSPeter Wemm /* Screen attribute arguments to scr_attr(). */ 45b8ba871bSPeter Wemm typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t; 46b8ba871bSPeter Wemm 47b8ba871bSPeter Wemm /* Key type arguments to scr_keyval(). */ 48b8ba871bSPeter Wemm typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t; 49b8ba871bSPeter Wemm 50b8ba871bSPeter Wemm /* 51b8ba871bSPeter Wemm * GS: 52b8ba871bSPeter Wemm * 53b8ba871bSPeter Wemm * Structure that describes global state of the running program. 54b8ba871bSPeter Wemm */ 55b8ba871bSPeter Wemm struct _gs { 56b8ba871bSPeter Wemm int id; /* Last allocated screen id. */ 57b8ba871bSPeter Wemm TAILQ_HEAD(_dqh, _scr) dq[1]; /* Displayed screens. */ 58b8ba871bSPeter Wemm TAILQ_HEAD(_hqh, _scr) hq[1]; /* Hidden screens. */ 59b8ba871bSPeter Wemm 60b8ba871bSPeter Wemm SCR *ccl_sp; /* Colon command-line screen. */ 61b8ba871bSPeter Wemm 62b8ba871bSPeter Wemm void *cl_private; /* Curses support private area. */ 63b8ba871bSPeter Wemm 64b8ba871bSPeter Wemm /* File references. */ 65b8ba871bSPeter Wemm TAILQ_HEAD(_frefh, _fref) frefq[1]; 66b8ba871bSPeter Wemm 67b8ba871bSPeter Wemm #define GO_COLUMNS 0 /* Global options: columns. */ 68b8ba871bSPeter Wemm #define GO_LINES 1 /* Global options: lines. */ 69b8ba871bSPeter Wemm #define GO_SECURE 2 /* Global options: secure. */ 70b8ba871bSPeter Wemm #define GO_TERM 3 /* Global options: terminal type. */ 71b8ba871bSPeter Wemm OPTION opts[GO_TERM + 1]; 72b8ba871bSPeter Wemm 73b8ba871bSPeter Wemm nl_catd catd; /* Message catalog descriptor. */ 74b8ba871bSPeter Wemm MSGH msgq[1]; /* User message list. */ 75b8ba871bSPeter Wemm #define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */ 76b8ba871bSPeter Wemm int noprint; /* Cached, unprintable character. */ 77b8ba871bSPeter Wemm 78b8ba871bSPeter Wemm char *tmp_bp; /* Temporary buffer. */ 79b8ba871bSPeter Wemm size_t tmp_blen; /* Temporary buffer size. */ 80b8ba871bSPeter Wemm 81b8ba871bSPeter Wemm /* 82b8ba871bSPeter Wemm * Ex command structures (EXCMD). Defined here because ex commands 83b8ba871bSPeter Wemm * exist outside of any particular screen or file. 84b8ba871bSPeter Wemm */ 85b8ba871bSPeter Wemm #define EXCMD_RUNNING(gp) (SLIST_FIRST((gp)->ecq)->clen != 0) 86b8ba871bSPeter Wemm /* Ex command linked list. */ 87b8ba871bSPeter Wemm SLIST_HEAD(_excmdh, _excmd) ecq[1]; 88b8ba871bSPeter Wemm EXCMD excmd; /* Default ex command structure. */ 89b8ba871bSPeter Wemm char *if_name; /* Current associated file. */ 90b8ba871bSPeter Wemm recno_t if_lno; /* Current associated line number. */ 91b8ba871bSPeter Wemm 92b8ba871bSPeter Wemm char *c_option; /* Ex initial, command-line command. */ 93b8ba871bSPeter Wemm 94b8ba871bSPeter Wemm #ifdef DEBUG 95b8ba871bSPeter Wemm FILE *tracefp; /* Trace file pointer. */ 96b8ba871bSPeter Wemm #endif 97b8ba871bSPeter Wemm 98b8ba871bSPeter Wemm EVENT *i_event; /* Array of input events. */ 99b8ba871bSPeter Wemm size_t i_nelem; /* Number of array elements. */ 100b8ba871bSPeter Wemm size_t i_cnt; /* Count of events. */ 101b8ba871bSPeter Wemm size_t i_next; /* Offset of next event. */ 102b8ba871bSPeter Wemm 103b8ba871bSPeter Wemm CB *dcbp; /* Default cut buffer pointer. */ 104b8ba871bSPeter Wemm CB dcb_store; /* Default cut buffer storage. */ 105b8ba871bSPeter Wemm SLIST_HEAD(_cuth, _cb) cutq[1]; /* Linked list of cut buffers. */ 106b8ba871bSPeter Wemm 107b8ba871bSPeter Wemm #define MAX_BIT_SEQ 0x7f /* Max + 1 fast check character. */ 108b8ba871bSPeter Wemm SLIST_HEAD(_seqh, _seq) seqq[1];/* Linked list of maps, abbrevs. */ 109b8ba871bSPeter Wemm bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1); 110b8ba871bSPeter Wemm 111b8ba871bSPeter Wemm #define MAX_FAST_KEY 0xff /* Max fast check character.*/ 112b8ba871bSPeter Wemm #define KEY_LEN(sp, ch) \ 113b8ba871bSPeter Wemm (((ch) & ~MAX_FAST_KEY) == 0 ? \ 114b8ba871bSPeter Wemm sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch)) 115b8ba871bSPeter Wemm #define KEY_NAME(sp, ch) \ 116b8ba871bSPeter Wemm (((ch) & ~MAX_FAST_KEY) == 0 ? \ 117b8ba871bSPeter Wemm sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch)) 118b8ba871bSPeter Wemm struct { 119b8ba871bSPeter Wemm char name[MAX_CHARACTER_COLUMNS + 1]; 120b8ba871bSPeter Wemm u_int8_t len; 121b8ba871bSPeter Wemm } cname[MAX_FAST_KEY + 1]; /* Fast lookup table. */ 122b8ba871bSPeter Wemm 123b8ba871bSPeter Wemm #define KEY_VAL(sp, ch) \ 124b8ba871bSPeter Wemm (((ch) & ~MAX_FAST_KEY) == 0 ? \ 125b8ba871bSPeter Wemm sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch)) 126b8ba871bSPeter Wemm e_key_t /* Fast lookup table. */ 127b8ba871bSPeter Wemm special_key[MAX_FAST_KEY + 1]; 128b8ba871bSPeter Wemm 129b8ba871bSPeter Wemm /* Flags. */ 130b8ba871bSPeter Wemm #define G_ABBREV 0x0001 /* If have abbreviations. */ 131b8ba871bSPeter Wemm #define G_BELLSCHED 0x0002 /* Bell scheduled. */ 132b8ba871bSPeter Wemm #define G_INTERRUPTED 0x0004 /* Interrupted. */ 133b8ba871bSPeter Wemm #define G_RECOVER_SET 0x0008 /* Recover system initialized. */ 134b8ba871bSPeter Wemm #define G_SCRIPTED 0x0010 /* Ex script session. */ 135b8ba871bSPeter Wemm #define G_SCRWIN 0x0020 /* Scripting windows running. */ 136b8ba871bSPeter Wemm #define G_SNAPSHOT 0x0040 /* Always snapshot files. */ 137b8ba871bSPeter Wemm #define G_SRESTART 0x0080 /* Screen restarted. */ 138b8ba871bSPeter Wemm #define G_TMP_INUSE 0x0100 /* Temporary buffer in use. */ 139b8ba871bSPeter Wemm u_int32_t flags; 140b8ba871bSPeter Wemm 141b8ba871bSPeter Wemm /* Screen interface functions. */ 142b8ba871bSPeter Wemm /* Add a string to the screen. */ 143b8ba871bSPeter Wemm int (*scr_addstr)(SCR *, const char *, size_t); 144b8ba871bSPeter Wemm /* Add a string to the screen. */ 145b8ba871bSPeter Wemm int (*scr_waddstr)(SCR *, const CHAR_T *, size_t); 146b8ba871bSPeter Wemm /* Toggle a screen attribute. */ 147b8ba871bSPeter Wemm int (*scr_attr)(SCR *, scr_attr_t, int); 148b8ba871bSPeter Wemm /* Terminal baud rate. */ 149b8ba871bSPeter Wemm int (*scr_baud)(SCR *, u_long *); 150b8ba871bSPeter Wemm /* Beep/bell/flash the terminal. */ 151b8ba871bSPeter Wemm int (*scr_bell)(SCR *); 152b8ba871bSPeter Wemm /* Display a busy message. */ 153b8ba871bSPeter Wemm void (*scr_busy)(SCR *, const char *, busy_t); 154b8ba871bSPeter Wemm /* Prepare child. */ 155b8ba871bSPeter Wemm int (*scr_child)(SCR *); 156b8ba871bSPeter Wemm /* Clear to the end of the line. */ 157b8ba871bSPeter Wemm int (*scr_clrtoeol)(SCR *); 158b8ba871bSPeter Wemm /* Return the cursor location. */ 159b8ba871bSPeter Wemm int (*scr_cursor)(SCR *, size_t *, size_t *); 160b8ba871bSPeter Wemm /* Delete a line. */ 161b8ba871bSPeter Wemm int (*scr_deleteln)(SCR *); 162b8ba871bSPeter Wemm /* Discard a screen. */ 163b8ba871bSPeter Wemm int (*scr_discard)(SCR *, SCR **); 164b8ba871bSPeter Wemm /* Get a keyboard event. */ 165b8ba871bSPeter Wemm int (*scr_event)(SCR *, EVENT *, u_int32_t, int); 166b8ba871bSPeter Wemm /* Ex: screen adjustment routine. */ 167b8ba871bSPeter Wemm int (*scr_ex_adjust)(SCR *, exadj_t); 168b8ba871bSPeter Wemm int (*scr_fmap) /* Set a function key. */ 169b8ba871bSPeter Wemm (SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t); 170b8ba871bSPeter Wemm /* Get terminal key value. */ 171b8ba871bSPeter Wemm int (*scr_keyval)(SCR *, scr_keyval_t, CHAR_T *, int *); 172b8ba871bSPeter Wemm /* Insert a line. */ 173b8ba871bSPeter Wemm int (*scr_insertln)(SCR *); 174b8ba871bSPeter Wemm /* Handle an option change. */ 175b8ba871bSPeter Wemm int (*scr_optchange)(SCR *, int, char *, u_long *); 176b8ba871bSPeter Wemm /* Move the cursor. */ 177b8ba871bSPeter Wemm int (*scr_move)(SCR *, size_t, size_t); 178b8ba871bSPeter Wemm /* Message or ex output. */ 179b8ba871bSPeter Wemm void (*scr_msg)(SCR *, mtype_t, char *, size_t); 180b8ba871bSPeter Wemm /* Refresh the screen. */ 181b8ba871bSPeter Wemm int (*scr_refresh)(SCR *, int); 182b8ba871bSPeter Wemm /* Rename the file. */ 183b8ba871bSPeter Wemm int (*scr_rename)(SCR *, char *, int); 184b8ba871bSPeter Wemm /* Reply to an event. */ 185b8ba871bSPeter Wemm int (*scr_reply)(SCR *, int, char *); 186b8ba871bSPeter Wemm /* Set the screen type. */ 187b8ba871bSPeter Wemm int (*scr_screen)(SCR *, u_int32_t); 188b8ba871bSPeter Wemm /* Split the screen. */ 189b8ba871bSPeter Wemm int (*scr_split)(SCR *, SCR *); 190b8ba871bSPeter Wemm /* Suspend the editor. */ 191b8ba871bSPeter Wemm int (*scr_suspend)(SCR *, int *); 192b8ba871bSPeter Wemm /* Print usage message. */ 193b8ba871bSPeter Wemm void (*scr_usage)(void); 194b8ba871bSPeter Wemm }; 195b8ba871bSPeter Wemm