lib_tracebits.c revision 98503
150276Speter/****************************************************************************
298503Speter * Copyright (c) 1998-2001,2002 Free Software Foundation, Inc.              *
350276Speter *                                                                          *
450276Speter * Permission is hereby granted, free of charge, to any person obtaining a  *
550276Speter * copy of this software and associated documentation files (the            *
650276Speter * "Software"), to deal in the Software without restriction, including      *
750276Speter * without limitation the rights to use, copy, modify, merge, publish,      *
850276Speter * distribute, distribute with modifications, sublicense, and/or sell       *
950276Speter * copies of the Software, and to permit persons to whom the Software is    *
1050276Speter * furnished to do so, subject to the following conditions:                 *
1150276Speter *                                                                          *
1250276Speter * The above copyright notice and this permission notice shall be included  *
1350276Speter * in all copies or substantial portions of the Software.                   *
1450276Speter *                                                                          *
1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2250276Speter *                                                                          *
2350276Speter * Except as contained in this notice, the name(s) of the above copyright   *
2450276Speter * holders shall not be used in advertising or otherwise to promote the     *
2550276Speter * sale, use or other dealings in this Software without prior written       *
2650276Speter * authorization.                                                           *
2750276Speter ****************************************************************************/
2850276Speter
2950276Speter/****************************************************************************
3050276Speter *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
3150276Speter *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
3250276Speter ****************************************************************************/
3350276Speter
3450276Speter#include <curses.priv.h>
3562449Speter#include <term.h>		/* cur_term */
3650276Speter
3798503SpeterMODULE_ID("$Id: lib_tracebits.c,v 1.12 2002/05/25 14:35:07 tom Exp $")
3850276Speter
3966963Speter#if SVR4_TERMIO && !defined(_POSIX_SOURCE)
4050276Speter#define _POSIX_SOURCE
4150276Speter#endif
4250276Speter
4350276Speter#if HAVE_SYS_TERMIO_H
4462449Speter#include <sys/termio.h>		/* needed for ISC */
4550276Speter#endif
4650276Speter
4750276Speter#ifdef __EMX__
4850276Speter#include <io.h>
4950276Speter#endif
5050276Speter
5150276Speter/* may be undefined if we're using termio.h */
5250276Speter#ifndef TOSTOP
5350276Speter#define TOSTOP 0
5450276Speter#endif
5550276Speter#ifndef IEXTEN
5650276Speter#define IEXTEN 0
5750276Speter#endif
5850276Speter
5950276Speter#ifdef TRACE
6050276Speter
6162449Spetertypedef struct {
6262449Speter    unsigned int val;
6362449Speter    const char *name;
6462449Speter} BITNAMES;
6550276Speter
6662449Speterstatic void
6762449Speterlookup_bits(char *buf, const BITNAMES * table, const char *label, unsigned int val)
6850276Speter{
6962449Speter    const BITNAMES *sp;
7050276Speter
7162449Speter    (void) strcat(buf, label);
7262449Speter    (void) strcat(buf, ": {");
7362449Speter    for (sp = table; sp->name; sp++)
7462449Speter	if (sp->val != 0
7562449Speter	    && (val & sp->val) == sp->val) {
7662449Speter	    (void) strcat(buf, sp->name);
7762449Speter	    (void) strcat(buf, ", ");
7862449Speter	}
7962449Speter    if (buf[strlen(buf) - 2] == ',')
8062449Speter	buf[strlen(buf) - 2] = '\0';
8162449Speter    (void) strcat(buf, "} ");
8250276Speter}
8350276Speter
8476726SpeterNCURSES_EXPORT(char *)
8598503Speter_nc_trace_ttymode(TTY * tty)
8650276Speter/* describe the state of the terminal control bits exactly */
8750276Speter{
8862449Speter    char *buf;
8950276Speter
9050276Speter#ifdef TERMIOS
9162449Speter    static const BITNAMES iflags[] =
9250276Speter    {
9362449Speter	{BRKINT, "BRKINT"},
9462449Speter	{IGNBRK, "IGNBRK"},
9562449Speter	{IGNPAR, "IGNPAR"},
9662449Speter	{PARMRK, "PARMRK"},
9762449Speter	{INPCK, "INPCK"},
9862449Speter	{ISTRIP, "ISTRIP"},
9962449Speter	{INLCR, "INLCR"},
10062449Speter	{IGNCR, "IGNC"},
10162449Speter	{ICRNL, "ICRNL"},
10262449Speter	{IXON, "IXON"},
10362449Speter	{IXOFF, "IXOFF"},
10462449Speter	{0, NULL}
10550276Speter#define ALLIN	(BRKINT|IGNBRK|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF)
10662449Speter    }, oflags[] =
10750276Speter    {
10862449Speter	{OPOST, "OPOST"},
10962449Speter	{0, NULL}
11050276Speter#define ALLOUT	(OPOST)
11162449Speter    }, cflags[] =
11250276Speter    {
11362449Speter	{CLOCAL, "CLOCAL"},
11462449Speter	{CREAD, "CREAD"},
11562449Speter	{CSTOPB, "CSTOPB"},
11650276Speter#if !defined(CS5) || !defined(CS8)
11762449Speter	{CSIZE, "CSIZE"},
11850276Speter#endif
11962449Speter	{HUPCL, "HUPCL"},
12062449Speter	{PARENB, "PARENB"},
12162449Speter	{PARODD | PARENB, "PARODD"},	/* concession to readability */
12262449Speter	{0, NULL}
12350276Speter#define ALLCTRL	(CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD)
12462449Speter    }, lflags[] =
12550276Speter    {
12662449Speter	{ECHO, "ECHO"},
12762449Speter	{ECHOE | ECHO, "ECHOE"},	/* concession to readability */
12862449Speter	{ECHOK | ECHO, "ECHOK"},	/* concession to readability */
12962449Speter	{ECHONL, "ECHONL"},
13062449Speter	{ICANON, "ICANON"},
13162449Speter	{ISIG, "ISIG"},
13262449Speter	{NOFLSH, "NOFLSH"},
13362449Speter	{TOSTOP, "TOSTOP"},
13462449Speter	{IEXTEN, "IEXTEN"},
13562449Speter	{0, NULL}
13650276Speter#define ALLLOCAL	(ECHO|ECHONL|ICANON|ISIG|NOFLSH|TOSTOP|IEXTEN)
13750276Speter    };
13850276Speter
13950276Speter    buf = _nc_trace_buf(0,
14076726Speter			8 + sizeof(iflags) +
14176726Speter			8 + sizeof(oflags) +
14276726Speter			8 + sizeof(cflags) +
14376726Speter			8 + sizeof(lflags) +
14476726Speter			8);
14550276Speter
14698503Speter    if (tty->c_iflag & ALLIN)
14798503Speter	lookup_bits(buf, iflags, "iflags", tty->c_iflag);
14850276Speter
14998503Speter    if (tty->c_oflag & ALLOUT)
15098503Speter	lookup_bits(buf, oflags, "oflags", tty->c_oflag);
15150276Speter
15298503Speter    if (tty->c_cflag & ALLCTRL)
15398503Speter	lookup_bits(buf, cflags, "cflags", tty->c_cflag);
15450276Speter
15550276Speter#if defined(CS5) && defined(CS8)
15666963Speter    {
15766963Speter	static struct {
15876726Speter	    const char *name;
15966963Speter	    int value;
16066963Speter	} csizes[] = {
16166963Speter	    {
16266963Speter		"CS5 ", CS5
16366963Speter	    },
16466963Speter#ifdef CS6
16566963Speter	    {
16666963Speter		"CS6 ", CS6
16766963Speter	    },
16850276Speter#endif
16966963Speter#ifdef CS7
17066963Speter	    {
17166963Speter		"CS7 ", CS7
17266963Speter	    },
17350276Speter#endif
17466963Speter	    {
17566963Speter		"CS8 ", CS8
17666963Speter	    },
17766963Speter	};
17876726Speter	const char *result = "CSIZE? ";
17998503Speter	int value = (tty->c_cflag & CSIZE);
18066963Speter	unsigned n;
18166963Speter
18266963Speter	if (value != 0) {
18366963Speter	    for (n = 0; n < SIZEOF(csizes); n++) {
18466963Speter		if (csizes[n].value == value) {
18566963Speter		    result = csizes[n].name;
18666963Speter		    break;
18766963Speter		}
18866963Speter	    }
18966963Speter	}
19066963Speter	strcat(buf, result);
19150276Speter    }
19250276Speter#endif
19350276Speter
19498503Speter    if (tty->c_lflag & ALLLOCAL)
19598503Speter	lookup_bits(buf, lflags, "lflags", tty->c_lflag);
19650276Speter
19750276Speter#else
19850276Speter    /* reference: ttcompat(4M) on SunOS 4.1 */
19950276Speter#ifndef EVENP
20050276Speter#define EVENP 0
20150276Speter#endif
20250276Speter#ifndef LCASE
20350276Speter#define LCASE 0
20450276Speter#endif
20550276Speter#ifndef LLITOUT
20650276Speter#define LLITOUT 0
20750276Speter#endif
20850276Speter#ifndef ODDP
20950276Speter#define ODDP 0
21050276Speter#endif
21150276Speter#ifndef TANDEM
21250276Speter#define TANDEM 0
21350276Speter#endif
21450276Speter
21562449Speter    static const BITNAMES cflags[] =
21650276Speter    {
21762449Speter	{CBREAK, "CBREAK"},
21862449Speter	{CRMOD, "CRMOD"},
21962449Speter	{ECHO, "ECHO"},
22062449Speter	{EVENP, "EVENP"},
22162449Speter	{LCASE, "LCASE"},
22262449Speter	{LLITOUT, "LLITOUT"},
22362449Speter	{ODDP, "ODDP"},
22462449Speter	{RAW, "RAW"},
22562449Speter	{TANDEM, "TANDEM"},
22662449Speter	{XTABS, "XTABS"},
22762449Speter	{0, NULL}
22850276Speter#define ALLCTRL	(CBREAK|CRMOD|ECHO|EVENP|LCASE|LLITOUT|ODDP|RAW|TANDEM|XTABS)
22950276Speter    };
23050276Speter
23150276Speter    buf = _nc_trace_buf(0,
23276726Speter			8 + sizeof(cflags));
23350276Speter
23498503Speter    if (tty->sg_flags & ALLCTRL) {
23598503Speter	lookup_bits(buf, cflags, "cflags", tty->sg_flags);
23650276Speter    }
23750276Speter#endif
23862449Speter    return (buf);
23950276Speter}
24098503Speter
24198503SpeterNCURSES_EXPORT(char *)
24298503Speter_nc_tracebits(void)
24398503Speter{
24498503Speter    return _nc_trace_ttymode(&(cur_term->Nttyb));
24598503Speter}
24650276Speter#else
24797049Speterempty_module(_nc_tracebits)
24850276Speter#endif /* TRACE */
249