X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1375eb51603466b723ab7dd1ca4194ee5d662f75..0765e7c133eb393d8cd0292af444543c2edf8ccc:/lunaix-os/hal/term/lcntls/lcntl.c diff --git a/lunaix-os/hal/term/lcntls/lcntl.c b/lunaix-os/hal/term/lcntls/lcntl.c index aab02c0..0802318 100644 --- a/lunaix-os/hal/term/lcntls/lcntl.c +++ b/lunaix-os/hal/term/lcntls/lcntl.c @@ -32,7 +32,6 @@ lcntl_transform_seq(struct term* tdev, struct linebuffer* lbuf, bool out) _lf = tdev->lflags; int allow_more = 1, latest_eol = cooked->ptr; char c; - bool should_flush = false; int (*lcntl_slave_put)(struct term*, struct linebuffer*, char) = tdev->lcntl->process_and_put; @@ -57,20 +56,20 @@ lcntl_transform_seq(struct term* tdev, struct linebuffer* lbuf, bool out) if (c == '\r' && ((_if & _ICRNL) || (_of & _OCRNL))) { c = '\n'; } else if (c == '\n') { - if ((_if & _INLCR) || (_of & (_ONLRET | _ONLCR))) { + if ((_if & _INLCR) || (_of & (_ONLRET))) { c = '\r'; } } if (c == '\0') { + if ((_if & _IGNBRK)) { + continue; + } + if ((_if & _BRKINT)) { raise_sig(tdev, lbuf, SIGINT); break; } - - if ((_if & _IGNBRK)) { - continue; - } } if ('a' <= c && c <= 'z') { @@ -81,23 +80,21 @@ lcntl_transform_seq(struct term* tdev, struct linebuffer* lbuf, bool out) } } + if (out) { + goto do_out; + } + if (c == '\n') { latest_eol = cooked->ptr + 1; - if (!out && (_lf & _ECHONL)) { + if ((_lf & _ECHONL)) { rbuffer_put(output, c); } - should_flush = true; - } - - if (out) { - goto put_char; } // For input procesing if (c == '\n' || c == EOL) { lbuf->sflags |= LSTATE_EOL; - goto keep; } else if (c == EOF) { lbuf->sflags |= LSTATE_EOF; rbuffer_clear(raw); @@ -110,25 +107,36 @@ lcntl_transform_seq(struct term* tdev, struct linebuffer* lbuf, bool out) } else if (c == SUSP) { raise_sig(tdev, lbuf, SIGSTOP); } else if (c == ERASE) { - rbuffer_erase(cooked); + if (!rbuffer_erase(cooked)) + continue; } else if (c == KILL) { // TODO shrink the rbuffer } else { goto keep; } + if ((_lf & _ECHOE) && c == ERASE) { + rbuffer_put(output, '\x8'); + rbuffer_put(output, ' '); + rbuffer_put(output, '\x8'); + } + if ((_lf & _ECHOK) && c == KILL) { + rbuffer_put(output, c); + rbuffer_put(output, '\n'); + } + continue; keep: if ((_lf & _ECHO)) { rbuffer_put(output, c); } - if ((_lf & _ECHOE) && c == ERASE) { - rbuffer_erase(output); - } - if ((_lf & _ECHOK) && c == KILL) { - rbuffer_put(output, c); - rbuffer_put(output, '\n'); + + goto put_char; + + do_out: + if (c == '\n' && (_of & _ONLCR)) { + rbuffer_put(cooked, '\r'); } put_char: @@ -139,7 +147,7 @@ lcntl_transform_seq(struct term* tdev, struct linebuffer* lbuf, bool out) } } - if (should_flush && !(_lf & _NOFLSH)) { + if (!out && !rbuffer_empty(output) && !(_lf & _NOFLSH)) { term_flush(tdev); } @@ -157,5 +165,5 @@ lcntl_transform_inseq(struct term* tdev) int lcntl_transform_outseq(struct term* tdev) { - return lcntl_transform_seq(tdev, &tdev->line_in, true); + return lcntl_transform_seq(tdev, &tdev->line_out, true); } \ No newline at end of file