| 
									
										
										
										
											2020-08-14 12:37:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class StringXor { | 
					
						
							|  |  |  | 	constructor() { | 
					
						
							|  |  |  | 		this._value = undefined; | 
					
						
							| 
									
										
										
										
											2020-08-14 22:19:12 +08:00
										 |  |  | 		this._buffer = undefined; | 
					
						
							| 
									
										
										
										
											2020-08-14 12:37:25 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	add(str) { | 
					
						
							| 
									
										
										
										
											2020-08-14 22:19:12 +08:00
										 |  |  | 		let buf = this._buffer; | 
					
						
							|  |  |  | 		let value; | 
					
						
							|  |  |  | 		if (buf === undefined) { | 
					
						
							|  |  |  | 			buf = this._buffer = Buffer.from(str, "latin1"); | 
					
						
							|  |  |  | 			this._value = Buffer.from(buf); | 
					
						
							| 
									
										
										
										
											2020-08-14 12:37:25 +08:00
										 |  |  | 			return; | 
					
						
							| 
									
										
										
										
											2020-08-14 22:19:12 +08:00
										 |  |  | 		} else if (buf.length !== str.length) { | 
					
						
							|  |  |  | 			value = this._value; | 
					
						
							|  |  |  | 			buf = this._buffer = Buffer.from(str, "latin1"); | 
					
						
							|  |  |  | 			if (value.length < buf.length) { | 
					
						
							|  |  |  | 				this._value = Buffer.allocUnsafe(buf.length); | 
					
						
							|  |  |  | 				value.copy(this._value); | 
					
						
							|  |  |  | 				this._value.fill(0, value.length); | 
					
						
							|  |  |  | 				value = this._value; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2020-08-14 12:37:25 +08:00
										 |  |  | 			value = this._value; | 
					
						
							| 
									
										
										
										
											2020-08-14 22:19:12 +08:00
										 |  |  | 			buf.write(str, "latin1"); | 
					
						
							| 
									
										
										
										
											2020-08-14 12:37:25 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-15 00:40:57 +08:00
										 |  |  | 		const len = buf.length; | 
					
						
							| 
									
										
										
										
											2020-08-14 22:19:12 +08:00
										 |  |  | 		for (let i = 0; i < len; i++) { | 
					
						
							| 
									
										
										
										
											2020-08-14 12:37:25 +08:00
										 |  |  | 			value[i] = value[i] ^ buf[i]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	toString() { | 
					
						
							| 
									
										
										
										
											2020-08-14 22:19:12 +08:00
										 |  |  | 		return this._value === undefined ? "" : this._value.toString("latin1"); | 
					
						
							| 
									
										
										
										
											2020-08-14 12:37:25 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	updateHash(hash) { | 
					
						
							|  |  |  | 		if (this._value !== undefined) hash.update(this._value); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = StringXor; |