X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftrace%2Flib_tracebits.c;h=a760d13502b5c0729ef40008e84ccb6872dc1a49;hp=a92e00a8624e4341e752616d12777f01aed3a24f;hb=e5d1530ca229aef94a3c84ad33f8ae89f35c4045;hpb=0eb88fc5281804773e2a0c7a488a4452463535ce diff --git a/ncurses/trace/lib_tracebits.c b/ncurses/trace/lib_tracebits.c index a92e00a8..a760d135 100644 --- a/ncurses/trace/lib_tracebits.c +++ b/ncurses/trace/lib_tracebits.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998 Free Software Foundation, Inc. * + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2012,2015 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -29,152 +30,224 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * ****************************************************************************/ #include -#include /* cur_term */ -MODULE_ID("$Id: lib_tracebits.c,v 1.3 1999/08/21 21:43:48 tom Exp $") - -#if defined(SVR4_TERMIO) && !defined(_POSIX_SOURCE) -#define _POSIX_SOURCE -#endif +MODULE_ID("$Id: lib_tracebits.c,v 1.30 2020/09/05 22:54:47 tom Exp $") #if HAVE_SYS_TERMIO_H -#include /* needed for ISC */ +#include /* needed for ISC */ #endif #ifdef __EMX__ #include -#include #endif /* may be undefined if we're using termio.h */ #ifndef TOSTOP #define TOSTOP 0 #endif + #ifndef IEXTEN #define IEXTEN 0 #endif +#ifndef ONLCR +#define ONLCR 0 +#endif + +#ifndef OCRNL +#define OCRNL 0 +#endif + +#ifndef ONOCR +#define ONOCR 0 +#endif + +#ifndef ONLRET +#define ONLRET 0 +#endif + #ifdef TRACE -typedef struct {unsigned int val; const char *name;} BITNAMES; +#if defined(EXP_WIN32_DRIVER) +#define BITNAMELEN 36 +#else +#define BITNAMELEN 8 +#endif + +typedef struct { + unsigned int val; + const char name[BITNAMELEN]; +} BITNAMES; -static void lookup_bits(char *buf, const BITNAMES *table, const char *label, unsigned int val) +#define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size) + +static void +lookup_bits(char *buf, const BITNAMES * table, const char *label, unsigned int val) { - const BITNAMES *sp; - - (void) strcat(buf, label); - (void) strcat(buf, ": {"); - for (sp = table; sp->name; sp++) - if (sp->val != 0 - && (val & sp->val) == sp->val) - { - (void) strcat(buf, sp->name); - (void) strcat(buf, ", "); - } - if (buf[strlen(buf) - 2] == ',') - buf[strlen(buf) - 2] = '\0'; - (void) strcat(buf,"} "); + const BITNAMES *sp; + + _nc_STRCAT(buf, label, TRACE_BUF_SIZE(0)); + _nc_STRCAT(buf, ": {", TRACE_BUF_SIZE(0)); + for (sp = table; sp->name[0]; sp++) + if (sp->val != 0 + && (val & sp->val) == sp->val) { + _nc_STRCAT(buf, sp->name, TRACE_BUF_SIZE(0)); + _nc_STRCAT(buf, ", ", TRACE_BUF_SIZE(0)); + } + if (buf[strlen(buf) - 2] == ',') + buf[strlen(buf) - 2] = '\0'; + _nc_STRCAT(buf, "} ", TRACE_BUF_SIZE(0)); } -char *_nc_tracebits(void) +NCURSES_EXPORT(char *) +_nc_trace_ttymode(TTY * tty) /* describe the state of the terminal control bits exactly */ { -char *buf; -static const BITNAMES + char *buf; #ifdef TERMIOS -iflags[] = +#define DATA(name) { name, { #name } } +#define DATA2(name,name2) { name, { #name2 } } +#define DATAX() { 0, { "" } } + static const BITNAMES iflags[] = { - {BRKINT, "BRKINT"}, - {IGNBRK, "IGNBRK"}, - {IGNPAR, "IGNPAR"}, - {PARMRK, "PARMRK"}, - {INPCK, "INPCK"}, - {ISTRIP, "ISTRIP"}, - {INLCR, "INLCR"}, - {IGNCR, "IGNC"}, - {ICRNL, "ICRNL"}, - {IXON, "IXON"}, - {IXOFF, "IXOFF"}, - {0, NULL} + DATA(BRKINT), + DATA(IGNBRK), + DATA(IGNPAR), + DATA(PARMRK), + DATA(INPCK), + DATA(ISTRIP), + DATA(INLCR), + DATA(IGNCR), + DATA(ICRNL), + DATA(IXON), + DATA(IXOFF), + DATAX() #define ALLIN (BRKINT|IGNBRK|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF) - }, -oflags[] = + }, oflags[] = { - {OPOST, "OPOST"}, - {0, NULL} -#define ALLOUT (OPOST) - }, -cflags[] = + DATA(OPOST), + DATA2(OFLAGS_TABS, XTABS), + DATA(ONLCR), + DATA(OCRNL), + DATA(ONOCR), + DATA(ONLRET), + DATAX() +#define ALLOUT (OPOST|OFLAGS_TABS|ONLCR|OCRNL|ONOCR|ONLRET|OFLAGS_TABS) + }, cflags[] = { - {CLOCAL, "CLOCAL"}, - {CREAD, "CREAD"}, - {CSTOPB, "CSTOPB"}, + DATA(CLOCAL), + DATA(CREAD), + DATA(CSTOPB), #if !defined(CS5) || !defined(CS8) - {CSIZE, "CSIZE"}, + DATA(CSIZE), #endif - {HUPCL, "HUPCL"}, - {PARENB, "PARENB"}, - {PARODD|PARENB, "PARODD"}, /* concession to readability */ - {0, NULL} + DATA(HUPCL), + DATA(PARENB), + DATA2(PARODD | PARENB, PARODD), + DATAX() #define ALLCTRL (CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD) - }, -lflags[] = + }, lflags[] = { - {ECHO, "ECHO"}, - {ECHOE|ECHO, "ECHOE"}, /* concession to readability */ - {ECHOK|ECHO, "ECHOK"}, /* concession to readability */ - {ECHONL, "ECHONL"}, - {ICANON, "ICANON"}, - {ISIG, "ISIG"}, - {NOFLSH, "NOFLSH"}, - {TOSTOP, "TOSTOP"}, - {IEXTEN, "IEXTEN"}, - {0, NULL} + DATA(ECHO), + DATA2(ECHOE | ECHO, ECHOE), + DATA2(ECHOK | ECHO, ECHOK), + DATA(ECHONL), + DATA(ICANON), + DATA(ISIG), + DATA(NOFLSH), + DATA(TOSTOP), + DATA(IEXTEN), + DATAX() #define ALLLOCAL (ECHO|ECHONL|ICANON|ISIG|NOFLSH|TOSTOP|IEXTEN) }; - buf = _nc_trace_buf(0, - 8 + sizeof(iflags) + - 8 + sizeof(oflags) + - 8 + sizeof(cflags) + - 8 + sizeof(lflags) + - 8); + 8 + sizeof(iflags) + + 8 + sizeof(oflags) + + 8 + sizeof(cflags) + + 8 + sizeof(lflags) + + 8); + if (buf != 0) { - if (cur_term->Nttyb.c_iflag & ALLIN) - lookup_bits(buf, iflags, "iflags", cur_term->Nttyb.c_iflag); + if (tty->c_iflag & ALLIN) + lookup_bits(buf, iflags, "iflags", tty->c_iflag); - if (cur_term->Nttyb.c_oflag & ALLOUT) - lookup_bits(buf, oflags, "oflags", cur_term->Nttyb.c_oflag); + if (tty->c_oflag & ALLOUT) + lookup_bits(buf, oflags, "oflags", tty->c_oflag); - if (cur_term->Nttyb.c_cflag & ALLCTRL) - lookup_bits(buf, cflags, "cflags", cur_term->Nttyb.c_cflag); + if (tty->c_cflag & ALLCTRL) + lookup_bits(buf, cflags, "cflags", tty->c_cflag); #if defined(CS5) && defined(CS8) - switch (cur_term->Nttyb.c_cflag & CSIZE) { -#if defined(CS5) && (CS5 != 0) - case CS5: strcat(buf, "CS5 "); break; + { + static const struct { + int value; + const char name[5]; + } csizes[] = { +#define CS_DATA(name) { name, { #name " " } } + CS_DATA(CS5), +#ifdef CS6 + CS_DATA(CS6), #endif -#if defined(CS6) && (CS6 != 0) - case CS6: strcat(buf, "CS6 "); break; +#ifdef CS7 + CS_DATA(CS7), #endif -#if defined(CS7) && (CS7 != 0) - case CS7: strcat(buf, "CS7 "); break; -#endif -#if defined(CS8) && (CS8 != 0) - case CS8: strcat(buf, "CS8 "); break; -#endif - default: strcat(buf, "CSIZE? "); break; - } + CS_DATA(CS8), + }; + const char *result = "CSIZE? "; + int value = (int) (tty->c_cflag & CSIZE); + unsigned n; + + if (value != 0) { + for (n = 0; n < SIZEOF(csizes); n++) { + if (csizes[n].value == value) { + result = csizes[n].name; + break; + } + } + } + _nc_STRCAT(buf, result, TRACE_BUF_SIZE(0)); + } #endif - if (cur_term->Nttyb.c_lflag & ALLLOCAL) - lookup_bits(buf, lflags, "lflags", cur_term->Nttyb.c_lflag); + if (tty->c_lflag & ALLLOCAL) + lookup_bits(buf, lflags, "lflags", tty->c_lflag); + } +#elif defined(EXP_WIN32_DRIVER) +#define DATA(name) { name, { #name } } + static const BITNAMES dwFlagsOut[] = + { + DATA(ENABLE_PROCESSED_OUTPUT), + DATA(ENABLE_WRAP_AT_EOL_OUTPUT), + DATA(ENABLE_VIRTUAL_TERMINAL_PROCESSING), + DATA(DISABLE_NEWLINE_AUTO_RETURN), + DATA(ENABLE_LVB_GRID_WORLDWIDE) + }; + static const BITNAMES dwFlagsIn[] = + { + DATA(ENABLE_PROCESSED_INPUT), + DATA(ENABLE_LINE_INPUT), + DATA(ENABLE_ECHO_INPUT), + DATA(ENABLE_MOUSE_INPUT), + DATA(ENABLE_INSERT_MODE), + DATA(ENABLE_QUICK_EDIT_MODE), + DATA(ENABLE_EXTENDED_FLAGS), + DATA(ENABLE_AUTO_POSITION), + DATA(ENABLE_VIRTUAL_TERMINAL_INPUT) + }; + buf = _nc_trace_buf(0, + 8 + sizeof(dwFlagsOut) + + 8 + sizeof(dwFlagsIn)); + if (buf != 0) { + lookup_bits(buf, dwFlagsIn, "dwIn", tty->dwFlagIn); + lookup_bits(buf, dwFlagsOut, "dwOut", tty->dwFlagOut); + } #else /* reference: ttcompat(4M) on SunOS 4.1 */ #ifndef EVENP @@ -193,33 +266,38 @@ lflags[] = #define TANDEM 0 #endif -cflags[] = + static const BITNAMES cflags[] = { - {CBREAK, "CBREAK"}, - {CRMOD, "CRMOD"}, - {ECHO, "ECHO"}, - {EVENP, "EVENP"}, - {LCASE, "LCASE"}, - {LLITOUT, "LLITOUT"}, - {ODDP, "ODDP"}, - {RAW, "RAW"}, - {TANDEM, "TANDEM"}, - {XTABS, "XTABS"}, - {0, NULL} + DATA(CBREAK), + DATA(CRMOD), + DATA(ECHO), + DATA(EVENP), + DATA(LCASE), + DATA(LLITOUT), + DATA(ODDP), + DATA(RAW), + DATA(TANDEM), + DATA(XTABS), + DATAX() #define ALLCTRL (CBREAK|CRMOD|ECHO|EVENP|LCASE|LLITOUT|ODDP|RAW|TANDEM|XTABS) }; buf = _nc_trace_buf(0, - 8 + sizeof(cflags)); - - if (cur_term->Nttyb.sg_flags & ALLCTRL) - { - lookup_bits(buf, cflags, "cflags", cur_term->Nttyb.sg_flags); + 8 + sizeof(cflags)); + if (buf != 0) { + if (tty->sg_flags & ALLCTRL) { + lookup_bits(buf, cflags, "cflags", tty->sg_flags); + } } - #endif - return(buf); + return (buf); +} + +NCURSES_EXPORT(char *) +_nc_tracebits(void) +{ + return _nc_trace_ttymode(&(cur_term->Nttyb)); } #else -char *_nc_tracebits(void) { static char tmp[] = ""; return tmp; } +EMPTY_MODULE(_nc_empty_lib_tracebits) #endif /* TRACE */