119304Speter/*-
219304Speter * Copyright (c) 1993, 1994
319304Speter *	The Regents of the University of California.  All rights reserved.
419304Speter * Copyright (c) 1993, 1994, 1995, 1996
519304Speter *	Keith Bostic.  All rights reserved.
619304Speter *
719304Speter * See the LICENSE file for redistribution information.
819304Speter *
9254225Speter *	$Id: gs.h,v 11.0 2012/10/17 06:34:37 zy Exp $
1019304Speter */
1119304Speter
1219304Speter#define	TEMPORARY_FILE_STRING	"/tmp"	/* Default temporary file name. */
1319304Speter
14254225Speter#include <nl_types.h>
15254225Speter
1619304Speter/*
1719304Speter * File reference structure (FREF).  The structure contains the name of the
1819304Speter * file, along with the information that follows the name.
1919304Speter *
2019304Speter * !!!
2119304Speter * The read-only bit follows the file name, not the file itself.
2219304Speter */
2319304Speterstruct _fref {
24254225Speter	TAILQ_ENTRY(_fref) q;		/* Linked list of file references. */
2519304Speter	char	*name;			/* File name. */
2619304Speter	char	*tname;			/* Backing temporary file name. */
2719304Speter
2819304Speter	recno_t	 lno;			/* 1-N: file cursor line. */
2919304Speter	size_t	 cno;			/* 0-N: file cursor column. */
3019304Speter
3119304Speter#define	FR_CURSORSET	0x0001		/* If lno/cno values valid. */
3219304Speter#define	FR_DONTDELETE	0x0002		/* Don't delete the temporary file. */
3319304Speter#define	FR_EXNAMED	0x0004		/* Read/write renamed the file. */
3419304Speter#define	FR_NAMECHANGE	0x0008		/* If the name changed. */
3519304Speter#define	FR_NEWFILE	0x0010		/* File doesn't really exist yet. */
3619304Speter#define	FR_RECOVER	0x0020		/* File is being recovered. */
3719304Speter#define	FR_TMPEXIT	0x0040		/* Modified temporary file, no exit. */
3819304Speter#define	FR_TMPFILE	0x0080		/* If file has no name. */
3919304Speter#define	FR_UNLOCKED	0x0100		/* File couldn't be locked. */
4019304Speter	u_int16_t flags;
4119304Speter};
4219304Speter
4319304Speter/* Action arguments to scr_exadjust(). */
4419304Spetertypedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t;
4519304Speter
4619304Speter/* Screen attribute arguments to scr_attr(). */
4719304Spetertypedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t;
4819304Speter
4919304Speter/* Key type arguments to scr_keyval(). */
5019304Spetertypedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t;
5119304Speter
5219304Speter/*
5319304Speter * GS:
5419304Speter *
5519304Speter * Structure that describes global state of the running program.
5619304Speter */
5719304Speterstruct _gs {
5819304Speter	char	*progname;		/* Programe name. */
5919304Speter
6019304Speter	int	 id;			/* Last allocated screen id. */
61254225Speter	TAILQ_HEAD(_dqh, _scr) dq[1];	/* Displayed screens. */
62254225Speter	TAILQ_HEAD(_hqh, _scr) hq[1];	/* Hidden screens. */
6319304Speter
6419304Speter	SCR	*ccl_sp;		/* Colon command-line screen. */
6519304Speter
6619304Speter	void	*cl_private;		/* Curses support private area. */
6719304Speter
6819304Speter					/* File references. */
69254225Speter	TAILQ_HEAD(_frefh, _fref) frefq[1];
7019304Speter
7119304Speter#define	GO_COLUMNS	0		/* Global options: columns. */
7219304Speter#define	GO_LINES	1		/* Global options: lines. */
7319304Speter#define	GO_SECURE	2		/* Global options: secure. */
7419304Speter#define	GO_TERM		3		/* Global options: terminal type. */
7519304Speter	OPTION	 opts[GO_TERM + 1];
7619304Speter
77254225Speter	nl_catd	 catd;			/* Message catalog descriptor. */
78254225Speter	MSGH	 msgq[1];		/* User message list. */
7919304Speter#define	DEFAULT_NOPRINT	'\1'		/* Emergency non-printable character. */
80254225Speter	int	 noprint;		/* Cached, unprintable character. */
8119304Speter
8219304Speter	char	*tmp_bp;		/* Temporary buffer. */
8319304Speter	size_t	 tmp_blen;		/* Temporary buffer size. */
8419304Speter
8519304Speter	/*
8619304Speter	 * Ex command structures (EXCMD).  Defined here because ex commands
8719304Speter	 * exist outside of any particular screen or file.
8819304Speter	 */
89254225Speter#define	EXCMD_RUNNING(gp)	(SLIST_FIRST((gp)->ecq)->clen != 0)
90254225Speter					/* Ex command linked list. */
91254225Speter	SLIST_HEAD(_excmdh, _excmd) ecq[1];
9219304Speter	EXCMD	 excmd;			/* Default ex command structure. */
9319304Speter	char	 *if_name;		/* Current associated file. */
9419304Speter	recno_t	  if_lno;		/* Current associated line number. */
9519304Speter
9619304Speter	char	*c_option;		/* Ex initial, command-line command. */
9719304Speter
9819304Speter#ifdef DEBUG
9919304Speter	FILE	*tracefp;		/* Trace file pointer. */
10019304Speter#endif
10119304Speter
10219304Speter	EVENT	*i_event;		/* Array of input events. */
10319304Speter	size_t	 i_nelem;		/* Number of array elements. */
10419304Speter	size_t	 i_cnt;			/* Count of events. */
10519304Speter	size_t	 i_next;		/* Offset of next event. */
10619304Speter
10719304Speter	CB	*dcbp;			/* Default cut buffer pointer. */
10819304Speter	CB	 dcb_store;		/* Default cut buffer storage. */
109254225Speter	SLIST_HEAD(_cuth, _cb) cutq[1];	/* Linked list of cut buffers. */
11019304Speter
111254225Speter#define	MAX_BIT_SEQ	0x7f		/* Max + 1 fast check character. */
112254225Speter	SLIST_HEAD(_seqh, _seq) seqq[1];/* Linked list of maps, abbrevs. */
113254225Speter	bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1);
11419304Speter
115254225Speter#define	MAX_FAST_KEY	0xff		/* Max fast check character.*/
11619304Speter#define	KEY_LEN(sp, ch)							\
117254225Speter	(((ch) & ~MAX_FAST_KEY) == 0 ?					\
11819304Speter	    sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
11919304Speter#define	KEY_NAME(sp, ch)						\
120254225Speter	(((ch) & ~MAX_FAST_KEY) == 0 ?					\
12119304Speter	    sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
12219304Speter	struct {
123254225Speter		char	 name[MAX_CHARACTER_COLUMNS + 1];
12419304Speter		u_int8_t len;
12519304Speter	} cname[MAX_FAST_KEY + 1];	/* Fast lookup table. */
12619304Speter
12719304Speter#define	KEY_VAL(sp, ch)							\
128254225Speter	(((ch) & ~MAX_FAST_KEY) == 0 ? 					\
129254225Speter	    sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch))
130254225Speter	e_key_t				/* Fast lookup table. */
13119304Speter	    special_key[MAX_FAST_KEY + 1];
13219304Speter
13319304Speter/* Flags. */
13419304Speter#define	G_ABBREV	0x0001		/* If have abbreviations. */
13519304Speter#define	G_BELLSCHED	0x0002		/* Bell scheduled. */
13619304Speter#define	G_INTERRUPTED	0x0004		/* Interrupted. */
13719304Speter#define	G_RECOVER_SET	0x0008		/* Recover system initialized. */
13819304Speter#define	G_SCRIPTED	0x0010		/* Ex script session. */
13919304Speter#define	G_SCRWIN	0x0020		/* Scripting windows running. */
14019304Speter#define	G_SNAPSHOT	0x0040		/* Always snapshot files. */
14119304Speter#define	G_SRESTART	0x0080		/* Screen restarted. */
14219304Speter#define	G_TMP_INUSE	0x0100		/* Temporary buffer in use. */
14319304Speter	u_int32_t flags;
14419304Speter
14519304Speter	/* Screen interface functions. */
14619304Speter					/* Add a string to the screen. */
14719304Speter	int	(*scr_addstr) __P((SCR *, const char *, size_t));
148254225Speter					/* Add a string to the screen. */
149254225Speter	int	(*scr_waddstr) __P((SCR *, const CHAR_T *, size_t));
15019304Speter					/* Toggle a screen attribute. */
15119304Speter	int	(*scr_attr) __P((SCR *, scr_attr_t, int));
15219304Speter					/* Terminal baud rate. */
15319304Speter	int	(*scr_baud) __P((SCR *, u_long *));
15419304Speter					/* Beep/bell/flash the terminal. */
15519304Speter	int	(*scr_bell) __P((SCR *));
15619304Speter					/* Display a busy message. */
15719304Speter	void	(*scr_busy) __P((SCR *, const char *, busy_t));
158254225Speter					/* Prepare child. */
159254225Speter	int	(*scr_child) __P((SCR *));
16019304Speter					/* Clear to the end of the line. */
16119304Speter	int	(*scr_clrtoeol) __P((SCR *));
16219304Speter					/* Return the cursor location. */
16319304Speter	int	(*scr_cursor) __P((SCR *, size_t *, size_t *));
16419304Speter					/* Delete a line. */
16519304Speter	int	(*scr_deleteln) __P((SCR *));
166254225Speter					/* Discard a screen. */
167254225Speter	int	(*scr_discard) __P((SCR *, SCR **));
16819304Speter					/* Get a keyboard event. */
16919304Speter	int	(*scr_event) __P((SCR *, EVENT *, u_int32_t, int));
17019304Speter					/* Ex: screen adjustment routine. */
17119304Speter	int	(*scr_ex_adjust) __P((SCR *, exadj_t));
17219304Speter	int	(*scr_fmap)		/* Set a function key. */
17319304Speter	    __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t));
17419304Speter					/* Get terminal key value. */
17519304Speter	int	(*scr_keyval) __P((SCR *, scr_keyval_t, CHAR_T *, int *));
17619304Speter					/* Insert a line. */
17719304Speter	int	(*scr_insertln) __P((SCR *));
17819304Speter					/* Handle an option change. */
17919304Speter	int	(*scr_optchange) __P((SCR *, int, char *, u_long *));
18019304Speter					/* Move the cursor. */
18119304Speter	int	(*scr_move) __P((SCR *, size_t, size_t));
18219304Speter					/* Message or ex output. */
18319304Speter	void	(*scr_msg) __P((SCR *, mtype_t, char *, size_t));
18419304Speter					/* Refresh the screen. */
18519304Speter	int	(*scr_refresh) __P((SCR *, int));
18619304Speter					/* Rename the file. */
18719304Speter	int	(*scr_rename) __P((SCR *, char *, int));
188254225Speter					/* Reply to an event. */
189254225Speter	int	(*scr_reply) __P((SCR *, int, char *));
19019304Speter					/* Set the screen type. */
19119304Speter	int	(*scr_screen) __P((SCR *, u_int32_t));
192254225Speter					/* Split the screen. */
193254225Speter	int	(*scr_split) __P((SCR *, SCR *));
19419304Speter					/* Suspend the editor. */
19519304Speter	int	(*scr_suspend) __P((SCR *, int *));
19619304Speter					/* Print usage message. */
19719304Speter	void	(*scr_usage) __P((void));
19819304Speter};
19919304Speter
20019304Speter/*
20119304Speter * XXX
20219304Speter * Block signals if there are asynchronous events.  Used to keep DB system calls
20319304Speter * from being interrupted and not restarted, as that will result in consistency
20419304Speter * problems.  This should be handled by DB.
20519304Speter */
20619304Speter#ifdef BLOCK_SIGNALS
20719304Speter#include <signal.h>
20819304Speterextern sigset_t	__sigblockset;
20919304Speter#define	SIGBLOCK \
21019304Speter	(void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL)
21119304Speter#define	SIGUNBLOCK \
21219304Speter	(void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL);
21319304Speter#else
21419304Speter#define	SIGBLOCK
21519304Speter#define	SIGUNBLOCK
21619304Speter#endif
217