File: screen.h

package info (click to toggle)
nvi 1.81.6-24
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,508 kB
  • sloc: ansic: 43,658; sh: 11,206; makefile: 603; perl: 262; tcl: 234; awk: 19
file content (281 lines) | stat: -rw-r--r-- 10,708 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
/*-
 * Copyright (c) 1992, 1993, 1994
 *	The Regents of the University of California.  All rights reserved.
 * Copyright (c) 1992, 1993, 1994, 1995, 1996
 *	Keith Bostic.  All rights reserved.
 *
 * See the LICENSE file for redistribution information.
 *
 *	$Id: screen.h,v 10.49 2002/03/02 23:47:02 skimo Exp $ (Berkeley) $Date: 2002/03/02 23:47:02 $
 */

/*
 * There are minimum values that vi has to have to display a screen.  The row
 * minimum is fixed at 1 (the svi code can share a line between the text line
 * and the colon command/message line).  Column calculation is a lot trickier.
 * For example, you have to have enough columns to display the line number,
 * not to mention guaranteeing that tabstop and shiftwidth values are smaller
 * than the current column value.  It's simpler to have a fixed value and not
 * worry about it.
 *
 * XXX
 * MINIMUM_SCREEN_COLS is almost certainly wrong.
 */
#define	MINIMUM_SCREEN_ROWS	 1
#define	MINIMUM_SCREEN_COLS	20

/*
 * WIN --
 *	A list of screens that are displayed as a whole.
 */
struct _win {
	CIRCLEQ_ENTRY(_win)	    q;	    /* Windows. */

	CIRCLEQ_HEAD(_scrh, _scr)   scrq;   /* Screens */

	GS	*gp;			/* Pointer to global area. */

	SCR	*ccl_sp;		/* Colon command-line screen. */

	void	*perl_private;		/* Perl interpreter. */

	void	*ip_private;		/* IP support private area. */

	void	*th_private;		/* Threading support private area. */

	/*
	 * Ex command structures (EXCMD).  Defined here because ex commands
	 * exist outside of any particular screen or file.
	 */
#define	EXCMD_RUNNING(wp)	((wp)->ecq.lh_first->clen != 0)
	LIST_HEAD(_excmdh, _excmd) ecq;	/* Ex command linked list. */
	EXCMD	 	excmd;		/* Default ex command structure. */
	char	       *if_name;	/* Current associated file. */
	db_recno_t	if_lno;		/* Current associated line number. */

	EVENT	*i_event;		/* Array of input events. */
	size_t	 i_nelem;		/* Number of array elements. */
	size_t	 i_cnt;			/* Count of events. */
	size_t	 i_next;		/* Offset of next event. */

	CB	*dcbp;			/* Default cut buffer pointer. */
	CB	 dcb_store;		/* Default cut buffer storage. */
	LIST_HEAD(_cuth, _cb) cutq;	/* Linked list of cut buffers. */

	/* For now, can be either char or CHAR_T buffer */
	char	*tmp_bp;		/* Temporary buffer. */
	size_t	 tmp_blen;		/* Temporary buffer size. */

	char	*l_lp;			/* Log buffer. */
	size_t	 l_len;			/* Log buffer length. */

	CONVWIN	 cw;

/* Flags. */
#define	W_TMP_INUSE	0x0001		/* Temporary buffer in use. */
	u_int32_t flags;

					/* Message or ex output. */
	void	(*scr_msg) __P((SCR *, mtype_t, char *, size_t));
};

/*
 * SCR --
 *	The screen structure.  To the extent possible, all screen information
 *	is stored in the various private areas.  The only information here
 *	is used by global routines or is shared by too many screens.
 */
struct _scr {
/* INITIALIZED AT SCREEN CREATE. */
	CIRCLEQ_ENTRY(_scr) q;		/* Screens. */
	CIRCLEQ_ENTRY(_scr) eq;         /* Screens. */

	int	 id;			/* Screen id #. */
	int	 refcnt;		/* Reference count. */

	WIN	*wp;			/* Pointer to window. */
	GS	*gp;			/* Pointer to global area. */
	SCR	*nextdisp;		/* Next display screen. */
	SCR	*ccl_parent;		/* Colon command-line parent screen. */
	EXF	*ep;			/* Screen's current EXF structure. */

	CHAR_T	*c_lp;			/* Cached line. */
	size_t	 c_len;			/* Cached line length. */
	/* May move out again once we use DB 
	 * to cache internal representation
	 */
	size_t	 c_blen;		/* Cached line buffer length. */
	db_recno_t	 c_lno;		/* Cached line number. */

	FREF	*frp;			/* FREF being edited. */
	char	**argv;			/* NULL terminated file name array. */
	char	**cargv;		/* Current file name. */

	u_long	 ccnt;			/* Command count. */
	u_long	 q_ccnt;		/* Quit or ZZ command count. */

					/* Screen's: */
	size_t	 rows;			/* 1-N: number of rows. */
	size_t	 cols;			/* 1-N: number of columns. */
	size_t	 t_rows;		/* 1-N: cur number of text rows. */
	size_t	 t_maxrows;		/* 1-N: max number of text rows. */
	size_t	 t_minrows;		/* 1-N: min number of text rows. */
	size_t	 coff;			/* 0-N: screen col offset in display. */
	size_t	 roff;			/* 0-N: screen row offset in display. */

					/* Cursor's: */
	db_recno_t	 lno;			/* 1-N: file line. */
	size_t	 cno;			/* 0-N: file character in line. */

	size_t	 rcm;			/* Vi: 0-N: Most attractive column. */

#define	L_ADDED		0		/* Added lines. */
#define	L_CHANGED	1		/* Changed lines. */
#define	L_DELETED	2		/* Deleted lines. */
#define	L_JOINED	3		/* Joined lines. */
#define	L_MOVED		4		/* Moved lines. */
#define	L_SHIFT		5		/* Shift lines. */
#define	L_YANKED	6		/* Yanked lines. */
	db_recno_t	 rptlchange;		/* Ex/vi: last L_CHANGED lno. */
	db_recno_t	 rptlines[L_YANKED + 1];/* Ex/vi: lines changed by last op. */

	TEXTH	 tiq;			/* Ex/vi: text input queue. */

	SCRIPT	*script;		/* Vi: script mode information .*/

	db_recno_t	 defscroll;	/* Vi: ^D, ^U scroll information. */

					/* Display character. */
	u_char	 cname[MAX_CHARACTER_COLUMNS + 1];
	size_t	 clen;			/* Length of display character. */

	enum {				/* Vi editor mode. */
	    SM_APPEND = 0, SM_CHANGE, SM_COMMAND, SM_INSERT,
	    SM_REPLACE } showmode;

	void	*ex_private;		/* Ex private area. */
	void	*vi_private;		/* Vi private area. */
	void	*perl_private;		/* Perl private area. */
	void	*cl_private;		/* Curses private area. */

	CONV	conv;

	struct _log_state  state;	/* State during log traversal. */

/* PARTIALLY OR COMPLETELY COPIED FROM PREVIOUS SCREEN. */
	char	*alt_name;		/* Ex/vi: alternate file name. */

	CHAR_T	 at_lbuf;		/* Ex/vi: Last executed at buffer. */

					/* Ex/vi: re_compile flags. */
#define	RE_WSTART	L("[[:<:]]")	/* Ex/vi: not-in-word search pattern. */
#define	RE_WSTOP	L("[[:>:]]")
#define RE_WSTART_LEN	(sizeof(RE_WSTART)/sizeof(CHAR_T)-1)
#define RE_WSTOP_LEN	(sizeof(RE_WSTOP)/sizeof(CHAR_T)-1)
					/* Ex/vi: flags to search routines. */
#define	SEARCH_CSCOPE	0x000001	/* Search for a cscope pattern. */
#define	SEARCH_CSEARCH	0x000002	/* Compile search replacement. */
#define	SEARCH_CSUBST	0x000004	/* Compile substitute replacement. */
#define	SEARCH_EOL	0x000008	/* Offset past EOL is okay. */
#define	SEARCH_EXTEND	0x000010	/* Extended RE. */
#define	SEARCH_FIRST	0x000020	/* Search from the first line. */
#define	SEARCH_IC	0x000040	/* Ignore case. */
#define	SEARCH_ICL	0x000080	/* Ignore case. */
#define	SEARCH_INCR	0x000100	/* Search incrementally. */
#define	SEARCH_LITERAL	0x000200	/* Literal string. */
#define	SEARCH_MSG	0x000400	/* Display search messages. */
#define	SEARCH_NOOPT	0x000800	/* Ignore edit options. */
#define	SEARCH_PARSE	0x001000	/* Parse the search pattern. */
#define	SEARCH_SET	0x002000	/* Set search direction. */
#define	SEARCH_TAG	0x004000	/* Search for a tag pattern. */
#define	SEARCH_WMSG	0x008000	/* Display search-wrapped messages. */
#define	SEARCH_WRAP	0x010000	/* Wrap past sof/eof. */

					/* Ex/vi: RE information. */
	dir_t	 searchdir;		/* Last file search direction. */
	regex_t	 re_c;			/* Search RE: compiled form. */
	CHAR_T	*re;			/* Search RE: uncompiled form. */
	size_t	 re_len;		/* Search RE: uncompiled length. */
	regex_t	 subre_c;		/* Substitute RE: compiled form. */
	CHAR_T	*subre;			/* Substitute RE: uncompiled form. */
	size_t	 subre_len;		/* Substitute RE: uncompiled length). */
	CHAR_T	*repl;			/* Substitute replacement. */
	size_t	 repl_len;		/* Substitute replacement length.*/
	size_t	*newl;			/* Newline offset array. */
	size_t	 newl_len;		/* Newline array size. */
	size_t	 newl_cnt;		/* Newlines in replacement. */
	u_int8_t c_suffix;		/* Edcompatible 'c' suffix value. */
	u_int8_t g_suffix;		/* Edcompatible 'g' suffix value. */

	OPTION	 opts[O_OPTIONCOUNT];	/* Ex/vi: Options. */

/*
 * Screen flags.
 *
 * Editor screens.
 */
#define	SC_EX		0x00000001	/* Ex editor. */
#define	SC_VI		0x00000002	/* Vi editor. */

/*
 * Screen formatting flags, first major, then minor.
 *
 * SC_SCR_EX
 *	Ex screen, i.e. cooked mode.
 * SC_SCR_VI
 *	Vi screen, i.e. raw mode.
 * SC_SCR_EXWROTE
 *	The editor had to write on the screen behind curses' back, and we can't
 *	let curses change anything until the user agrees, e.g. entering the
 *	commands :!utility followed by :set.  We have to switch back into the
 *	vi "editor" to read the user's command input, but we can't touch the
 *	rest of the screen because it's known to be wrong.
 * SC_SCR_REFORMAT
 *	The expected presentation of the lines on the screen have changed,
 *	requiring that the intended screen lines be recalculated.  Implies
 *	SC_SCR_REDRAW.
 * SC_SCR_REDRAW
 *	The screen doesn't correctly represent the file; repaint it.  Note,
 *	setting SC_SCR_REDRAW in the current window causes *all* windows to
 *	be repainted.
 * SC_SCR_CENTER
 *	If the current line isn't already on the screen, center it.
 * SC_SCR_TOP
 *	If the current line isn't already on the screen, put it at the to@.
 */
#define	SC_SCR_EX	0x00000004	/* Screen is in ex mode. */
#define	SC_SCR_VI	0x00000008	/* Screen is in vi mode. */
#define	SC_SCR_EXWROTE	0x00000010	/* Ex overwrite: see comment above. */
#define	SC_SCR_REFORMAT	0x00000020	/* Reformat (refresh). */
#define	SC_SCR_REDRAW	0x00000040	/* Refresh. */

#define	SC_SCR_CENTER	0x00000080	/* Center the line if not visible. */
#define	SC_SCR_TOP	0x00000100	/* Top the line if not visible. */

/* Screen/file changes. */
#define	SC_EXIT		0x00000200	/* Exiting (not forced). */
#define	SC_EXIT_FORCE	0x00000400	/* Exiting (forced). */
#define	SC_FSWITCH	0x00000800	/* Switch underlying files. */
#define	SC_SSWITCH	0x00001000	/* Switch screens. */

#define	SC_ARGNOFREE	0x00002000	/* Argument list wasn't allocated. */
#define	SC_ARGRECOVER	0x00004000	/* Argument list is recovery files. */
#define	SC_AT_SET	0x00008000	/* Last at buffer set. */
#define	SC_COMEDIT	0x00010000	/* Colon command-line edit window. */
#define	SC_EX_GLOBAL	0x00020000	/* Ex: executing a global command. */
#define	SC_EX_SILENT	0x00040000	/* Ex: batch script. */
#define	SC_EX_WAIT_NO	0x00080000	/* Ex: don't wait for the user. */
#define	SC_EX_WAIT_YES	0x00100000	/* Ex:    do wait for the user. */
#define	SC_READONLY	0x00200000	/* Persistent readonly state. */
#define	SC_RE_SEARCH	0x00400000	/* Search RE has been compiled. */
#define	SC_RE_SUBST	0x00800000	/* Substitute RE has been compiled. */
#define	SC_SCRIPT	0x01000000	/* Shell script window. */
#define	SC_STATUS	0x02000000	/* Welcome message. */
#define	SC_STATUS_CNT	0x04000000	/* Welcome message plus file count. */
#define	SC_TINPUT	0x08000000	/* Doing text input. */
#define	SC_TINPUT_INFO	0x10000000	/* Doing text input on info line. */
#define SC_CONV_ERROR	0x20000000	/* Met with a conversion error. */
	u_int32_t flags;

	int	    db_error;		/* Return code from db function. */
};