static ssize_t Srlc_read(void *handle, char *buffer, size_t size) { rlc_console c = handle; size_t bytes; PL_write_prompt(TRUE); if ( Suser_input && Suser_input->handle == c && PL_ttymode(Suser_input) == PL_RAWTTY ) { int chr = getkey(c); TCHAR *tbuf = (TCHAR*)buffer; if ( chr == 04 || chr == 26 || chr == -1 ) { bytes = 0; } else { tbuf[0] = chr; bytes = sizeof(TCHAR); } } else { bytes = rlc_read(c, (TCHAR*)buffer, size/sizeof(TCHAR)); bytes *= sizeof(TCHAR); } if ( bytes == 0 || buffer[bytes-1] == '\n' ) PL_prompt_next(0); return bytes; }
static ssize_t pdt_read(void *handle, char *buf, size_t size) { pdt_console *c = find_console(handle, NULL); IOSTREAM *out; if ( c && PL_ttymode(Suser_input) == PL_RAWTTY && (out = Suser_output) ) { ssize_t rc; static char go_single[] = {ESC, 's'}; if ( (*c->org_output_functions->write)(out->handle, go_single, 2) == 2 ) { rc = (*c->org_input_functions->read)(handle, buf, 2); if ( rc == 2 ) rc = 1; /* drop \n */ return rc; } } return (*c->org_input_functions->read)(handle, buf, size); }
static ssize_t Sread_win32_console(void *handle, char *buffer, size_t size) { GET_LD ansi_stream *as = handle; BOOL rc; DWORD done; DWORD mode; int isRaw = FALSE; if ( Suser_input && Suser_input->handle == handle && PL_ttymode(Suser_input) == PL_RAWTTY ) { if ( GetConsoleMode(as->hConsole, &mode) && SetConsoleMode(as->hConsole, mode & ~(ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT)) ) isRaw = TRUE; } if ( !PL_wait_for_console_input(as->hConsole) ) goto error; rc = ReadConsoleW(as->hConsole, buffer, (DWORD)(size / sizeof(wchar_t)), &done, NULL); if ( rc ) { if ( isRaw ) SetConsoleMode(as->hConsole, mode); return done * sizeof(wchar_t); } error: if ( isRaw ) SetConsoleMode(as->hConsole, mode); return -1; }