package xtc.lang.blink; /** * A bounded byte sequence log. This is to support for storing and showing the * most recent K-bytes messages. * * @author Byeongcheol Lee */ public class BoundedLogQueue { /** The internal log buffer. */ private final char[] log; /** The log index for the most recent byte. */ private int head = -1; /** The log index for the least recent byte. */ private int tail = -1; /** The constructor. */ BoundedLogQueue(int capacity) { assert capacity > 0; this.log = new char[capacity]; } /** put a character into the log. */ private void put(char c) { if (length() == 0) { head = tail = 0; log[0] = c; } else { head = (head + 1) % log.length; if (tail == head) { tail = (tail + 1) % log.length; } log[head] = c; } } /** compute the message size in the log. */ private int length() { if (head > tail) { return head - tail + 1; } else if (head < tail) { return (head + 1) + (log.length - tail); } else { if (head == -1 && tail == -1 ) { return 0; } else { assert head == 0 && tail == 0; return 1; } } } /** * Append a string message to the log. * * @param msg The string message */ public synchronized void log(String msg) { char[] buf = msg.toCharArray(); log(buf, 0, buf.length); } /** * Append a byte array message to the log. * * @param buf The buffer array. * @param index The beginning of the message. * @param len The length. */ public synchronized void log(char[] buf, int index, int len) { assert index >= 0 && len >= 0; for(int i = 0;i < len;i++) { put(buf[index+i]); } } /** Get the last messages. */ public synchronized String getLastTrace() { int len = length(); char[] msg = new char[len]; for(int i=0; i < len;i++) { msg[i] = log[(tail + i) % log.length]; } return new String(msg); } }