---
 term.c                     | 145 ++++++++++++++++++++++++++++++++++++++-------
 xlat/term_cflags.in        |   9 +++
 xlat/term_cflags_csize.in  |   4 ++
 xlat/term_iflags.in        |  15 +++++
 xlat/term_lflags.in        |  17 ++++++
 xlat/term_oflags.in        |  15 +++++
 xlat/term_oflags_bsdly.in  |   2 +
 xlat/term_oflags_crdly.in  |   4 ++
 xlat/term_oflags_ffdly.in  |   2 +
 xlat/term_oflags_nldly.in  |   4 ++
 xlat/term_oflags_tabdly.in |   8 +++
 xlat/term_oflags_vtdly.in  |   2 +
 xlat/termio_cc.in          |  10 ++++
 xlat/termios_cc.in         |  18 ++++++
 14 files changed, 234 insertions(+), 21 deletions(-)
 create mode 100644 xlat/term_cflags.in
 create mode 100644 xlat/term_cflags_csize.in
 create mode 100644 xlat/term_iflags.in
 create mode 100644 xlat/term_lflags.in
 create mode 100644 xlat/term_oflags.in
 create mode 100644 xlat/term_oflags_bsdly.in
 create mode 100644 xlat/term_oflags_crdly.in
 create mode 100644 xlat/term_oflags_ffdly.in
 create mode 100644 xlat/term_oflags_nldly.in
 create mode 100644 xlat/term_oflags_tabdly.in
 create mode 100644 xlat/term_oflags_vtdly.in
 create mode 100644 xlat/termio_cc.in
 create mode 100644 xlat/termios_cc.in

diff --git a/term.c b/term.c
index 28f562f..25497b9 100644
--- a/term.c
+++ b/term.c
@@ -38,6 +38,121 @@
 #include "xlat/baud_options.h"
 #include "xlat/modem_flags.h"
 
+#include "xlat/term_cflags.h"
+#include "xlat/term_cflags_csize.h"
+#include "xlat/term_iflags.h"
+#include "xlat/term_lflags.h"
+#include "xlat/term_oflags.h"
+#include "xlat/term_oflags_bsdly.h"
+#include "xlat/term_oflags_crdly.h"
+#include "xlat/term_oflags_ffdly.h"
+#include "xlat/term_oflags_nldly.h"
+#include "xlat/term_oflags_tabdly.h"
+#include "xlat/term_oflags_vtdly.h"
+
+#include "xlat/termio_cc.h"
+#include "xlat/termios_cc.h"
+
+static void
+decode_oflag(uint64_t val)
+{
+       static const struct {
+               const struct xlat *xl;
+               uint64_t mask;
+               const char *dfl;
+       } xlats[] = {
+               { term_oflags_bsdly,  BSDLY,  "BS?"  },
+               { term_oflags_crdly,  CRDLY,  "CR?"  },
+               { term_oflags_ffdly,  FFDLY,  "FF?"  },
+               { term_oflags_nldly,  NLDLY,  "NL?"  },
+               { term_oflags_tabdly, TABDLY, "TAB?" },
+               { term_oflags_vtdly,  VTDLY,  "VT?"  },
+       };
+
+       unsigned i;
+
+       for (i = 0; i < ARRAY_SIZE(xlats); i++) {
+               printxval64(xlats[i].xl, val & xlats[i].mask, xlats[i].dfl);
+               tprints("|");
+
+               val &= ~xlats[i].mask;
+       }
+
+       printflags64(term_oflags, val, NULL);
+}
+
+static void
+decode_cflag(uint64_t val)
+{
+       printxval64(baud_options, val & CBAUD, "B???");
+       tprints("|");
+       printxval64(baud_options, (val & CIBAUD) >> IBSHIFT, "B???");
+       tprintf("<<IBSHIFT|");
+       printxval64(term_cflags_csize, val & CSIZE, "CS?");
+       tprints("|");
+
+       val &= ~(CBAUD | CIBAUD | CSIZE);
+       printxval64(term_cflags, val, NULL);
+}
+
+static void
+decode_flags(uint64_t iflag, uint64_t oflag, uint64_t cflag, uint64_t lflag)
+{
+       tprints("c_iflag=");
+       printflags64(term_iflags, iflag, NULL);
+       tprints(", c_oflag=");
+       decode_oflag(oflag);
+       tprints(", c_cflag=");
+       decode_cflag(cflag);
+       tprints(", c_lflag=");
+       printflags64(term_lflags, lflag, NULL);
+}
+
+static void
+print_cc_char(bool *first, const unsigned char *data, const char *s,
+             unsigned idx)
+{
+       if (*first)
+               *first = false;
+       else
+               tprints(", ");
+
+       if (s)
+               tprintf("[%s] = ", s);
+       else
+               tprintf("[%u] = ", idx);
+
+       tprintf("%#hhx", data[idx]);
+}
+
+static void
+decode_term_cc(const struct xlat *xl, const unsigned char *data, unsigned size)
+{
+       uint64_t not_printed = (1ULL << size) - 1;
+       unsigned i = 0;
+       bool first = true;
+
+       tprints("{");
+
+       for (; xl->str; xl++) {
+               if (xl->val >= size)
+                       continue;
+
+               print_cc_char(&first, data, xl->str, xl->val);
+               not_printed &= ~(1 << xl->val);
+       }
+
+       while (not_printed) {
+               if (not_printed & 1)
+                       print_cc_char(&first, data, NULL, i);
+
+               not_printed >>= 1;
+               i++;
+       }
+
+       tprints("}");
+}
+
 static void
 decode_termios(struct tcb *const tcp, const kernel_ulong_t addr)
 {
@@ -56,16 +171,14 @@ decode_termios(struct tcb *const tcp, const kernel_ulong_t 
addr)
                        (tios.c_lflag & ECHO) ? "" : "-");
                return;
        }
-       tprintf("{c_iflags=%#lx, c_oflags=%#lx, ",
-               (long) tios.c_iflag, (long) tios.c_oflag);
-       tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
-               (long) tios.c_cflag, (long) tios.c_lflag);
-       tprintf("c_line=%u, ", tios.c_line);
+       tprints("{");
+       decode_flags(tios.c_iflag, tios.c_oflag, tios.c_cflag, tios.c_lflag);
+       tprintf(", c_line=%u, ", tios.c_line);
        if (!(tios.c_lflag & ICANON))
                tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
                        tios.c_cc[VMIN], tios.c_cc[VTIME]);
        tprints("c_cc=");
-       print_quoted_string((char *) tios.c_cc, NCCS, QUOTE_FORCE_HEX);
+       decode_term_cc(termios_cc, tios.c_cc, NCCS);
        tprints("}");
 }
 
@@ -87,22 +200,12 @@ decode_termio(struct tcb *const tcp, const kernel_ulong_t 
addr)
                        (tio.c_lflag & ECHO) ? "" : "-");
                return;
        }
-       tprintf("{c_iflags=%#lx, c_oflags=%#lx, ",
-               (long) tio.c_iflag, (long) tio.c_oflag);
-       tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
-               (long) tio.c_cflag, (long) tio.c_lflag);
-       tprintf("c_line=%u, ", tio.c_line);
-#ifdef _VMIN
-       if (!(tio.c_lflag & ICANON))
-               tprintf("c_cc[_VMIN]=%d, c_cc[_VTIME]=%d, ",
-                       tio.c_cc[_VMIN], tio.c_cc[_VTIME]);
-#else /* !_VMIN */
-       if (!(tio.c_lflag & ICANON))
-               tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
-                       tio.c_cc[VMIN], tio.c_cc[VTIME]);
-#endif /* !_VMIN */
+       tprints("{");
+       decode_flags(tio.c_iflag, tio.c_oflag, tio.c_cflag, tio.c_lflag);
+       tprintf(", c_line=%u, ", tio.c_line);
+
        tprints("c_cc=");
-       print_quoted_string((char *) tio.c_cc, NCC, QUOTE_FORCE_HEX);
+       decode_term_cc(termio_cc, tio.c_cc, NCC);
        tprints("}");
 }
 
diff --git a/xlat/term_cflags.in b/xlat/term_cflags.in
new file mode 100644
index 0000000..b664e76
--- /dev/null
+++ b/xlat/term_cflags.in
@@ -0,0 +1,9 @@
+CSTOPB
+CREAD
+PARENB
+PARODD
+HUPCL
+CLOCAL
+CMSPAR    /* mark or space (stick) parity */
+CRTSCTS   /* flow control */
+CTVB      /* VisioBraille Terminal flow control */
diff --git a/xlat/term_cflags_csize.in b/xlat/term_cflags_csize.in
new file mode 100644
index 0000000..20f23c5
--- /dev/null
+++ b/xlat/term_cflags_csize.in
@@ -0,0 +1,4 @@
+CS5
+CS6
+CS7
+CS8
diff --git a/xlat/term_iflags.in b/xlat/term_iflags.in
new file mode 100644
index 0000000..6da15f3
--- /dev/null
+++ b/xlat/term_iflags.in
@@ -0,0 +1,15 @@
+BRKINT   /* Signal interrupt on break.  */
+ICRNL    /* Map CR to NL on input.  */
+IGNBRK   /* Ignore break condition.  */
+IGNCR    /* Ignore CR.  */
+IGNPAR   /* Ignore characters with parity errors.  */
+IMAXBEL  /* Ring bell when input queue is full.  */
+INLCR    /* Map NL to CR on input.  */
+INPCK    /* Enable input parity check.  */
+ISTRIP   /* Strip 8th bit off characters.  */
+IUCLC    /* Map upper case to lower case on input.  */
+IUTF8    /* Input is UTF-8 */
+IXANY    /* Any character will restart after stop.  */
+IXOFF    /* Enable start/stop input control.  */
+IXON     /* Enable start/stop output control.  */
+PARMRK   /* Mark parity and framing errors.  */
diff --git a/xlat/term_lflags.in b/xlat/term_lflags.in
new file mode 100644
index 0000000..19b1ef6
--- /dev/null
+++ b/xlat/term_lflags.in
@@ -0,0 +1,17 @@
+DEFECHO      /* SUNOS thing, what is it? */
+ECHO         /* Enable echo.  */
+ECHOCTL      /* Echo control characters as ^X.  */
+ECHOE        /* Visual erase for ERASE.  */
+ECHOK        /* Echo NL after KILL.  */
+ECHOKE       /* Visual erase for KILL.  */
+ECHONL       /* Echo NL even if ECHO is off.  */
+ECHOPRT      /* Hardcopy visual erase.  */
+EXTPROC      /* External processing on pty */
+FLUSHO
+ICANON       /* Do erase and kill processing.  */
+IEXTEN       /* Enable DISCARD and LNEXT.  */
+ISIG         /* Enable signals.  */
+NOFLSH       /* Disable flush after interrupt.  */
+PENDIN       /* Retype pending input (state).  */
+TOSTOP       /* Send SIGTTOU for background output.  */
+XCASE
diff --git a/xlat/term_oflags.in b/xlat/term_oflags.in
new file mode 100644
index 0000000..5ab523e
--- /dev/null
+++ b/xlat/term_oflags.in
@@ -0,0 +1,15 @@
+#ifdef ALPHA
+XTABS   /* required by POSIX to == TAB3; but not on Alpha! */
+#endif
+
+OCRNL
+OFDEL
+OFILL
+OLCUC   /* Map lower case to upper case on output.  */
+ONLCR   /* Map NL to CR-NL on output.  */
+ONLRET
+ONOCR
+OPOST   /* Perform output processing.  */
+
+PAGEOUT /* SUNOS specific */
+WRAP    /* SUNOS specific */
diff --git a/xlat/term_oflags_bsdly.in b/xlat/term_oflags_bsdly.in
new file mode 100644
index 0000000..b748f73
--- /dev/null
+++ b/xlat/term_oflags_bsdly.in
@@ -0,0 +1,2 @@
+BS1
+BS0
diff --git a/xlat/term_oflags_crdly.in b/xlat/term_oflags_crdly.in
new file mode 100644
index 0000000..a5d3b18
--- /dev/null
+++ b/xlat/term_oflags_crdly.in
@@ -0,0 +1,4 @@
+CR0
+CR1
+CR2
+CR3
diff --git a/xlat/term_oflags_ffdly.in b/xlat/term_oflags_ffdly.in
new file mode 100644
index 0000000..4b61019
--- /dev/null
+++ b/xlat/term_oflags_ffdly.in
@@ -0,0 +1,2 @@
+FF0
+FF1
diff --git a/xlat/term_oflags_nldly.in b/xlat/term_oflags_nldly.in
new file mode 100644
index 0000000..4e6d5d3
--- /dev/null
+++ b/xlat/term_oflags_nldly.in
@@ -0,0 +1,4 @@
+NL0
+NL1
+NL2
+NL3
diff --git a/xlat/term_oflags_tabdly.in b/xlat/term_oflags_tabdly.in
new file mode 100644
index 0000000..01e3773
--- /dev/null
+++ b/xlat/term_oflags_tabdly.in
@@ -0,0 +1,8 @@
+#ifndef ALPHA
+XTABS /* required by POSIX to == TAB3; but not on Alpha! */
+#endif
+
+TAB0
+TAB1
+TAB2
+TAB3
diff --git a/xlat/term_oflags_vtdly.in b/xlat/term_oflags_vtdly.in
new file mode 100644
index 0000000..210ac80
--- /dev/null
+++ b/xlat/term_oflags_vtdly.in
@@ -0,0 +1,2 @@
+VT0
+VT1
diff --git a/xlat/termio_cc.in b/xlat/termio_cc.in
new file mode 100644
index 0000000..5798239
--- /dev/null
+++ b/xlat/termio_cc.in
@@ -0,0 +1,10 @@
+_VINTR
+_VQUIT
+_VERASE
+_VKILL
+_VEOF
+_VMIN
+_VEOL
+_VTIME
+_VEOL2
+_VSWTC
diff --git a/xlat/termios_cc.in b/xlat/termios_cc.in
new file mode 100644
index 0000000..920be95
--- /dev/null
+++ b/xlat/termios_cc.in
@@ -0,0 +1,18 @@
+VINTR    /* Interrupt character [ISIG].  */
+VQUIT    /* Quit character [ISIG].  */
+VERASE   /* Erase character [ICANON].  */
+VKILL    /* Kill-line character [ICANON].  */
+VMIN     /* Minimum number of bytes read at once [!ICANON].  */
+VTIME    /* Time-out value (tenths of a second) [!ICANON].  */
+VEOL2    /* Second EOL character [ICANON].  */
+VSWTC    /* ??? */
+VSTART   /* Start (X-ON) character [IXON, IXOFF].  */
+VSTOP    /* Stop (X-OFF) character [IXON, IXOFF].  */
+VSUSP    /* Suspend character [ISIG].  */
+VDSUSP   /* Delayed suspend character [ISIG].  */
+VREPRINT /* Reprint-line character [ICANON].  */
+VDISCARD /* Discard character [IEXTEN].  */
+VWERASE  /* Word-erase character [ICANON].  */
+VLNEXT   /* Literal-next character [IEXTEN].  */
+VEOF     /* End-of-file character [ICANON].  */
+VEOL     /* End-of-line character [ICANON].  */
-- 
2.1.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to