sclass LineBuffer { VF1 onLine; S currentLine = ""; *() {} *(VF1 *onLine) {} void append(S s) { currentLine += s; int i = 0, j; while ((j = indexOf(currentLine, i, '\n')) >= 0) { S line = dropTrailingBackslashR(substring(currentLine, i, j)); callF(onLine, line); i = j+1; } currentLine = substring(currentLine, i); } }