srecord ByteCountingLineReader(InputStream in) { // in should be buffered! long byteCount; int bufferedByte = -1; bool ended; S readLine() ctex { new StringBuilder buf; int c; while (licensed() && !ended) { int c = read(); if (c == '\n') break; if (c == '\r') { c = read(); if (c != '\n' && !ended) bufferedByte = c; break; } } ret buf.toString(); } int read() ctex { if (bufferedByte >= 0) { int b = bufferedByte; bufferedByte = -1; ret b; } int c = in.read(); if (c < 0) ended = true; ret c; } }