From 0245d2254bfa26b6cfd8bbd2337fc184ae3c5f10 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 11 Jun 2023 14:54:39 +0100 Subject: [PATCH] kernel: tty: support for printing newlines --- kernel/tty/tty.c | 72 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/kernel/tty/tty.c b/kernel/tty/tty.c index 80191a5..ed0f952 100644 --- a/kernel/tty/tty.c +++ b/kernel/tty/tty.c @@ -1,12 +1,58 @@ #include #include -static void putchar(struct device *tty, int c) +static void newline(struct device *tty) { struct tty_device *ttydev = TTY_DEVICE(tty); struct tty_driver *tty_driver = TTY_DRIVER(tty->dev_owner); struct tty_driver_ops *ops = tty_driver->tty_ops; + ttydev->tty_xcur = 0; + ttydev->tty_ycur++; + + if (ttydev->tty_ycur >= ttydev->tty_ycells) { + ttydev->tty_xcur = 0; + ttydev->tty_ycur = ttydev->tty_ycells - 1; + + if (ops->tty_scroll) { + ops->tty_scroll(tty, TTY_SCROLL_DOWN, 1); + } + } + + ops->tty_move_cursor(tty, ttydev->tty_xcur, ttydev->tty_ycur); +} + +static void __putchar(struct device *tty, int c) +{ + struct tty_device *ttydev = TTY_DEVICE(tty); + struct tty_driver *tty_driver = TTY_DRIVER(tty->dev_owner); + struct tty_driver_ops *ops = tty_driver->tty_ops; + + ops->tty_putc(tty, c, ttydev->tty_xcur, ttydev->tty_ycur, ttydev->tty_curattrib); + ttydev->tty_xcur++; + + if (ttydev->tty_xcur >= ttydev->tty_xcells) { + ttydev->tty_xcur = 0; + ttydev->tty_ycur++; + } + + if (ttydev->tty_ycur >= ttydev->tty_ycells) { + ttydev->tty_xcur = 0; + ttydev->tty_ycur = ttydev->tty_ycells - 1; + + if (ops->tty_scroll) { + ops->tty_scroll(tty, TTY_SCROLL_DOWN, 1); + } + } + + ops->tty_move_cursor(tty, ttydev->tty_xcur, ttydev->tty_ycur); +} + +static void putchar(struct device *tty, int c) +{ + struct tty_driver *tty_driver = TTY_DRIVER(tty->dev_owner); + struct tty_driver_ops *ops = tty_driver->tty_ops; + if (!ops->tty_putc) { return; } @@ -16,24 +62,14 @@ static void putchar(struct device *tty, int c) return; } - ops->tty_putc(tty, c, ttydev->tty_xcur, ttydev->tty_ycur, ttydev->tty_curattrib); - ttydev->tty_xcur++; - - if (ttydev->tty_xcur >= ttydev->tty_xcells) { - ttydev->tty_xcur = 0; - ttydev->tty_ycur++; + switch (c) { + case '\n': + newline(tty); + break; + default: + __putchar(tty, c); + break; } - - if (ttydev->tty_ycur >= ttydev->tty_ycells) { - if (ops->tty_scroll) { - ops->tty_scroll(tty, TTY_SCROLL_DOWN, 1); - } else { - ttydev->tty_xcur = 0; - ttydev->tty_ycur = 0; - } - } - - ops->tty_move_cursor(tty, ttydev->tty_xcur, ttydev->tty_ycur); } kern_status_t tty_read(struct device *tty, void *buf, size_t max, size_t *nr_read, socks_flags_t flags)