- struct linebuffer* lbuf = &termdev->line;
- switch (chr) {
- case '\0': // EOL
- case CTRL_MNEMO('D'): // EOF
- return 0;
-
- case CTRL_MNEMO('C'): // INTR
- signal_send(termdev->fggrp, SIGINT);
- break;
-
- case '\r': // CR
- termdev->line.ptr = 0;
- return 1;
-
- case '\x08': // ERASE
- return line_put_next(lbuf, chr, -1);
-
- case CTRL_MNEMO('Q'): // QUIT
- signal_send(termdev->fggrp, SIGKILL);
- return 1;
-
- case CTRL_MNEMO('Z'): // SUSP
- signal_send(termdev->fggrp, SIGSTOP);
- return 1;
-
- default:
- if ((int)chr < 32) {
- line_put_next(lbuf, '^', 0);
- chr += 64;
- }
- break;
+ if (chr < 32 && chr != '\n') {
+ lcntl_put_char(state, '^');
+ return lcntl_put_char(state, chr += 64);