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; }
/** polling loop til buffer ready */ ssize_t Swipl_IO::_read_(char *buf, size_t bufsize) { qDebug() << "_read_" << CVP(target); int thid = PL_thread_self(); // handle setup interthread and termination for ( ; ; ) { { QMutexLocker lk(&sync); if (target) { if (!target->thids.contains(thid)) { target->add_thread(thid); int rc = PL_thread_at_exit(eng_at_exit, this, FALSE); qDebug() << "installed" << rc; } break; } } if ( PL_handle_signals() < 0 ) return -1; SwiPrologEngine::msleep(10); } if ( buffer.isEmpty() ) { PL_write_prompt(TRUE); emit user_prompt(thid, SwiPrologEngine::is_tty(this)); } for ( ; ; ) { { QMutexLocker lk(&sync); if (!query.isEmpty()) { try { int rc = PlCall(query.toStdWString().data()); qDebug() << "PlCall" << query << rc; } catch(PlException e) { qDebug() << t2w(e); } query.clear(); } uint n = buffer.length(); Q_ASSERT(bufsize >= n); if (n > 0) { uint l = bufsize < n ? bufsize : n; memcpy(buf, buffer, l); buffer.remove(0, l); return l; } if (target->status == ConsoleEdit::eof) { target->status = ConsoleEdit::running; return 0; } } if ( PL_handle_signals() < 0 ) return -1; SwiPrologEngine::msleep(10); } }