1 /*	$OpenBSD: key.h,v 1.4 2006/01/08 21:05:39 miod Exp $	*/
2 
3 /*-
4  * Copyright (c) 1991, 1993, 1994
5  *	The Regents of the University of California.  All rights reserved.
6  * Copyright (c) 1991, 1993, 1994, 1995, 1996
7  *	Keith Bostic.  All rights reserved.
8  *
9  * See the LICENSE file for redistribution information.
10  *
11  *	@(#)key.h	10.18 (Berkeley) 6/30/96
12  */
13 
14 /*
15  * Fundamental character types.
16  *
17  * CHAR_T	An integral type that can hold any character.
18  * ARG_CHAR_T	The type of a CHAR_T when passed as an argument using
19  *		traditional promotion rules.  It should also be able
20  *		to be compared against any CHAR_T for equality without
21  *		problems.
22  * MAX_CHAR_T	The maximum value of any character.
23  *
24  * If no integral type can hold a character, don't even try the port.
25  */
26 typedef	u_char		CHAR_T;
27 typedef	u_int		ARG_CHAR_T;
28 #define	MAX_CHAR_T	0xff
29 
30 /* The maximum number of columns any character can take up on a screen. */
31 #define	MAX_CHARACTER_COLUMNS	4
32 
33 /*
34  * Event types.
35  *
36  * The program structure depends on the event loop being able to return
37  * E_EOF/E_ERR multiple times -- eventually enough things will end due
38  * to the events that vi will reach the command level for the screen, at
39  * which point the exit flags will be set and vi will exit.
40  */
41 typedef enum {
42 	E_NOTUSED = 0,			/* Not set. */
43 	E_CHARACTER,			/* Input character: e_c set. */
44 	E_EOF,				/* End of input (NOT ^D). */
45 	E_ERR,				/* Input error. */
46 	E_INTERRUPT,			/* Interrupt. */
47 	E_QUIT,				/* Quit. */
48 	E_REPAINT,			/* Repaint: e_flno, e_tlno set. */
49 	E_SIGHUP,			/* SIGHUP. */
50 	E_SIGTERM,			/* SIGTERM. */
51 	E_STRING,			/* Input string: e_csp, e_len set. */
52 	E_TIMEOUT,			/* Timeout. */
53 	E_WRESIZE,			/* Window resize. */
54 	E_WRITE				/* Write. */
55 } e_event_t;
56 
57 /*
58  * Character values.
59  */
60 typedef enum {
61 	K_NOTUSED = 0,			/* Not set. */
62 	K_BACKSLASH,			/*  \ */
63 	K_CARAT,			/*  ^ */
64 	K_CNTRLD,			/* ^D */
65 	K_CNTRLR,			/* ^R */
66 	K_CNTRLT,			/* ^T */
67 	K_CNTRLZ,			/* ^Z */
68 	K_COLON,			/*  : */
69 	K_CR,				/* \r */
70 	K_ESCAPE,			/* ^[ */
71 	K_FORMFEED,			/* \f */
72 	K_HEXCHAR,			/* ^X */
73 	K_NL,				/* \n */
74 	K_RIGHTBRACE,			/*  } */
75 	K_RIGHTPAREN,			/*  ) */
76 	K_TAB,				/* \t */
77 	K_VERASE,			/* set from tty: default ^H */
78 	K_VKILL,			/* set from tty: default ^U */
79 	K_VLNEXT,			/* set from tty: default ^V */
80 	K_VWERASE,			/* set from tty: default ^W */
81 	K_ZERO				/*  0 */
82 } e_key_t;
83 
84 struct _event {
85 	TAILQ_ENTRY(_event) q;		/* Linked list of events. */
86 	e_event_t e_event;		/* Event type. */
87 	union {
88 		struct {		/* Input character. */
89 			CHAR_T c;	/* Character. */
90 			e_key_t value;	/* Key type. */
91 
92 #define	CH_ABBREVIATED	0x01		/* Character is from an abbreviation. */
93 #define	CH_MAPPED	0x02		/* Character is from a map. */
94 #define	CH_NOMAP	0x04		/* Do not map the character. */
95 #define	CH_QUOTED	0x08		/* Character is already quoted. */
96 			u_int8_t flags;
97 		} _e_ch;
98 #define	e_ch	_u_event._e_ch		/* !!! The structure, not the char. */
99 #define	e_c	_u_event._e_ch.c
100 #define	e_value	_u_event._e_ch.value
101 #define	e_flags	_u_event._e_ch.flags
102 
103 		struct {		/* Screen position, size. */
104 			size_t lno1;	/* Line number. */
105 			size_t cno1;	/* Column number. */
106 			size_t lno2;	/* Line number. */
107 			size_t cno2;	/* Column number. */
108 		} _e_mark;
109 #define	e_lno	_u_event._e_mark.lno1	/* Single location. */
110 #define	e_cno	_u_event._e_mark.cno1
111 #define	e_flno	_u_event._e_mark.lno1	/* Text region. */
112 #define	e_fcno	_u_event._e_mark.cno1
113 #define	e_tlno	_u_event._e_mark.lno2
114 #define	e_tcno	_u_event._e_mark.cno2
115 
116 		struct {		/* Input string. */
117 			CHAR_T	*asp;	/* Allocated string. */
118 			CHAR_T	*csp;	/* String. */
119 			size_t	 len;	/* String length. */
120 		} _e_str;
121 #define	e_asp	_u_event._e_str.asp
122 #define	e_csp	_u_event._e_str.csp
123 #define	e_len	_u_event._e_str.len
124 	} _u_event;
125 };
126 
127 typedef struct _keylist {
128 	e_key_t value;			/* Special value. */
129 	CHAR_T ch;			/* Key. */
130 } KEYLIST;
131 extern KEYLIST keylist[];
132 
133 					/* Return if more keys in queue. */
134 #define	KEYS_WAITING(sp)	((sp)->gp->i_cnt != 0)
135 #define	MAPPED_KEYS_WAITING(sp)						\
136 	(KEYS_WAITING(sp) &&						\
137 	    F_ISSET(&(sp)->gp->i_event[(sp)->gp->i_next].e_ch, CH_MAPPED))
138 
139 /*
140  * Ex/vi commands are generally separated by whitespace characters.  We
141  * can't use the standard isspace(3) macro because it returns true for
142  * characters like ^K in the ASCII character set.  The 4.4BSD isblank(3)
143  * macro does exactly what we want, but it's not portable yet.
144  *
145  * XXX
146  * Note side effect, ch is evaluated multiple times.
147  */
148 #ifndef isblank
149 #define	isblank(ch)	((ch) == ' ' || (ch) == '\t')
150 #endif
151 
152 /* The "standard" tab width, for displaying things to users. */
153 #define	STANDARD_TAB	6
154 
155 /* Various special characters, messages. */
156 #define	CH_BSEARCH	'?'		/* Backward search prompt. */
157 #define	CH_CURSOR	' '		/* Cursor character. */
158 #define	CH_ENDMARK	'$'		/* End of a range. */
159 #define	CH_EXPROMPT	':'		/* Ex prompt. */
160 #define	CH_FSEARCH	'/'		/* Forward search prompt. */
161 #define	CH_HEX		'\030'		/* Leading hex character. */
162 #define	CH_LITERAL	'\026'		/* ASCII ^V. */
163 #define	CH_NO		'n'		/* No. */
164 #define	CH_NOT_DIGIT	'a'		/* A non-isdigit() character. */
165 #define	CH_QUIT		'q'		/* Quit. */
166 #define	CH_YES		'y'		/* Yes. */
167 
168 /*
169  * Checking for interrupts means that we look at the bit that gets set if the
170  * screen code supports asynchronous events, and call back into the event code
171  * so that non-asynchronous screens get a chance to post the interrupt.
172  *
173  * INTERRUPT_CHECK is the number of lines "operated" on before checking for
174  * interrupts.
175  */
176 #define	INTERRUPT_CHECK	100
177 #define	INTERRUPTED(sp)							\
178 	(F_ISSET((sp)->gp, G_INTERRUPTED) ||				\
179 	(!v_event_get((sp), NULL, 0, EC_INTERRUPT) &&			\
180 	F_ISSET((sp)->gp, G_INTERRUPTED)))
181 #define	CLR_INTERRUPT(sp)						\
182 	F_CLR((sp)->gp, G_INTERRUPTED)
183 
184 /* Flags describing types of characters being requested. */
185 #define	EC_INTERRUPT	0x001		/* Checking for interrupts. */
186 #define	EC_MAPCOMMAND	0x002		/* Apply the command map. */
187 #define	EC_MAPINPUT	0x004		/* Apply the input map. */
188 #define	EC_MAPNODIGIT	0x008		/* Return to a digit. */
189 #define	EC_QUOTED	0x010		/* Try to quote next character */
190 #define	EC_RAW		0x020		/* Any next character. XXX: not used. */
191 #define	EC_TIMEOUT	0x040		/* Timeout to next character. */
192 
193 /* Flags describing text input special cases. */
194 #define	TXT_ADDNEWLINE	0x00000001	/* Replay starts on a new line. */
195 #define	TXT_AICHARS	0x00000002	/* Leading autoindent chars. */
196 #define	TXT_ALTWERASE	0x00000004	/* Option: altwerase. */
197 #define	TXT_APPENDEOL	0x00000008	/* Appending after EOL. */
198 #define	TXT_AUTOINDENT	0x00000010	/* Autoindent set this line. */
199 #define	TXT_BACKSLASH	0x00000020	/* Backslashes escape characters. */
200 #define	TXT_BEAUTIFY	0x00000040	/* Only printable characters. */
201 #define	TXT_BS		0x00000080	/* Backspace returns the buffer. */
202 #define	TXT_CEDIT	0x00000100	/* Can return TERM_CEDIT. */
203 #define	TXT_CNTRLD	0x00000200	/* Control-D is a command. */
204 #define	TXT_CNTRLT	0x00000400	/* Control-T is an indent special. */
205 #define	TXT_CR		0x00000800	/* CR returns the buffer. */
206 #define	TXT_DOTTERM	0x00001000	/* Leading '.' terminates the input. */
207 #define	TXT_EMARK	0x00002000	/* End of replacement mark. */
208 #define	TXT_EOFCHAR	0x00004000	/* ICANON set, return EOF character. */
209 #define	TXT_ESCAPE	0x00008000	/* Escape returns the buffer. */
210 #define	TXT_FILEC	0x00010000	/* Option: filec. */
211 #define	TXT_INFOLINE	0x00020000	/* Editing the info line. */
212 #define	TXT_MAPINPUT	0x00040000	/* Apply the input map. */
213 #define	TXT_NLECHO	0x00080000	/* Echo the newline. */
214 #define	TXT_NUMBER	0x00100000	/* Number the line. */
215 #define	TXT_OVERWRITE	0x00200000	/* Overwrite characters. */
216 #define	TXT_PROMPT	0x00400000	/* Display a prompt. */
217 #define	TXT_RECORD	0x00800000	/* Record for replay. */
218 #define	TXT_REPLACE	0x01000000	/* Replace; don't delete overwrite. */
219 #define	TXT_REPLAY	0x02000000	/* Replay the last input. */
220 #define	TXT_RESOLVE	0x04000000	/* Resolve the text into the file. */
221 #define	TXT_SEARCHINCR	0x08000000	/* Incremental search. */
222 #define	TXT_SHOWMATCH	0x10000000	/* Option: showmatch. */
223 #define	TXT_TTYWERASE	0x20000000	/* Option: ttywerase. */
224 #define	TXT_WRAPMARGIN	0x40000000	/* Option: wrapmargin. */
225