GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcurses/tinfo/lib_raw.c Lines: 0 68 0.0 %
Date: 2017-11-07 Branches: 0 28 0.0 %

Line Branch Exec Source
1
/* $OpenBSD: lib_raw.c,v 1.8 2010/01/12 23:22:06 nicm Exp $ */
2
3
/****************************************************************************
4
 * Copyright (c) 1998-2002,2007 Free Software Foundation, Inc.              *
5
 *                                                                          *
6
 * Permission is hereby granted, free of charge, to any person obtaining a  *
7
 * copy of this software and associated documentation files (the            *
8
 * "Software"), to deal in the Software without restriction, including      *
9
 * without limitation the rights to use, copy, modify, merge, publish,      *
10
 * distribute, distribute with modifications, sublicense, and/or sell       *
11
 * copies of the Software, and to permit persons to whom the Software is    *
12
 * furnished to do so, subject to the following conditions:                 *
13
 *                                                                          *
14
 * The above copyright notice and this permission notice shall be included  *
15
 * in all copies or substantial portions of the Software.                   *
16
 *                                                                          *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
18
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
19
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
20
 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
21
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
22
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
23
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
24
 *                                                                          *
25
 * Except as contained in this notice, the name(s) of the above copyright   *
26
 * holders shall not be used in advertising or otherwise to promote the     *
27
 * sale, use or other dealings in this Software without prior written       *
28
 * authorization.                                                           *
29
 ****************************************************************************/
30
31
/****************************************************************************
32
 *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
33
 *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
34
 *     and: Thomas E. Dickey 1998 on                                        *
35
 ****************************************************************************/
36
37
/*
38
 *	raw.c
39
 *
40
 *	Routines:
41
 *		raw()
42
 *		cbreak()
43
 *		noraw()
44
 *		nocbreak()
45
 *		qiflush()
46
 *		noqiflush()
47
 *		intrflush()
48
 *
49
 */
50
51
#include <curses.priv.h>
52
#include <term.h>		/* cur_term */
53
54
MODULE_ID("$Id: lib_raw.c,v 1.8 2010/01/12 23:22:06 nicm Exp $")
55
56
#if SVR4_TERMIO && !defined(_POSIX_SOURCE)
57
#define _POSIX_SOURCE
58
#endif
59
60
#if HAVE_SYS_TERMIO_H
61
#include <sys/termio.h>		/* needed for ISC */
62
#endif
63
64
#ifdef __EMX__
65
#include <io.h>
66
#define _nc_setmode(mode) setmode(SP->_ifd, mode)
67
#else
68
#define _nc_setmode(mode)	/* nothing */
69
#endif
70
71
#define COOKED_INPUT	(IXON|BRKINT|PARMRK)
72
73
#ifdef TRACE
74
#define BEFORE(N)	if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s before bits: %s", N, _nc_tracebits())
75
#define AFTER(N)	if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s after bits: %s", N, _nc_tracebits())
76
#else
77
#define BEFORE(s)
78
#define AFTER(s)
79
#endif /* TRACE */
80
81
NCURSES_EXPORT(int)
82
raw(void)
83
{
84
    int result = ERR;
85
86
    T((T_CALLED("raw()")));
87
88
    if (SP != 0 && cur_term != 0) {
89
	TTY buf;
90
91
	BEFORE("raw");
92
	_nc_setmode(O_BINARY);
93
94
	buf = cur_term->Nttyb;
95
#ifdef TERMIOS
96
	buf.c_lflag &= ~(ICANON | ISIG | IEXTEN);
97
	buf.c_iflag &= ~(COOKED_INPUT);
98
	buf.c_cc[VMIN] = 1;
99
	buf.c_cc[VTIME] = 0;
100
#else
101
	buf.sg_flags |= RAW;
102
#endif
103
	if ((result = _nc_set_tty_mode(&buf)) == OK) {
104
	    SP->_raw = TRUE;
105
	    SP->_cbreak = 1;
106
	    cur_term->Nttyb = buf;
107
	}
108
	AFTER("raw");
109
    }
110
    returnCode(result);
111
}
112
113
NCURSES_EXPORT(int)
114
cbreak(void)
115
{
116
    int result = ERR;
117
118
    T((T_CALLED("cbreak()")));
119
120
    if (SP != 0 && cur_term != 0) {
121
	TTY buf;
122
123
	BEFORE("cbreak");
124
	_nc_setmode(O_BINARY);
125
126
	buf = cur_term->Nttyb;
127
#ifdef TERMIOS
128
	buf.c_lflag &= ~ICANON;
129
	buf.c_iflag &= ~ICRNL;
130
	buf.c_lflag |= ISIG;
131
	buf.c_cc[VMIN] = 1;
132
	buf.c_cc[VTIME] = 0;
133
#else
134
	buf.sg_flags |= CBREAK;
135
#endif
136
	if ((result = _nc_set_tty_mode(&buf)) == OK) {
137
	    SP->_cbreak = 1;
138
	    cur_term->Nttyb = buf;
139
	}
140
	AFTER("cbreak");
141
    }
142
    returnCode(result);
143
}
144
145
/*
146
 * Note:
147
 * this implementation may be wrong.  See the comment under intrflush().
148
 */
149
NCURSES_EXPORT(void)
150
qiflush(void)
151
{
152
    int result = ERR;
153
154
    T((T_CALLED("qiflush()")));
155
156
    if (cur_term != 0) {
157
	TTY buf;
158
159
	BEFORE("qiflush");
160
	buf = cur_term->Nttyb;
161
#ifdef TERMIOS
162
	buf.c_lflag &= ~(NOFLSH);
163
	result = _nc_set_tty_mode(&buf);
164
#else
165
	/* FIXME */
166
#endif
167
	if (result == OK)
168
	    cur_term->Nttyb = buf;
169
	AFTER("qiflush");
170
    }
171
    returnVoid;
172
}
173
174
NCURSES_EXPORT(int)
175
noraw(void)
176
{
177
    int result = ERR;
178
179
    T((T_CALLED("noraw()")));
180
181
    if (SP != 0 && cur_term != 0) {
182
	TTY buf;
183
184
	BEFORE("noraw");
185
	_nc_setmode(O_TEXT);
186
187
	buf = cur_term->Nttyb;
188
#ifdef TERMIOS
189
	buf.c_lflag |= ISIG | ICANON |
190
	    (cur_term->Ottyb.c_lflag & IEXTEN);
191
	buf.c_iflag |= COOKED_INPUT;
192
#else
193
	buf.sg_flags &= ~(RAW | CBREAK);
194
#endif
195
	if ((result = _nc_set_tty_mode(&buf)) == OK) {
196
	    SP->_raw = FALSE;
197
	    SP->_cbreak = 0;
198
	    cur_term->Nttyb = buf;
199
	}
200
	AFTER("noraw");
201
    }
202
    returnCode(result);
203
}
204
205
NCURSES_EXPORT(int)
206
nocbreak(void)
207
{
208
    int result = ERR;
209
210
    T((T_CALLED("nocbreak()")));
211
212
    if (SP != 0 && cur_term != 0) {
213
	TTY buf;
214
215
	BEFORE("nocbreak");
216
	_nc_setmode(O_TEXT);
217
218
	buf = cur_term->Nttyb;
219
#ifdef TERMIOS
220
	buf.c_lflag |= ICANON;
221
	buf.c_iflag |= ICRNL;
222
#else
223
	buf.sg_flags &= ~CBREAK;
224
#endif
225
	if ((result = _nc_set_tty_mode(&buf)) == OK) {
226
	    SP->_cbreak = 0;
227
	    cur_term->Nttyb = buf;
228
	}
229
	AFTER("nocbreak");
230
    }
231
    returnCode(result);
232
}
233
234
/*
235
 * Note:
236
 * this implementation may be wrong.  See the comment under intrflush().
237
 */
238
NCURSES_EXPORT(void)
239
noqiflush(void)
240
{
241
    int result = ERR;
242
243
    T((T_CALLED("noqiflush()")));
244
245
    if (cur_term != 0) {
246
	TTY buf;
247
248
	BEFORE("noqiflush");
249
	buf = cur_term->Nttyb;
250
#ifdef TERMIOS
251
	buf.c_lflag |= NOFLSH;
252
	result = _nc_set_tty_mode(&buf);
253
#else
254
	/* FIXME */
255
#endif
256
	if (result == OK) {
257
	    cur_term->Nttyb = buf;
258
	}
259
	AFTER("noqiflush");
260
    }
261
    returnVoid;
262
}
263
264
/*
265
 * This call does the same thing as the qiflush()/noqiflush() pair.  We know
266
 * for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the other hand,
267
 * the match (in the SVr4 man pages) between the language describing NOFLSH in
268
 * termio(7) and the language describing qiflush()/noqiflush() in
269
 * curs_inopts(3x) is too exact to be coincidence.
270
 */
271
NCURSES_EXPORT(int)
272
intrflush(WINDOW *win GCC_UNUSED, bool flag)
273
{
274
    int result = ERR;
275
276
    T((T_CALLED("intrflush(%d)"), flag));
277
278
    if (cur_term != 0) {
279
	TTY buf;
280
281
	BEFORE("intrflush");
282
	buf = cur_term->Nttyb;
283
#ifdef TERMIOS
284
	if (flag)
285
	    buf.c_lflag &= ~(NOFLSH);
286
	else
287
	    buf.c_lflag |= (NOFLSH);
288
	result = _nc_set_tty_mode(&buf);
289
#else
290
	/* FIXME */
291
#endif
292
	if (result == OK) {
293
	    cur_term->Nttyb = buf;
294
	}
295
	AFTER("intrflush");
296
    }
297
    returnCode(result);
298
}