unix/unix_mphal: Hack to make uos.dupterm() actually work.

See https://github.com/micropython/micropython/issues/1736 for the
list of complications. This workaround instead of duplicating REPL
to another stream, switches to it, because read(STDIN) we use otherwise
is blocking call, so it and custom REPL stream can't be used together.
This commit is contained in:
Paul Sokolovsky 2016-03-27 13:57:50 +03:00
parent 53ad5edc01
commit 13394a632d
1 changed files with 20 additions and 13 deletions

View File

@ -117,7 +117,7 @@ static int call_dupterm_read(void) {
read_m[2] = MP_OBJ_NEW_SMALL_INT(1); read_m[2] = MP_OBJ_NEW_SMALL_INT(1);
mp_obj_t res = mp_call_method_n_kw(1, 0, read_m); mp_obj_t res = mp_call_method_n_kw(1, 0, read_m);
if (res == mp_const_none) { if (res == mp_const_none) {
return -1; return -2;
} }
mp_buffer_info_t bufinfo; mp_buffer_info_t bufinfo;
mp_get_buffer_raise(res, &bufinfo, MP_BUFFER_READ); mp_get_buffer_raise(res, &bufinfo, MP_BUFFER_READ);
@ -143,25 +143,32 @@ static int call_dupterm_read(void) {
int mp_hal_stdin_rx_chr(void) { int mp_hal_stdin_rx_chr(void) {
unsigned char c; unsigned char c;
#if MICROPY_PY_OS_DUPTERM #if MICROPY_PY_OS_DUPTERM
while (MP_STATE_PORT(term_obj) != MP_OBJ_NULL) { if (MP_STATE_PORT(term_obj) != MP_OBJ_NULL) {
int c = call_dupterm_read(); int c;
do {
c = call_dupterm_read();
} while (c == -2);
if (c == -1) { if (c == -1) {
break; goto main_term;
} }
if (c == '\n') { if (c == '\n') {
c = '\r'; c = '\r';
} }
return c; return c;
} else {
main_term:;
#endif
int ret = read(0, &c, 1);
if (ret == 0) {
c = 4; // EOF, ctrl-D
} else if (c == '\n') {
c = '\r';
}
return c;
#if MICROPY_PY_OS_DUPTERM
} }
#endif #endif
int ret = read(0, &c, 1);
if (ret == 0) {
c = 4; // EOF, ctrl-D
} else if (c == '\n') {
c = '\r';
}
return c;
} }
void mp_hal_stdout_tx_strn(const char *str, size_t len) { void mp_hal_stdout_tx_strn(const char *str, size_t len) {