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