150276Speter/**************************************************************************** 2178866Srafan * Copyright (c) 1998-2007,2008 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 * and: Thomas E. Dickey 1996-on * 3350276Speter ****************************************************************************/ 3450276Speter 3550276Speter#include <curses.priv.h> 3650276Speter#include <term.h> /* cur_term */ 3750276Speter 3850276SpeterMODULE_ID("$Id: lib_tracebits.c,v 1.17 2008/08/03 16:09:26 tom Exp $") 3976726Speter 4050276Speter#if SVR4_TERMIO && !defined(_POSIX_SOURCE) 41184989Srafan#define _POSIX_SOURCE 4250276Speter#endif 4376726Speter 4476726Speter#if HAVE_SYS_TERMIO_H 4550276Speter#include <sys/termio.h> /* needed for ISC */ 46166124Srafan#endif 47166124Srafan 48174993Srafan#ifdef __EMX__ 49166124Srafan#include <io.h> 50166124Srafan#endif 51174993Srafan 52174993Srafan/* may be undefined if we're using termio.h */ 53174993Srafan#ifndef TOSTOP 54174993Srafan#define TOSTOP 0 55174993Srafan#endif 56174993Srafan 57174993Srafan#ifndef IEXTEN 58174993Srafan#define IEXTEN 0 59174993Srafan#endif 60174993Srafan 61166124Srafan#ifndef ONLCR 62166124Srafan#define ONLCR 0 63166124Srafan#endif 64174993Srafan 65174993Srafan#ifndef OCRNL 66166124Srafan#define OCRNL 0 67174993Srafan#endif 68184989Srafan 69184989Srafan#ifndef ONOCR 70174993Srafan#define ONOCR 0 71166124Srafan#endif 7250276Speter 7350276Speter#ifndef ONLRET 7476726Speter#define ONLRET 0 7576726Speter#endif 7650276Speter 77166124Srafan#ifdef TRACE 78166124Srafan 79174993Srafantypedef struct { 80166124Srafan unsigned int val; 81166124Srafan const char *name; 82174993Srafan} BITNAMES; 83174993Srafan 84174993Srafanstatic void 85174993Srafanlookup_bits(char *buf, const BITNAMES * table, const char *label, unsigned int val) 86174993Srafan{ 87174993Srafan const BITNAMES *sp; 88174993Srafan 89174993Srafan (void) strcat(buf, label); 90174993Srafan (void) strcat(buf, ": {"); 91174993Srafan for (sp = table; sp->name; sp++) 92174993Srafan if (sp->val != 0 93174993Srafan && (val & sp->val) == sp->val) { 94166124Srafan (void) strcat(buf, sp->name); 95166124Srafan (void) strcat(buf, ", "); 96174993Srafan } 97184989Srafan if (buf[strlen(buf) - 2] == ',') 98184989Srafan buf[strlen(buf) - 2] = '\0'; 99166124Srafan (void) strcat(buf, "} "); 100166124Srafan} 10150276Speter 10250276SpeterNCURSES_EXPORT(char *) 10376726Speter_nc_trace_ttymode(TTY * tty) 10476726Speter/* describe the state of the terminal control bits exactly */ 10550276Speter{ 106184989Srafan char *buf; 107184989Srafan 10876726Speter#ifdef TERMIOS 10950276Speter static const BITNAMES iflags[] = 110184989Srafan { 111184989Srafan {BRKINT, "BRKINT"}, 112184989Srafan {IGNBRK, "IGNBRK"}, 113184989Srafan {IGNPAR, "IGNPAR"}, 114184989Srafan {PARMRK, "PARMRK"}, 11550276Speter {INPCK, "INPCK"}, 116184989Srafan {ISTRIP, "ISTRIP"}, 117184989Srafan {INLCR, "INLCR"}, 11850276Speter {IGNCR, "IGNC"}, 119184989Srafan {ICRNL, "ICRNL"}, 120184989Srafan {IXON, "IXON"}, 12150276Speter {IXOFF, "IXOFF"}, 122184989Srafan {0, NULL} 123184989Srafan#define ALLIN (BRKINT|IGNBRK|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF) 124184989Srafan }, oflags[] = 125184989Srafan { 12650276Speter {OPOST, "OPOST"}, 12750276Speter {OFLAGS_TABS, "XTABS"}, 12876726Speter {ONLCR, "ONLCR"}, 12976726Speter {OCRNL, "OCRNL"}, 13050276Speter {ONOCR, "ONOCR"}, 131184989Srafan {ONLRET, "ONLRET"}, 132184989Srafan {0, NULL} 13376726Speter#define ALLOUT (OPOST|OFLAGS_TABS|ONLCR|OCRNL|ONOCR|ONLRET) 13450276Speter }, cflags[] = 135184989Srafan { 136184989Srafan {CLOCAL, "CLOCAL"}, 137184989Srafan {CREAD, "CREAD"}, 138184989Srafan {CSTOPB, "CSTOPB"}, 139184989Srafan#if !defined(CS5) || !defined(CS8) 14050276Speter {CSIZE, "CSIZE"}, 141184989Srafan#endif 14250276Speter {HUPCL, "HUPCL"}, 143184989Srafan {PARENB, "PARENB"}, 14450276Speter {PARODD | PARENB, "PARODD"}, /* concession to readability */ 145184989Srafan {0, NULL} 146184989Srafan#define ALLCTRL (CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD) 147184989Srafan }, lflags[] = 148184989Srafan { 14950276Speter {ECHO, "ECHO"}, 15050276Speter {ECHOE | ECHO, "ECHOE"}, /* concession to readability */ 15176726Speter {ECHOK | ECHO, "ECHOK"}, /* concession to readability */ 15276726Speter {ECHONL, "ECHONL"}, 15350276Speter {ICANON, "ICANON"}, 15476726Speter {ISIG, "ISIG"}, 15550276Speter {NOFLSH, "NOFLSH"}, 15676726Speter {TOSTOP, "TOSTOP"}, 157166124Srafan {IEXTEN, "IEXTEN"}, 158166124Srafan {0, NULL} 159166124Srafan#define ALLLOCAL (ECHO|ECHONL|ICANON|ISIG|NOFLSH|TOSTOP|IEXTEN) 160178866Srafan }; 161166124Srafan 162166124Srafan buf = _nc_trace_buf(0, 163166124Srafan 8 + sizeof(iflags) + 16450276Speter 8 + sizeof(oflags) + 16576726Speter 8 + sizeof(cflags) + 16676726Speter 8 + sizeof(lflags) + 16750276Speter 8); 16850276Speter if (buf != 0) { 16976726Speter 17076726Speter if (tty->c_iflag & ALLIN) 17150276Speter lookup_bits(buf, iflags, "iflags", tty->c_iflag); 17276726Speter 17350276Speter if (tty->c_oflag & ALLOUT) 17476726Speter lookup_bits(buf, oflags, "oflags", tty->c_oflag); 17576726Speter 176178866Srafan if (tty->c_cflag & ALLCTRL) 17776726Speter lookup_bits(buf, cflags, "cflags", tty->c_cflag); 17876726Speter 17950276Speter#if defined(CS5) && defined(CS8) 18076726Speter { 18176726Speter static struct { 18276726Speter int value; 18350276Speter const char *name; 18450276Speter } csizes[] = { 185174993Srafan#define CS_DATA(name) { name, #name " " } 186174993Srafan CS_DATA(CS5), 187174993Srafan#ifdef CS6 188174993Srafan CS_DATA(CS6), 189174993Srafan#endif 190174993Srafan#ifdef CS7 191174993Srafan CS_DATA(CS7), 192174993Srafan#endif 193174993Srafan CS_DATA(CS8), 194174993Srafan }; 195174993Srafan const char *result = "CSIZE? "; 196174993Srafan int value = (tty->c_cflag & CSIZE); 197174993Srafan unsigned n; 198174993Srafan 199174993Srafan if (value != 0) { 200174993Srafan for (n = 0; n < SIZEOF(csizes); n++) { 20150276Speter if (csizes[n].value == value) { 20250276Speter result = csizes[n].name; 20350276Speter break; 20450276Speter } 20550276Speter } 20676726Speter } 20776726Speter strcat(buf, result); 20850276Speter } 20976726Speter#endif 21050276Speter 211174993Srafan if (tty->c_lflag & ALLLOCAL) 21250276Speter lookup_bits(buf, lflags, "lflags", tty->c_lflag); 21350276Speter } 21476726Speter#else 21576726Speter /* reference: ttcompat(4M) on SunOS 4.1 */ 21650276Speter#ifndef EVENP 21776726Speter#define EVENP 0 21850276Speter#endif 219174993Srafan#ifndef LCASE 22050276Speter#define LCASE 0 221#endif 222#ifndef LLITOUT 223#define LLITOUT 0 224#endif 225#ifndef ODDP 226#define ODDP 0 227#endif 228#ifndef TANDEM 229#define TANDEM 0 230#endif 231 232 static const BITNAMES cflags[] = 233 { 234 {CBREAK, "CBREAK"}, 235 {CRMOD, "CRMOD"}, 236 {ECHO, "ECHO"}, 237 {EVENP, "EVENP"}, 238 {LCASE, "LCASE"}, 239 {LLITOUT, "LLITOUT"}, 240 {ODDP, "ODDP"}, 241 {RAW, "RAW"}, 242 {TANDEM, "TANDEM"}, 243 {XTABS, "XTABS"}, 244 {0, NULL} 245#define ALLCTRL (CBREAK|CRMOD|ECHO|EVENP|LCASE|LLITOUT|ODDP|RAW|TANDEM|XTABS) 246 }; 247 248 buf = _nc_trace_buf(0, 249 8 + sizeof(cflags)); 250 if (buf != 0) { 251 if (tty->sg_flags & ALLCTRL) { 252 lookup_bits(buf, cflags, "cflags", tty->sg_flags); 253 } 254 } 255#endif 256 return (buf); 257} 258 259NCURSES_EXPORT(char *) 260_nc_tracebits(void) 261{ 262 return _nc_trace_ttymode(&(cur_term->Nttyb)); 263} 264#else 265EMPTY_MODULE(_nc_tracebits) 266#endif /* TRACE */ 267