Commit | Line | Data |
---|---|---|
00ea1f8e | 1 | /*- |
ea7cc6de KB |
2 | * Copyright (c) 1992, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
00ea1f8e KB |
4 | * |
5 | * This code is derived from software contributed to Berkeley by | |
6 | * Christos Zoulas of Cornell University. | |
7 | * | |
ad787160 C |
8 | * Redistribution and use in source and binary forms, with or without |
9 | * modification, are permitted provided that the following conditions | |
10 | * are met: | |
11 | * 1. Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * 2. Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in the | |
15 | * documentation and/or other materials provided with the distribution. | |
16 | * 3. All advertising materials mentioning features or use of this software | |
17 | * must display the following acknowledgement: | |
18 | * This product includes software developed by the University of | |
19 | * California, Berkeley and its contributors. | |
20 | * 4. Neither the name of the University nor the names of its contributors | |
21 | * may be used to endorse or promote products derived from this software | |
22 | * without specific prior written permission. | |
00ea1f8e | 23 | * |
ad787160 C |
24 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
25 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
34 | * SUCH DAMAGE. | |
35 | * | |
36 | * @(#)tty.h 8.1 (Berkeley) 6/4/93 | |
00ea1f8e KB |
37 | */ |
38 | ||
39 | /* | |
40 | * el.tty.h: Local terminal header | |
41 | */ | |
42 | #ifndef _h_el_tty | |
43 | #define _h_el_tty | |
44 | ||
25b839a8 | 45 | #include "histedit.h" |
00ea1f8e KB |
46 | #include <termios.h> |
47 | ||
48 | /* Define our own since everyone gets it wrong! */ | |
49 | #define CONTROL(A) ((A) & 037) | |
50 | ||
51 | /* | |
52 | * Aix compatible names | |
53 | */ | |
54 | # if defined(VWERSE) && !defined(VWERASE) | |
55 | # define VWERASE VWERSE | |
56 | # endif /* VWERSE && !VWERASE */ | |
57 | ||
58 | # if defined(VDISCRD) && !defined(VDISCARD) | |
59 | # define VDISCARD VDISCRD | |
60 | # endif /* VDISCRD && !VDISCARD */ | |
61 | ||
62 | # if defined(VFLUSHO) && !defined(VDISCARD) | |
63 | # define VDISCARD VFLUSHO | |
64 | # endif /* VFLUSHO && VDISCARD */ | |
65 | ||
66 | # if defined(VSTRT) && !defined(VSTART) | |
67 | # define VSTART VSTRT | |
68 | # endif /* VSTRT && ! VSTART */ | |
69 | ||
70 | # if defined(VSTAT) && !defined(VSTATUS) | |
71 | # define VSTATUS VSTAT | |
72 | # endif /* VSTAT && ! VSTATUS */ | |
73 | ||
74 | # ifndef ONLRET | |
75 | # define ONLRET 0 | |
76 | # endif /* ONLRET */ | |
77 | ||
78 | # ifndef TAB3 | |
79 | # ifdef OXTABS | |
80 | # define TAB3 OXTABS | |
81 | # else | |
82 | # define TAB3 0 | |
83 | # endif /* OXTABS */ | |
84 | # endif /* !TAB3 */ | |
85 | ||
86 | # if defined(OXTABS) && !defined(XTABS) | |
87 | # define XTABS OXTABS | |
88 | # endif /* OXTABS && !XTABS */ | |
89 | ||
90 | # ifndef ONLCR | |
91 | # define ONLCR 0 | |
92 | # endif /* ONLCR */ | |
93 | ||
94 | # ifndef IEXTEN | |
95 | # define IEXTEN 0 | |
96 | # endif /* IEXTEN */ | |
97 | ||
98 | # ifndef ECHOCTL | |
99 | # define ECHOCTL 0 | |
100 | # endif /* ECHOCTL */ | |
101 | ||
102 | # ifndef PARENB | |
103 | # define PARENB 0 | |
104 | # endif /* PARENB */ | |
105 | ||
106 | # ifndef EXTPROC | |
107 | # define EXTPROC 0 | |
108 | # endif /* EXTPROC */ | |
109 | ||
110 | # ifndef FLUSHO | |
111 | # define FLUSHO 0 | |
112 | # endif /* FLUSHO */ | |
113 | ||
114 | ||
115 | # if defined(VDISABLE) && !defined(_POSIX_VDISABLE) | |
116 | # define _POSIX_VDISABLE VDISABLE | |
117 | # endif /* VDISABLE && ! _POSIX_VDISABLE */ | |
118 | ||
119 | /* | |
120 | * Work around ISC's definition of IEXTEN which is | |
121 | * XCASE! | |
122 | */ | |
123 | # ifdef ISC | |
124 | # if defined(IEXTEN) && defined(XCASE) | |
125 | # if IEXTEN == XCASE | |
126 | # undef IEXTEN | |
127 | # define IEXTEN 0 | |
128 | # endif /* IEXTEN == XCASE */ | |
129 | # endif /* IEXTEN && XCASE */ | |
130 | # if defined(IEXTEN) && !defined(XCASE) | |
131 | # define XCASE IEXTEN | |
132 | # undef IEXTEN | |
133 | # define IEXTEN 0 | |
134 | # endif /* IEXTEN && !XCASE */ | |
135 | # endif /* ISC */ | |
136 | ||
137 | /* | |
138 | * Work around convex weirdness where turning off IEXTEN makes us | |
139 | * lose all postprocessing! | |
140 | */ | |
141 | #if defined(convex) || defined(__convex__) | |
142 | # if defined(IEXTEN) && IEXTEN != 0 | |
143 | # undef IEXTEN | |
144 | # define IEXTEN 0 | |
145 | # endif /* IEXTEN != 0 */ | |
146 | #endif /* convex || __convex__ */ | |
147 | ||
148 | ||
149 | ||
150 | #ifndef _POSIX_VDISABLE | |
151 | # define _POSIX_VDISABLE ((unsigned char) -1) | |
152 | #endif /* _POSIX_VDISABLE */ | |
153 | ||
154 | #if !defined(CREPRINT) && defined(CRPRNT) | |
155 | # define CREPRINT CRPRNT | |
156 | #endif /* !CREPRINT && CRPRNT */ | |
157 | #if !defined(CDISCARD) && defined(CFLUSH) | |
158 | # define CDISCARD CFLUSH | |
159 | #endif /* !CDISCARD && CFLUSH */ | |
160 | ||
161 | #ifndef CINTR | |
162 | # define CINTR CONTROL('c') | |
163 | #endif /* CINTR */ | |
164 | #ifndef CQUIT | |
165 | # define CQUIT 034 /* ^\ */ | |
166 | #endif /* CQUIT */ | |
167 | #ifndef CERASE | |
168 | # define CERASE 0177 /* ^? */ | |
169 | #endif /* CERASE */ | |
170 | #ifndef CKILL | |
171 | # define CKILL CONTROL('u') | |
172 | #endif /* CKILL */ | |
173 | #ifndef CEOF | |
174 | # define CEOF CONTROL('d') | |
175 | #endif /* CEOF */ | |
176 | #ifndef CEOL | |
177 | # define CEOL _POSIX_VDISABLE | |
178 | #endif /* CEOL */ | |
179 | #ifndef CEOL2 | |
180 | # define CEOL2 _POSIX_VDISABLE | |
181 | #endif /* CEOL2 */ | |
182 | #ifndef CSWTCH | |
183 | # define CSWTCH _POSIX_VDISABLE | |
184 | #endif /* CSWTCH */ | |
185 | #ifndef CDSWTCH | |
186 | # define CDSWTCH _POSIX_VDISABLE | |
187 | #endif /* CDSWTCH */ | |
188 | #ifndef CERASE2 | |
189 | # define CERASE2 _POSIX_VDISABLE | |
190 | #endif /* CERASE2 */ | |
191 | #ifndef CSTART | |
192 | # define CSTART CONTROL('q') | |
193 | #endif /* CSTART */ | |
194 | #ifndef CSTOP | |
195 | # define CSTOP CONTROL('s') | |
196 | #endif /* CSTOP */ | |
197 | #ifndef CSUSP | |
198 | # define CSUSP CONTROL('z') | |
199 | #endif /* CSUSP */ | |
200 | #ifndef CDSUSP | |
201 | # define CDSUSP CONTROL('y') | |
202 | #endif /* CDSUSP */ | |
203 | ||
204 | #ifdef hpux | |
205 | ||
206 | # ifndef CREPRINT | |
207 | # define CREPRINT _POSIX_VDISABLE | |
208 | # endif /* CREPRINT */ | |
209 | # ifndef CDISCARD | |
210 | # define CDISCARD _POSIX_VDISABLE | |
211 | # endif /* CDISCARD */ | |
212 | # ifndef CLNEXT | |
213 | # define CLNEXT _POSIX_VDISABLE | |
214 | # endif /* CLNEXT */ | |
215 | # ifndef CWERASE | |
216 | # define CWERASE _POSIX_VDISABLE | |
217 | # endif /* CWERASE */ | |
218 | ||
219 | #else /* !hpux */ | |
220 | ||
221 | # ifndef CREPRINT | |
222 | # define CREPRINT CONTROL('r') | |
223 | # endif /* CREPRINT */ | |
224 | # ifndef CDISCARD | |
225 | # define CDISCARD CONTROL('o') | |
226 | # endif /* CDISCARD */ | |
227 | # ifndef CLNEXT | |
228 | # define CLNEXT CONTROL('v') | |
229 | # endif /* CLNEXT */ | |
230 | # ifndef CWERASE | |
231 | # define CWERASE CONTROL('w') | |
232 | # endif /* CWERASE */ | |
233 | ||
234 | #endif /* hpux */ | |
235 | ||
236 | #ifndef CSTATUS | |
237 | # define CSTATUS CONTROL('t') | |
238 | #endif /* CSTATUS */ | |
239 | #ifndef CPAGE | |
240 | # define CPAGE ' ' | |
241 | #endif /* CPAGE */ | |
242 | #ifndef CPGOFF | |
243 | # define CPGOFF CONTROL('m') | |
244 | #endif /* CPGOFF */ | |
245 | #ifndef CKILL2 | |
246 | # define CKILL2 _POSIX_VDISABLE | |
247 | #endif /* CKILL2 */ | |
248 | #ifndef CBRK | |
249 | # ifndef masscomp | |
250 | # define CBRK 0377 | |
251 | # else | |
252 | # define CBRK '\0' | |
253 | # endif /* masscomp */ | |
254 | #endif /* CBRK */ | |
255 | #ifndef CMIN | |
256 | # define CMIN CEOF | |
257 | #endif /* CMIN */ | |
258 | #ifndef CTIME | |
259 | # define CTIME CEOL | |
260 | #endif /* CTIME */ | |
261 | ||
262 | /* | |
263 | * Fix for sun inconsistency. On termio VSUSP and the rest of the | |
264 | * ttychars > NCC are defined. So we undefine them. | |
265 | */ | |
266 | #if defined(TERMIO) || defined(POSIX) | |
267 | # if defined(POSIX) && defined(NCCS) | |
268 | # define NUMCC NCCS | |
269 | # else | |
270 | # ifdef NCC | |
271 | # define NUMCC NCC | |
272 | # endif /* NCC */ | |
273 | # endif /* POSIX && NCCS */ | |
274 | # ifdef NUMCC | |
275 | # ifdef VINTR | |
276 | # if NUMCC <= VINTR | |
277 | # undef VINTR | |
278 | # endif /* NUMCC <= VINTR */ | |
279 | # endif /* VINTR */ | |
280 | # ifdef VQUIT | |
281 | # if NUMCC <= VQUIT | |
282 | # undef VQUIT | |
283 | # endif /* NUMCC <= VQUIT */ | |
284 | # endif /* VQUIT */ | |
285 | # ifdef VERASE | |
286 | # if NUMCC <= VERASE | |
287 | # undef VERASE | |
288 | # endif /* NUMCC <= VERASE */ | |
289 | # endif /* VERASE */ | |
290 | # ifdef VKILL | |
291 | # if NUMCC <= VKILL | |
292 | # undef VKILL | |
293 | # endif /* NUMCC <= VKILL */ | |
294 | # endif /* VKILL */ | |
295 | # ifdef VEOF | |
296 | # if NUMCC <= VEOF | |
297 | # undef VEOF | |
298 | # endif /* NUMCC <= VEOF */ | |
299 | # endif /* VEOF */ | |
300 | # ifdef VEOL | |
301 | # if NUMCC <= VEOL | |
302 | # undef VEOL | |
303 | # endif /* NUMCC <= VEOL */ | |
304 | # endif /* VEOL */ | |
305 | # ifdef VEOL2 | |
306 | # if NUMCC <= VEOL2 | |
307 | # undef VEOL2 | |
308 | # endif /* NUMCC <= VEOL2 */ | |
309 | # endif /* VEOL2 */ | |
310 | # ifdef VSWTCH | |
311 | # if NUMCC <= VSWTCH | |
312 | # undef VSWTCH | |
313 | # endif /* NUMCC <= VSWTCH */ | |
314 | # endif /* VSWTCH */ | |
315 | # ifdef VDSWTCH | |
316 | # if NUMCC <= VDSWTCH | |
317 | # undef VDSWTCH | |
318 | # endif /* NUMCC <= VDSWTCH */ | |
319 | # endif /* VDSWTCH */ | |
320 | # ifdef VERASE2 | |
321 | # if NUMCC <= VERASE2 | |
322 | # undef VERASE2 | |
323 | # endif /* NUMCC <= VERASE2 */ | |
324 | # endif /* VERASE2 */ | |
325 | # ifdef VSTART | |
326 | # if NUMCC <= VSTART | |
327 | # undef VSTART | |
328 | # endif /* NUMCC <= VSTART */ | |
329 | # endif /* VSTART */ | |
330 | # ifdef VSTOP | |
331 | # if NUMCC <= VSTOP | |
332 | # undef VSTOP | |
333 | # endif /* NUMCC <= VSTOP */ | |
334 | # endif /* VSTOP */ | |
335 | # ifdef VWERASE | |
336 | # if NUMCC <= VWERASE | |
337 | # undef VWERASE | |
338 | # endif /* NUMCC <= VWERASE */ | |
339 | # endif /* VWERASE */ | |
340 | # ifdef VSUSP | |
341 | # if NUMCC <= VSUSP | |
342 | # undef VSUSP | |
343 | # endif /* NUMCC <= VSUSP */ | |
344 | # endif /* VSUSP */ | |
345 | # ifdef VDSUSP | |
346 | # if NUMCC <= VDSUSP | |
347 | # undef VDSUSP | |
348 | # endif /* NUMCC <= VDSUSP */ | |
349 | # endif /* VDSUSP */ | |
350 | # ifdef VREPRINT | |
351 | # if NUMCC <= VREPRINT | |
352 | # undef VREPRINT | |
353 | # endif /* NUMCC <= VREPRINT */ | |
354 | # endif /* VREPRINT */ | |
355 | # ifdef VDISCARD | |
356 | # if NUMCC <= VDISCARD | |
357 | # undef VDISCARD | |
358 | # endif /* NUMCC <= VDISCARD */ | |
359 | # endif /* VDISCARD */ | |
360 | # ifdef VLNEXT | |
361 | # if NUMCC <= VLNEXT | |
362 | # undef VLNEXT | |
363 | # endif /* NUMCC <= VLNEXT */ | |
364 | # endif /* VLNEXT */ | |
365 | # ifdef VSTATUS | |
366 | # if NUMCC <= VSTATUS | |
367 | # undef VSTATUS | |
368 | # endif /* NUMCC <= VSTATUS */ | |
369 | # endif /* VSTATUS */ | |
370 | # ifdef VPAGE | |
371 | # if NUMCC <= VPAGE | |
372 | # undef VPAGE | |
373 | # endif /* NUMCC <= VPAGE */ | |
374 | # endif /* VPAGE */ | |
375 | # ifdef VPGOFF | |
376 | # if NUMCC <= VPGOFF | |
377 | # undef VPGOFF | |
378 | # endif /* NUMCC <= VPGOFF */ | |
379 | # endif /* VPGOFF */ | |
380 | # ifdef VKILL2 | |
381 | # if NUMCC <= VKILL2 | |
382 | # undef VKILL2 | |
383 | # endif /* NUMCC <= VKILL2 */ | |
384 | # endif /* VKILL2 */ | |
385 | # ifdef VBRK | |
386 | # if NUMCC <= VBRK | |
387 | # undef VBRK | |
388 | # endif /* NUMCC <= VBRK */ | |
389 | # endif /* VBRK */ | |
390 | # ifdef VMIN | |
391 | # if NUMCC <= VMIN | |
392 | # undef VMIN | |
393 | # endif /* NUMCC <= VMIN */ | |
394 | # endif /* VMIN */ | |
395 | # ifdef VTIME | |
396 | # if NUMCC <= VTIME | |
397 | # undef VTIME | |
398 | # endif /* NUMCC <= VTIME */ | |
399 | # endif /* VTIME */ | |
400 | # endif /* NUMCC */ | |
401 | #endif /* !POSIX */ | |
402 | ||
403 | #define C_INTR 0 | |
404 | #define C_QUIT 1 | |
405 | #define C_ERASE 2 | |
406 | #define C_KILL 3 | |
407 | #define C_EOF 4 | |
408 | #define C_EOL 5 | |
409 | #define C_EOL2 6 | |
410 | #define C_SWTCH 7 | |
411 | #define C_DSWTCH 8 | |
412 | #define C_ERASE2 9 | |
413 | #define C_START 10 | |
414 | #define C_STOP 11 | |
415 | #define C_WERASE 12 | |
416 | #define C_SUSP 13 | |
417 | #define C_DSUSP 14 | |
418 | #define C_REPRINT 15 | |
419 | #define C_DISCARD 16 | |
420 | #define C_LNEXT 17 | |
421 | #define C_STATUS 18 | |
422 | #define C_PAGE 19 | |
423 | #define C_PGOFF 20 | |
424 | #define C_KILL2 21 | |
425 | #define C_BRK 22 | |
426 | #define C_MIN 23 | |
427 | #define C_TIME 24 | |
428 | #define C_NCC 25 | |
429 | #define C_SH(A) (1 << (A)) | |
430 | ||
431 | /* | |
432 | * Terminal dependend data structures | |
433 | */ | |
434 | #define EX_IO 0 /* while we are executing */ | |
435 | #define ED_IO 1 /* while we are editing */ | |
436 | #define TS_IO 2 /* new mode from terminal */ | |
437 | #define QU_IO 2 /* used only for quoted chars */ | |
438 | #define NN_IO 3 /* The number of entries */ | |
439 | ||
440 | #define M_INP 0 | |
441 | #define M_OUT 1 | |
442 | #define M_CTL 2 | |
443 | #define M_LIN 3 | |
444 | #define M_CHAR 4 | |
445 | #define M_NN 5 | |
446 | ||
447 | typedef struct { | |
448 | char *t_name; | |
449 | int t_setmask; | |
450 | int t_clrmask; | |
451 | } ttyperm_t[NN_IO][M_NN]; | |
452 | ||
453 | typedef unsigned char ttychar_t[NN_IO][C_NCC]; | |
454 | ||
455 | protected int tty_init __P((EditLine *)); | |
456 | protected void tty_end __P((EditLine *)); | |
457 | protected int tty_stty __P((EditLine *, int, char**)); | |
458 | protected int tty_rawmode __P((EditLine *)); | |
459 | protected int tty_cookedmode __P((EditLine *)); | |
460 | protected int tty_quotemode __P((EditLine *)); | |
461 | protected int tty_noquotemode __P((EditLine *)); | |
4fd754b0 | 462 | protected void tty_bind_char __P((EditLine *, int)); |
00ea1f8e KB |
463 | |
464 | typedef struct { | |
465 | ttyperm_t t_t; | |
466 | ttychar_t t_c; | |
467 | struct termios t_ex, t_ed, t_ts; | |
468 | int t_tabs; | |
469 | int t_eight; | |
470 | speed_t t_speed; | |
471 | int t_mode; | |
472 | unsigned char t_vdisable; | |
473 | } el_tty_t; | |
474 | ||
475 | ||
476 | #endif /* _h_el_tty */ |