Call rtems_termios_puts() only once. Adjust column in one place. --- cpukit/libcsupport/src/termios.c | 57 ++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 19 deletions(-)
diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c index 18fe269..4fd98a5 100644 --- a/cpukit/libcsupport/src/termios.c +++ b/cpukit/libcsupport/src/termios.c @@ -1098,55 +1098,74 @@ rtems_termios_puts ( static void oproc (unsigned char c, struct rtems_termios_tty *tty) { - int i; + char buf[8]; + size_t len; + int oldColumn; + int columnAdj; + int i; + + buf[0] = c; + len = 1; + oldColumn = tty->column; + columnAdj = 0; if (tty->termios.c_oflag & OPOST) { switch (c) { case '\n': if (tty->termios.c_oflag & ONLRET) - tty->column = 0; + columnAdj = -oldColumn; if (tty->termios.c_oflag & ONLCR) { - rtems_termios_puts ("\r", 1, tty); - tty->column = 0; + buf[0] = '\r'; + buf[1] = c; + len = 2; + columnAdj = -oldColumn; } break; case '\r': - if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0)) + if ((tty->termios.c_oflag & ONOCR) && (oldColumn == 0)) return; if (tty->termios.c_oflag & OCRNL) { - c = '\n'; + buf[0] = '\n'; if (tty->termios.c_oflag & ONLRET) - tty->column = 0; - break; + columnAdj = -oldColumn; + } else { + columnAdj = -oldColumn; } - tty->column = 0; break; case '\t': - i = 8 - (tty->column & 7); + i = 8 - (oldColumn & 7); if ((tty->termios.c_oflag & TABDLY) == XTABS) { - tty->column += i; - rtems_termios_puts ( " ", i, tty); - return; + int j; + + for (j = 0; j < i; ++j) { + buf[j] = ' '; + } + + len = (size_t) i; } - tty->column += i; + columnAdj = i; break; case '\b': - if (tty->column > 0) - tty->column--; + if (oldColumn > 0) + columnAdj = -1; break; default: - if (tty->termios.c_oflag & OLCUC) + if (tty->termios.c_oflag & OLCUC) { c = toupper(c); + buf[0] = c; + } if (!iscntrl(c)) - tty->column++; + columnAdj = 1; break; } } - rtems_termios_puts (&c, 1, tty); + + tty->column = oldColumn + columnAdj; + rtems_termios_puts (buf, len, tty); } static uint32_t -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel