- lbuf->sflags |= LSTATE_EOL;
- goto keep;
- } else if (c == EOF) {
- lbuf->sflags |= LSTATE_EOF;
- rbuffer_clear(raw);
- break;
- } else if (c == INTR) {
- raise_sig(tdev, lbuf, SIGINT);
- } else if (c == QUIT) {
- raise_sig(tdev, lbuf, SIGKILL);
- break;
- } else if (c == SUSP) {
- raise_sig(tdev, lbuf, SIGSTOP);
- } else if (c == ERASE) {
- rbuffer_erase(cooked);
- } else if (c == KILL) {
- // TODO shrink the rbuffer
- } else {
- goto keep;
+ lcntl_raise_line_event(state, LEVT_EOL);
+ }
+ else if (c == EOF) {
+ lcntl_raise_line_event(state, LEVT_EOF);
+ lcntl_set_flag(state, LCNTLF_CLEAR_INBUF);
+ lcntl_set_flag(state, LCNTLF_STOP);
+ }
+ else if (c == INTR) {
+ raise_sig(state, SIGINT);
+ lcntl_set_flag(state, LCNTLF_CLEAR_OUTBUF);
+ }
+ else if (c == QUIT) {
+ raise_sig(state, SIGKILL);
+ lcntl_set_flag(state, LCNTLF_CLEAR_OUTBUF);
+ lcntl_set_flag(state, LCNTLF_STOP);
+ }
+ else if (c == SUSP) {
+ raise_sig(state, SIGSTOP);
+ }
+ else if (c == ERASE) {
+ if (rbuffer_erase(state->outbuf) &&
+ lcntl_check_echo(state, _ECHOE))
+ {
+ lcntl_echo_char(state, '\x8');
+ lcntl_echo_char(state, ' ');
+ lcntl_echo_char(state, '\x8');
+ }
+ continue;
+ }
+ else if (c == KILL) {
+ lcntl_set_flag(state, LCNTLF_CLEAR_OUTBUF);
+ }
+ else {
+ lcntl_unset_flag(state, LCNTLF_SPECIAL_CHAR);