| 
									
										
										
										
											2017-10-17 00:14:32 +00:00
										 |  |  | /* [MS-XLS] 2.5.198.1 TODO */ | 
					
						
							| 
									
										
										
										
											2018-01-23 09:07:51 +00:00
										 |  |  | function parse_ArrayParsedFormula(blob, length, opts/*::, ref*/) { | 
					
						
							| 
									
										
										
										
											2017-10-17 00:14:32 +00:00
										 |  |  | 	var target = blob.l + length, len = opts.biff == 2 ? 1 : 2; | 
					
						
							|  |  |  | 	var rgcb, cce = blob.read_shift(len); // length of rgce
 | 
					
						
							|  |  |  | 	if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)]; | 
					
						
							|  |  |  | 	var rgce = parse_Rgce(blob, cce, opts); | 
					
						
							|  |  |  | 	if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts); | 
					
						
							| 
									
										
										
										
											2018-01-23 09:07:51 +00:00
										 |  |  | 	blob.l = target; | 
					
						
							| 
									
										
										
										
											2017-10-17 00:14:32 +00:00
										 |  |  | 	return [rgce, rgcb]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLS] 2.5.198.3 TODO */ | 
					
						
							|  |  |  | function parse_XLSCellParsedFormula(blob, length, opts) { | 
					
						
							|  |  |  | 	var target = blob.l + length, len = opts.biff == 2 ? 1 : 2; | 
					
						
							|  |  |  | 	var rgcb, cce = blob.read_shift(len); // length of rgce
 | 
					
						
							|  |  |  | 	if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)]; | 
					
						
							|  |  |  | 	var rgce = parse_Rgce(blob, cce, opts); | 
					
						
							|  |  |  | 	if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts); | 
					
						
							| 
									
										
										
										
											2018-01-23 09:07:51 +00:00
										 |  |  | 	blob.l = target; | 
					
						
							| 
									
										
										
										
											2017-10-17 00:14:32 +00:00
										 |  |  | 	return [rgce, rgcb]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLS] 2.5.198.21 */ | 
					
						
							|  |  |  | function parse_NameParsedFormula(blob, length, opts, cce) { | 
					
						
							|  |  |  | 	var target = blob.l + length; | 
					
						
							|  |  |  | 	var rgce = parse_Rgce(blob, cce, opts); | 
					
						
							|  |  |  | 	var rgcb; | 
					
						
							|  |  |  | 	if(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts); | 
					
						
							|  |  |  | 	return [rgce, rgcb]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLS] 2.5.198.118 TODO */ | 
					
						
							|  |  |  | function parse_SharedParsedFormula(blob, length, opts) { | 
					
						
							|  |  |  | 	var target = blob.l + length; | 
					
						
							|  |  |  | 	var rgcb, cce = blob.read_shift(2); // length of rgce
 | 
					
						
							|  |  |  | 	var rgce = parse_Rgce(blob, cce, opts); | 
					
						
							|  |  |  | 	if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)]; | 
					
						
							|  |  |  | 	if(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts); | 
					
						
							|  |  |  | 	return [rgce, rgcb]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */ | 
					
						
							|  |  |  | function parse_FormulaValue(blob/*::, length*/) { | 
					
						
							|  |  |  | 	var b; | 
					
						
							|  |  |  | 	if(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n']; | 
					
						
							|  |  |  | 	switch(blob[blob.l]) { | 
					
						
							|  |  |  | 		case 0x00: blob.l += 8; return ["String", 's']; | 
					
						
							|  |  |  | 		case 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b']; | 
					
						
							|  |  |  | 		case 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e']; | 
					
						
							|  |  |  | 		case 0x03: blob.l += 8; return ["",'s']; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return []; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLS] 2.4.127 TODO */ | 
					
						
							|  |  |  | function parse_Formula(blob, length, opts) { | 
					
						
							|  |  |  | 	var end = blob.l + length; | 
					
						
							|  |  |  | 	var cell = parse_XLSCell(blob, 6); | 
					
						
							|  |  |  | 	if(opts.biff == 2) ++blob.l; | 
					
						
							|  |  |  | 	var val = parse_FormulaValue(blob,8); | 
					
						
							|  |  |  | 	var flags = blob.read_shift(1); | 
					
						
							|  |  |  | 	if(opts.biff != 2) { | 
					
						
							|  |  |  | 		blob.read_shift(1); | 
					
						
							|  |  |  | 		if(opts.biff >= 5) { | 
					
						
							| 
									
										
										
										
											2018-01-23 09:07:51 +00:00
										 |  |  | 			/*var chn = */blob.read_shift(4); | 
					
						
							| 
									
										
										
										
											2017-10-17 00:14:32 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts); | 
					
						
							|  |  |  | 	return {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]}; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 20:36:32 +00:00
										 |  |  | /* XLSB Parsed Formula records have the same shape */ | 
					
						
							|  |  |  | function parse_XLSBParsedFormula(data, length, opts) { | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 	var cce = data.read_shift(4); | 
					
						
							| 
									
										
										
										
											2017-02-19 20:36:32 +00:00
										 |  |  | 	var rgce = parse_Rgce(data, cce, opts); | 
					
						
							|  |  |  | 	var cb = data.read_shift(4); | 
					
						
							|  |  |  | 	var rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null; | 
					
						
							|  |  |  | 	return [rgce, rgcb]; | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-02-19 20:36:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */ | 
					
						
							|  |  |  | var parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula; | 
					
						
							|  |  |  | /* [MS-XLSB] 2.5.97.4 CellParsedFormula */ | 
					
						
							|  |  |  | var parse_XLSBCellParsedFormula = parse_XLSBParsedFormula; | 
					
						
							|  |  |  | /* [MS-XLSB] 2.5.97.12 NameParsedFormula */ | 
					
						
							|  |  |  | var parse_XLSBNameParsedFormula = parse_XLSBParsedFormula; | 
					
						
							|  |  |  | /* [MS-XLSB] 2.5.97.98 SharedParsedFormula */ | 
					
						
							|  |  |  | var parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula; |