150276Speter/**************************************************************************** 2262685Sdelphij * Copyright (c) 1998-2011,2012 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> * 32166124Srafan * and: Thomas E. Dickey 1996-on * 3350276Speter ****************************************************************************/ 3450276Speter 3550276Speter#include <curses.priv.h> 3650276Speter 37262685SdelphijMODULE_ID("$Id: lib_tracebits.c,v 1.23 2012/06/09 19:55:46 tom Exp $") 3850276Speter 3950276Speter#if HAVE_SYS_TERMIO_H 4062449Speter#include <sys/termio.h> /* needed for ISC */ 4150276Speter#endif 4250276Speter 4350276Speter#ifdef __EMX__ 4450276Speter#include <io.h> 4550276Speter#endif 4650276Speter 4750276Speter/* may be undefined if we're using termio.h */ 4850276Speter#ifndef TOSTOP 4950276Speter#define TOSTOP 0 5050276Speter#endif 51174993Srafan 5250276Speter#ifndef IEXTEN 5350276Speter#define IEXTEN 0 5450276Speter#endif 5550276Speter 56174993Srafan#ifndef ONLCR 57174993Srafan#define ONLCR 0 58174993Srafan#endif 59174993Srafan 60174993Srafan#ifndef OCRNL 61174993Srafan#define OCRNL 0 62174993Srafan#endif 63174993Srafan 64174993Srafan#ifndef ONOCR 65174993Srafan#define ONOCR 0 66174993Srafan#endif 67174993Srafan 68174993Srafan#ifndef ONLRET 69174993Srafan#define ONLRET 0 70174993Srafan#endif 71174993Srafan 7250276Speter#ifdef TRACE 7350276Speter 7462449Spetertypedef struct { 7562449Speter unsigned int val; 7662449Speter const char *name; 7762449Speter} BITNAMES; 7850276Speter 79262685Sdelphij#define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size) 80262685Sdelphij 8162449Speterstatic void 8262449Speterlookup_bits(char *buf, const BITNAMES * table, const char *label, unsigned int val) 8350276Speter{ 8462449Speter const BITNAMES *sp; 8550276Speter 86262685Sdelphij _nc_STRCAT(buf, label, TRACE_BUF_SIZE(0)); 87262685Sdelphij _nc_STRCAT(buf, ": {", TRACE_BUF_SIZE(0)); 8862449Speter for (sp = table; sp->name; sp++) 8962449Speter if (sp->val != 0 9062449Speter && (val & sp->val) == sp->val) { 91262685Sdelphij _nc_STRCAT(buf, sp->name, TRACE_BUF_SIZE(0)); 92262685Sdelphij _nc_STRCAT(buf, ", ", TRACE_BUF_SIZE(0)); 9362449Speter } 9462449Speter if (buf[strlen(buf) - 2] == ',') 9562449Speter buf[strlen(buf) - 2] = '\0'; 96262685Sdelphij _nc_STRCAT(buf, "} ", TRACE_BUF_SIZE(0)); 9750276Speter} 9850276Speter 9976726SpeterNCURSES_EXPORT(char *) 10098503Speter_nc_trace_ttymode(TTY * tty) 10150276Speter/* describe the state of the terminal control bits exactly */ 10250276Speter{ 10362449Speter char *buf; 10450276Speter 10550276Speter#ifdef TERMIOS 10662449Speter static const BITNAMES iflags[] = 10750276Speter { 10862449Speter {BRKINT, "BRKINT"}, 10962449Speter {IGNBRK, "IGNBRK"}, 11062449Speter {IGNPAR, "IGNPAR"}, 11162449Speter {PARMRK, "PARMRK"}, 11262449Speter {INPCK, "INPCK"}, 11362449Speter {ISTRIP, "ISTRIP"}, 11462449Speter {INLCR, "INLCR"}, 11562449Speter {IGNCR, "IGNC"}, 11662449Speter {ICRNL, "ICRNL"}, 11762449Speter {IXON, "IXON"}, 11862449Speter {IXOFF, "IXOFF"}, 11962449Speter {0, NULL} 12050276Speter#define ALLIN (BRKINT|IGNBRK|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF) 12162449Speter }, oflags[] = 12250276Speter { 12362449Speter {OPOST, "OPOST"}, 124166124Srafan {OFLAGS_TABS, "XTABS"}, 125174993Srafan {ONLCR, "ONLCR"}, 126174993Srafan {OCRNL, "OCRNL"}, 127174993Srafan {ONOCR, "ONOCR"}, 128174993Srafan {ONLRET, "ONLRET"}, 12962449Speter {0, NULL} 130174993Srafan#define ALLOUT (OPOST|OFLAGS_TABS|ONLCR|OCRNL|ONOCR|ONLRET) 13162449Speter }, cflags[] = 13250276Speter { 13362449Speter {CLOCAL, "CLOCAL"}, 13462449Speter {CREAD, "CREAD"}, 13562449Speter {CSTOPB, "CSTOPB"}, 13650276Speter#if !defined(CS5) || !defined(CS8) 13762449Speter {CSIZE, "CSIZE"}, 13850276Speter#endif 13962449Speter {HUPCL, "HUPCL"}, 14062449Speter {PARENB, "PARENB"}, 14162449Speter {PARODD | PARENB, "PARODD"}, /* concession to readability */ 14262449Speter {0, NULL} 14350276Speter#define ALLCTRL (CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD) 14462449Speter }, lflags[] = 14550276Speter { 14662449Speter {ECHO, "ECHO"}, 14762449Speter {ECHOE | ECHO, "ECHOE"}, /* concession to readability */ 14862449Speter {ECHOK | ECHO, "ECHOK"}, /* concession to readability */ 14962449Speter {ECHONL, "ECHONL"}, 15062449Speter {ICANON, "ICANON"}, 15162449Speter {ISIG, "ISIG"}, 15262449Speter {NOFLSH, "NOFLSH"}, 15362449Speter {TOSTOP, "TOSTOP"}, 15462449Speter {IEXTEN, "IEXTEN"}, 15562449Speter {0, NULL} 15650276Speter#define ALLLOCAL (ECHO|ECHONL|ICANON|ISIG|NOFLSH|TOSTOP|IEXTEN) 15750276Speter }; 15850276Speter 15950276Speter buf = _nc_trace_buf(0, 16076726Speter 8 + sizeof(iflags) + 16176726Speter 8 + sizeof(oflags) + 16276726Speter 8 + sizeof(cflags) + 16376726Speter 8 + sizeof(lflags) + 16476726Speter 8); 165184989Srafan if (buf != 0) { 16650276Speter 167184989Srafan if (tty->c_iflag & ALLIN) 168184989Srafan lookup_bits(buf, iflags, "iflags", tty->c_iflag); 16950276Speter 170184989Srafan if (tty->c_oflag & ALLOUT) 171184989Srafan lookup_bits(buf, oflags, "oflags", tty->c_oflag); 17250276Speter 173184989Srafan if (tty->c_cflag & ALLCTRL) 174184989Srafan lookup_bits(buf, cflags, "cflags", tty->c_cflag); 17550276Speter 17650276Speter#if defined(CS5) && defined(CS8) 177184989Srafan { 178184989Srafan static struct { 179184989Srafan int value; 180184989Srafan const char *name; 181184989Srafan } csizes[] = { 182184989Srafan#define CS_DATA(name) { name, #name " " } 183184989Srafan CS_DATA(CS5), 18466963Speter#ifdef CS6 185184989Srafan CS_DATA(CS6), 18650276Speter#endif 18766963Speter#ifdef CS7 188184989Srafan CS_DATA(CS7), 18950276Speter#endif 190184989Srafan CS_DATA(CS8), 191184989Srafan }; 192184989Srafan const char *result = "CSIZE? "; 193262685Sdelphij int value = (int) (tty->c_cflag & CSIZE); 194184989Srafan unsigned n; 19566963Speter 196184989Srafan if (value != 0) { 197184989Srafan for (n = 0; n < SIZEOF(csizes); n++) { 198184989Srafan if (csizes[n].value == value) { 199184989Srafan result = csizes[n].name; 200184989Srafan break; 201184989Srafan } 20266963Speter } 20366963Speter } 204262685Sdelphij _nc_STRCAT(buf, result, TRACE_BUF_SIZE(0)); 20566963Speter } 20650276Speter#endif 20750276Speter 208184989Srafan if (tty->c_lflag & ALLLOCAL) 209184989Srafan lookup_bits(buf, lflags, "lflags", tty->c_lflag); 210184989Srafan } 21150276Speter#else 21250276Speter /* reference: ttcompat(4M) on SunOS 4.1 */ 21350276Speter#ifndef EVENP 21450276Speter#define EVENP 0 21550276Speter#endif 21650276Speter#ifndef LCASE 21750276Speter#define LCASE 0 21850276Speter#endif 21950276Speter#ifndef LLITOUT 22050276Speter#define LLITOUT 0 22150276Speter#endif 22250276Speter#ifndef ODDP 22350276Speter#define ODDP 0 22450276Speter#endif 22550276Speter#ifndef TANDEM 22650276Speter#define TANDEM 0 22750276Speter#endif 22850276Speter 22962449Speter static const BITNAMES cflags[] = 23050276Speter { 23162449Speter {CBREAK, "CBREAK"}, 23262449Speter {CRMOD, "CRMOD"}, 23362449Speter {ECHO, "ECHO"}, 23462449Speter {EVENP, "EVENP"}, 23562449Speter {LCASE, "LCASE"}, 23662449Speter {LLITOUT, "LLITOUT"}, 23762449Speter {ODDP, "ODDP"}, 23862449Speter {RAW, "RAW"}, 23962449Speter {TANDEM, "TANDEM"}, 24062449Speter {XTABS, "XTABS"}, 24162449Speter {0, NULL} 24250276Speter#define ALLCTRL (CBREAK|CRMOD|ECHO|EVENP|LCASE|LLITOUT|ODDP|RAW|TANDEM|XTABS) 24350276Speter }; 24450276Speter 24550276Speter buf = _nc_trace_buf(0, 24676726Speter 8 + sizeof(cflags)); 247184989Srafan if (buf != 0) { 248184989Srafan if (tty->sg_flags & ALLCTRL) { 249184989Srafan lookup_bits(buf, cflags, "cflags", tty->sg_flags); 250184989Srafan } 25150276Speter } 25250276Speter#endif 25362449Speter return (buf); 25450276Speter} 25598503Speter 25698503SpeterNCURSES_EXPORT(char *) 25798503Speter_nc_tracebits(void) 25898503Speter{ 25998503Speter return _nc_trace_ttymode(&(cur_term->Nttyb)); 26098503Speter} 26150276Speter#else 262262629SdelphijEMPTY_MODULE(_nc_empty_lib_tracebits) 26350276Speter#endif /* TRACE */ 264