| /* very simple input/output stream interface */ |
| var Stream = function() { |
| }; |
| |
| // input streams ////////////// |
| /** Returns the next byte, or -1 for EOF. */ |
| Stream.prototype.readByte = function() { |
| throw new Error("abstract method readByte() not implemented"); |
| }; |
| /** Attempts to fill the buffer; returns number of bytes read, or |
| * -1 for EOF. */ |
| Stream.prototype.read = function(buffer, bufOffset, length) { |
| var bytesRead = 0; |
| while (bytesRead < length) { |
| var c = this.readByte(); |
| if (c < 0) { // EOF |
| return (bytesRead===0) ? -1 : bytesRead; |
| } |
| buffer[bufOffset++] = c; |
| bytesRead++; |
| } |
| return bytesRead; |
| }; |
| Stream.prototype.seek = function(new_pos) { |
| throw new Error("abstract method seek() not implemented"); |
| }; |
| |
| // output streams /////////// |
| Stream.prototype.writeByte = function(_byte) { |
| throw new Error("abstract method readByte() not implemented"); |
| }; |
| Stream.prototype.write = function(buffer, bufOffset, length) { |
| var i; |
| for (i=0; i<length; i++) { |
| this.writeByte(buffer[bufOffset++]); |
| } |
| return length; |
| }; |
| Stream.prototype.flush = function() { |
| }; |
| |
| module.exports = Stream; |