1 /****************************************************************************
2 * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
3 * *
4 * Permission is hereby granted, free of charge, to any person obtaining a *
5 * copy of this software and associated documentation files (the *
6 * "Software"), to deal in the Software without restriction, including *
7 * without limitation the rights to use, copy, modify, merge, publish, *
8 * distribute, distribute with modifications, sublicense, and/or sell *
9 * copies of the Software, and to permit persons to whom the Software is *
10 * furnished to do so, subject to the following conditions: *
11 * *
12 * The above copyright notice and this permission notice shall be included *
13 * in all copies or substantial portions of the Software. *
14 * *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
22 * *
23 * Except as contained in this notice, the name(s) of the above copyright *
24 * holders shall not be used in advertising or otherwise to promote the *
25 * sale, use or other dealings in this Software without prior written *
26 * authorization. *
27 ****************************************************************************/
28
29 /****************************************************************************
30 * Author: Zeyd M. Ben-Halim <[email protected]> 1992,1995 *
31 * and: Eric S. Raymond <[email protected]> *
32 * and: Thomas E. Dickey 2002 *
33 * and: Juergen Pfeifer 2009 *
34 ****************************************************************************/
35
36 /*
37 * lib_kernel.c
38 *
39 * Misc. low-level routines:
40 * erasechar()
41 * killchar()
42 * flushinp()
43 *
44 * The baudrate() and delay_output() functions could logically live here,
45 * but are in other modules to reduce the static-link size of programs
46 * that use only these facilities.
47 */
48
49 #include <curses.priv.h>
50
51 MODULE_ID("$Id: lib_kernel.c,v 1.31 2010/12/19 01:21:19 tom Exp $")
52
53 static int
_nc_vdisable(void)54 _nc_vdisable(void)
55 {
56 int value = -1;
57 #if defined(_POSIX_VDISABLE) && HAVE_UNISTD_H
58 value = _POSIX_VDISABLE;
59 #endif
60 #if defined(_PC_VDISABLE)
61 if (value == -1) {
62 value = (int) fpathconf(0, _PC_VDISABLE);
63 if (value == -1) {
64 value = 0377;
65 }
66 }
67 #elif defined(VDISABLE)
68 if (value == -1)
69 value = VDISABLE;
70 #endif
71 return value;
72 }
73
74 /*
75 * erasechar()
76 *
77 * Return erase character as given in cur_term->Ottyb.
78 *
79 */
80
81 NCURSES_EXPORT(char)
NCURSES_SP_NAME(erasechar)82 NCURSES_SP_NAME(erasechar) (NCURSES_SP_DCL0)
83 {
84 int result = ERR;
85 TERMINAL *termp = TerminalOf(SP_PARM);
86
87 T((T_CALLED("erasechar(%p)"), (void *) SP_PARM));
88
89 if (termp != 0) {
90 #ifdef TERMIOS
91 result = termp->Ottyb.c_cc[VERASE];
92 if (result == _nc_vdisable())
93 result = ERR;
94 #else
95 result = termp->Ottyb.sg_erase;
96 #endif
97 }
98 returnChar((char) result);
99 }
100
101 #if NCURSES_SP_FUNCS
102 NCURSES_EXPORT(char)
erasechar(void)103 erasechar(void)
104 {
105 return NCURSES_SP_NAME(erasechar) (CURRENT_SCREEN);
106 }
107 #endif
108
109 /*
110 * killchar()
111 *
112 * Return kill character as given in cur_term->Ottyb.
113 *
114 */
115
116 NCURSES_EXPORT(char)
NCURSES_SP_NAME(killchar)117 NCURSES_SP_NAME(killchar) (NCURSES_SP_DCL0)
118 {
119 int result = ERR;
120 TERMINAL *termp = TerminalOf(SP_PARM);
121
122 T((T_CALLED("killchar(%p)"), (void *) SP_PARM));
123
124 if (termp != 0) {
125 #ifdef TERMIOS
126 result = termp->Ottyb.c_cc[VKILL];
127 if (result == _nc_vdisable())
128 result = ERR;
129 #else
130 result = termp->Ottyb.sg_kill;
131 #endif
132 }
133 returnChar((char) result);
134 }
135
136 #if NCURSES_SP_FUNCS
137 NCURSES_EXPORT(char)
killchar(void)138 killchar(void)
139 {
140 return NCURSES_SP_NAME(killchar) (CURRENT_SCREEN);
141 }
142 #endif
143
144 /*
145 * flushinp()
146 *
147 * Flush any input on cur_term->Filedes
148 *
149 */
150
151 NCURSES_EXPORT(int)
NCURSES_SP_NAME(flushinp)152 NCURSES_SP_NAME(flushinp) (NCURSES_SP_DCL0)
153 {
154 TERMINAL *termp = TerminalOf(SP_PARM);
155
156 T((T_CALLED("flushinp(%p)"), (void *) SP_PARM));
157
158 if (termp != 0) {
159 #ifdef TERMIOS
160 tcflush(termp->Filedes, TCIFLUSH);
161 #else
162 errno = 0;
163 do {
164 ioctl(termp->Filedes, TIOCFLUSH, 0);
165 } while
166 (errno == EINTR);
167 #endif
168 if (SP_PARM) {
169 SP_PARM->_fifohead = -1;
170 SP_PARM->_fifotail = 0;
171 SP_PARM->_fifopeek = 0;
172 }
173 returnCode(OK);
174 }
175 returnCode(ERR);
176 }
177
178 #if NCURSES_SP_FUNCS
179 NCURSES_EXPORT(int)
flushinp(void)180 flushinp(void)
181 {
182 return NCURSES_SP_NAME(flushinp) (CURRENT_SCREEN);
183 }
184 #endif
185