package bluej.terminal;

import java.awt.Toolkit;

import threadchecker.OnThread;
import threadchecker.Tag;


| A type-ahead input buffer for the BlueJ terminal. Implemented with | a circular array. | | @author Michael Kolling | @version $Id: InputBuffer.java 12537 2014-10-10 13:05:36Z nccb $ | @OnThread(Tag.Any) public final class InputBuffer { private char[] buffer; private int bufferNextFull = 0; private int bufferNextFree = 0; private int bufferSize; private boolean eofMark = false; public static char EOF_CHAR = '\u0004'; public InputBuffer(int size) { buffer = new char[size]; bufferSize = size; } public synchronized boolean putChar(char ch) { if (isFull()) { Toolkit.getDefaultToolkit().beep(); return false; } else { buffer[bufferNextFree] = ch; bufferNextFree = advance(bufferNextFree); return true; } } public synchronized boolean putString(String input) { boolean putAny = false; for (char c : input.toCharArray()) { putAny = putChar(c) || putAny; } return putAny; } public synchronized boolean backSpace() { if (!isEmpty()) { bufferNextFree = backwards(bufferNextFree); return true; } else { Toolkit.getDefaultToolkit().beep(); return false; } } public synchronized char getChar() { while (isEmpty()) { try { wait(); } catch(InterruptedException e) { return '\n'; } } char ch = buffer[bufferNextFull]; bufferNextFull = advance(bufferNextFull); if (eofMark) { eofMark = false; putChar(EOF_CHAR); notifyReaders(); } return ch; }
| Signal that an EOF condition should be emulated by the terminal. | public synchronized void signalEOF() { if (! isFull()) putChar(EOF_CHAR); else{ eofMark = true; } notifyReaders(); } public synchronized void notifyReaders() { notify(); } public synchronized boolean isEmpty() { return bufferNextFull == bufferNextFree; } private boolean isFull() { return advance(bufferNextFree) == bufferNextFull; } private int advance(int pos) { return (++pos) % bufferSize; } private int backwards(int pos) { pos--; return (pos < 0 ? bufferSize - 1 : pos); } }

.   - InputBuffer
.   InputBuffer
.   putChar
.   putString
.   backSpace
.   getChar
.   signalEOF
.   notifyReaders
.   isEmpty
.   isFull
.   advance
.   backwards




164 neLoCode + 5 LoComm