You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				| // StringBuf - a way to keep string memory operations to a minimum
 | |
| // while building the strings for the xml files
 | |
| class StringBuf {
 | |
|   constructor(options) {
 | |
|     this._buf = Buffer.alloc((options && options.size) || 16384);
 | |
|     this._encoding = (options && options.encoding) || 'utf8';
 | |
| 
 | |
|     // where in the buffer we are at
 | |
|     this._inPos = 0;
 | |
| 
 | |
|     // for use by toBuffer()
 | |
|     this._buffer = undefined;
 | |
|   }
 | |
| 
 | |
|   get length() {
 | |
|     return this._inPos;
 | |
|   }
 | |
| 
 | |
|   get capacity() {
 | |
|     return this._buf.length;
 | |
|   }
 | |
| 
 | |
|   get buffer() {
 | |
|     return this._buf;
 | |
|   }
 | |
| 
 | |
|   toBuffer() {
 | |
|     // return the current data as a single enclosing buffer
 | |
|     if (!this._buffer) {
 | |
|       this._buffer = Buffer.alloc(this.length);
 | |
|       this._buf.copy(this._buffer, 0, 0, this.length);
 | |
|     }
 | |
|     return this._buffer;
 | |
|   }
 | |
| 
 | |
|   reset(position) {
 | |
|     position = position || 0;
 | |
|     this._buffer = undefined;
 | |
|     this._inPos = position;
 | |
|   }
 | |
| 
 | |
|   _grow(min) {
 | |
|     let size = this._buf.length * 2;
 | |
|     while (size < min) {
 | |
|       size *= 2;
 | |
|     }
 | |
|     const buf = Buffer.alloc(size);
 | |
|     this._buf.copy(buf, 0);
 | |
|     this._buf = buf;
 | |
|   }
 | |
| 
 | |
|   addText(text) {
 | |
|     this._buffer = undefined;
 | |
| 
 | |
|     let inPos = this._inPos + this._buf.write(text, this._inPos, this._encoding);
 | |
| 
 | |
|     // if we've hit (or nearing capacity), grow the buf
 | |
|     while (inPos >= this._buf.length - 4) {
 | |
|       this._grow(this._inPos + text.length);
 | |
| 
 | |
|       // keep trying to write until we've completely written the text
 | |
|       inPos = this._inPos + this._buf.write(text, this._inPos, this._encoding);
 | |
|     }
 | |
| 
 | |
|     this._inPos = inPos;
 | |
|   }
 | |
| 
 | |
|   addStringBuf(inBuf) {
 | |
|     if (inBuf.length) {
 | |
|       this._buffer = undefined;
 | |
| 
 | |
|       if (this.length + inBuf.length > this.capacity) {
 | |
|         this._grow(this.length + inBuf.length);
 | |
|       }
 | |
|       // eslint-disable-next-line no-underscore-dangle
 | |
|       inBuf._buf.copy(this._buf, this._inPos, 0, inBuf.length);
 | |
|       this._inPos += inBuf.length;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = StringBuf;
 |