blob: 46f652b0a30a2f6d1ed0cbede036978ecebd91ea [file] [log] [blame]
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05301/****************************************************************************
micky3879b9f5e72025-07-08 18:04:53 -04002 * Copyright 2020-2022,2023 Thomas E. Dickey *
3 * Copyright 1998-2009,2010 Free Software Foundation, Inc. *
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05304 * *
5 * Permission is hereby granted, free of charge, to any person obtaining a *
6 * copy of this software and associated documentation files (the *
7 * "Software"), to deal in the Software without restriction, including *
8 * without limitation the rights to use, copy, modify, merge, publish, *
9 * distribute, distribute with modifications, sublicense, and/or sell *
10 * copies of the Software, and to permit persons to whom the Software is *
11 * furnished to do so, subject to the following conditions: *
12 * *
13 * The above copyright notice and this permission notice shall be included *
14 * in all copies or substantial portions of the Software. *
15 * *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
19 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
22 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
23 * *
24 * Except as contained in this notice, the name(s) of the above copyright *
25 * holders shall not be used in advertising or otherwise to promote the *
26 * sale, use or other dealings in this Software without prior written *
27 * authorization. *
28 ****************************************************************************/
29
30/****************************************************************************
31 * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
32 * and: Eric S. Raymond <esr@snark.thyrsus.com> *
Steve Kondikae271bc2015-11-15 02:50:53 +010033 * and: Thomas E. Dickey 2002 *
34 * and: Juergen Pfeifer 2009 *
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053035 ****************************************************************************/
36
37/*
38 * lib_kernel.c
39 *
40 * Misc. low-level routines:
41 * erasechar()
42 * killchar()
43 * flushinp()
44 *
45 * The baudrate() and delay_output() functions could logically live here,
46 * but are in other modules to reduce the static-link size of programs
47 * that use only these facilities.
48 */
49
50#include <curses.priv.h>
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053051
micky3879b9f5e72025-07-08 18:04:53 -040052MODULE_ID("$Id: lib_kernel.c,v 1.36 2023/06/10 13:29:06 tom Exp $")
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053053
micky3879b9f5e72025-07-08 18:04:53 -040054#ifdef TERMIOS
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053055static int
56_nc_vdisable(void)
57{
58 int value = -1;
59#if defined(_POSIX_VDISABLE) && HAVE_UNISTD_H
60 value = _POSIX_VDISABLE;
61#endif
micky3879b9f5e72025-07-08 18:04:53 -040062#if defined(_PC_VDISABLE) && HAVE_FPATHCONF
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053063 if (value == -1) {
Steve Kondikae271bc2015-11-15 02:50:53 +010064 value = (int) fpathconf(0, _PC_VDISABLE);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053065 if (value == -1) {
66 value = 0377;
67 }
68 }
69#elif defined(VDISABLE)
70 if (value == -1)
71 value = VDISABLE;
72#endif
73 return value;
74}
micky3879b9f5e72025-07-08 18:04:53 -040075#endif /* TERMIOS */
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053076
77/*
78 * erasechar()
79 *
80 * Return erase character as given in cur_term->Ottyb.
81 *
82 */
83
84NCURSES_EXPORT(char)
Steve Kondikae271bc2015-11-15 02:50:53 +010085NCURSES_SP_NAME(erasechar) (NCURSES_SP_DCL0)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053086{
87 int result = ERR;
Steve Kondikae271bc2015-11-15 02:50:53 +010088 TERMINAL *termp = TerminalOf(SP_PARM);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053089
Steve Kondikae271bc2015-11-15 02:50:53 +010090 T((T_CALLED("erasechar(%p)"), (void *) SP_PARM));
91
92 if (termp != 0) {
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053093#ifdef TERMIOS
Steve Kondikae271bc2015-11-15 02:50:53 +010094 result = termp->Ottyb.c_cc[VERASE];
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053095 if (result == _nc_vdisable())
96 result = ERR;
micky3879b9f5e72025-07-08 18:04:53 -040097#elif defined(EXP_WIN32_DRIVER)
98 result = ERR;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053099#else
Steve Kondikae271bc2015-11-15 02:50:53 +0100100 result = termp->Ottyb.sg_erase;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530101#endif
102 }
Steve Kondikae271bc2015-11-15 02:50:53 +0100103 returnChar((char) result);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530104}
105
Steve Kondikae271bc2015-11-15 02:50:53 +0100106#if NCURSES_SP_FUNCS
107NCURSES_EXPORT(char)
108erasechar(void)
109{
110 return NCURSES_SP_NAME(erasechar) (CURRENT_SCREEN);
111}
112#endif
113
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530114/*
115 * killchar()
116 *
117 * Return kill character as given in cur_term->Ottyb.
118 *
119 */
120
121NCURSES_EXPORT(char)
Steve Kondikae271bc2015-11-15 02:50:53 +0100122NCURSES_SP_NAME(killchar) (NCURSES_SP_DCL0)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530123{
124 int result = ERR;
Steve Kondikae271bc2015-11-15 02:50:53 +0100125 TERMINAL *termp = TerminalOf(SP_PARM);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530126
Steve Kondikae271bc2015-11-15 02:50:53 +0100127 T((T_CALLED("killchar(%p)"), (void *) SP_PARM));
128
129 if (termp != 0) {
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530130#ifdef TERMIOS
Steve Kondikae271bc2015-11-15 02:50:53 +0100131 result = termp->Ottyb.c_cc[VKILL];
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530132 if (result == _nc_vdisable())
133 result = ERR;
micky3879b9f5e72025-07-08 18:04:53 -0400134#elif defined(EXP_WIN32_DRIVER)
135 result = ERR;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530136#else
Steve Kondikae271bc2015-11-15 02:50:53 +0100137 result = termp->Ottyb.sg_kill;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530138#endif
139 }
Steve Kondikae271bc2015-11-15 02:50:53 +0100140 returnChar((char) result);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530141}
142
Steve Kondikae271bc2015-11-15 02:50:53 +0100143#if NCURSES_SP_FUNCS
144NCURSES_EXPORT(char)
145killchar(void)
146{
147 return NCURSES_SP_NAME(killchar) (CURRENT_SCREEN);
148}
149#endif
150
micky3879b9f5e72025-07-08 18:04:53 -0400151static void
152flush_input(int fd)
153{
154#ifdef TERMIOS
155 tcflush(fd, TCIFLUSH);
156#else /* !TERMIOS */
157 errno = 0;
158 do {
159#if defined(EXP_WIN32_DRIVER)
160 _nc_console_flush(_nc_console_fd2handle(fd));
161#else
162 ioctl(fd, TIOCFLUSH, 0);
163#endif
164 } while
165 (errno == EINTR);
166#endif
167}
168
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530169/*
170 * flushinp()
171 *
micky3879b9f5e72025-07-08 18:04:53 -0400172 * Flush any input on tty
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530173 */
174
175NCURSES_EXPORT(int)
Steve Kondikae271bc2015-11-15 02:50:53 +0100176NCURSES_SP_NAME(flushinp) (NCURSES_SP_DCL0)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530177{
Steve Kondikae271bc2015-11-15 02:50:53 +0100178 T((T_CALLED("flushinp(%p)"), (void *) SP_PARM));
179
micky3879b9f5e72025-07-08 18:04:53 -0400180 if (SP_PARM != 0) {
181 if (NC_ISATTY(SP_PARM->_ifd))
182 flush_input(SP_PARM->_ifd);
183 else if (NC_ISATTY(SP_PARM->_ofd))
184 flush_input(SP_PARM->_ofd);
Steve Kondikae271bc2015-11-15 02:50:53 +0100185 if (SP_PARM) {
186 SP_PARM->_fifohead = -1;
187 SP_PARM->_fifotail = 0;
188 SP_PARM->_fifopeek = 0;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530189 }
190 returnCode(OK);
191 }
192 returnCode(ERR);
193}
Steve Kondikae271bc2015-11-15 02:50:53 +0100194
195#if NCURSES_SP_FUNCS
196NCURSES_EXPORT(int)
197flushinp(void)
198{
199 return NCURSES_SP_NAME(flushinp) (CURRENT_SCREEN);
200}
201#endif