sclass LineBuffer { VF1 onLine; S currentLine = ""; *() {} *(VF1 *onLine) {} void append(S s) { append(s, onLine); } void append(S s, VF1 onLine) { 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); } }