@@ -27,8 +27,9 @@ function parse_RgceArea_BIFF2(blob/*::, length, opts*/) {
27
27
}
28
28
29
29
/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */
30
- function parse_RgceAreaRel ( blob , length /*::, opts*/ ) {
31
- var r = blob . read_shift ( length == 12 ? 4 : 2 ) , R = blob . read_shift ( length == 12 ? 4 : 2 ) ;
30
+ function parse_RgceAreaRel ( blob , length , opts ) {
31
+ if ( opts . biff < 8 ) return parse_RgceArea_BIFF2 ( blob , length , opts ) ;
32
+ var r = blob . read_shift ( opts . biff == 12 ? 4 : 2 ) , R = blob . read_shift ( opts . biff == 12 ? 4 : 2 ) ;
32
33
var c = parse_ColRelU ( blob , 2 ) ;
33
34
var C = parse_ColRelU ( blob , 2 ) ;
34
35
return { s :{ r :r , c :c [ 0 ] , cRel :c [ 1 ] , rRel :c [ 2 ] } , e :{ r :R , c :C [ 0 ] , cRel :C [ 1 ] , rRel :C [ 2 ] } } ;
@@ -118,7 +119,7 @@ function parse_PtgAreaErr3d(blob, length, opts) {
118
119
/* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */
119
120
function parse_PtgAreaN ( blob , length , opts ) {
120
121
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
121
- var area = parse_RgceAreaRel ( blob , opts && opts . biff > 8 ? 12 : 8 , opts ) ;
122
+ var area = parse_RgceAreaRel ( blob , length - 1 , opts ) ;
122
123
return [ type , area ] ;
123
124
}
124
125
@@ -372,6 +373,7 @@ function parse_PtgMemFunc(blob, length, opts) {
372
373
function parse_PtgRefErr ( blob , length , opts ) {
373
374
var type = ( blob . read_shift ( 1 ) >>> 5 ) & 0x03 ;
374
375
blob . l += 4 ;
376
+ if ( opts . biff < 8 ) blob . l -- ;
375
377
if ( opts . biff == 12 ) blob . l += 2 ;
376
378
return [ type ] ;
377
379
}
@@ -675,6 +677,7 @@ function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ {
675
677
return formula_quote_sheet_name ( get_ixti_raw ( supbooks , ixti , opts ) , opts ) ;
676
678
}
677
679
function stringify_formula ( formula /*Array<any>*/ , range , cell /*:any*/ , supbooks , opts ) /*:string*/ {
680
+ var biff = ( opts && opts . biff ) || 8 ;
678
681
var _range = /*range != null ? range :*/ { s :{ c :0 , r :0 } , e :{ c :0 , r :0 } } ;
679
682
var stack /*:Array<string>*/ = [ ] , e1 , e2 , /*::type,*/ c /*:CellAddress*/ , ixti = 0 , nameidx = 0 , r , sname = "" ;
680
683
if ( ! formula [ 0 ] || ! formula [ 0 ] [ 0 ] ) return "" ;
@@ -746,24 +749,25 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
746
749
747
750
case 'PtgRef' : /* [MS-XLS] 2.5.198.84 */
748
751
/*::type = f[1][0]; */ c = shift_cell_xls ( ( f [ 1 ] [ 1 ] /*:any*/ ) , _range , opts ) ;
749
- stack . push ( encode_cell_xls ( c ) ) ;
752
+ stack . push ( encode_cell_xls ( c , biff ) ) ;
750
753
break ;
751
754
case 'PtgRefN' : /* [MS-XLS] 2.5.198.88 */
752
755
/*::type = f[1][0]; */ c = cell ? shift_cell_xls ( ( f [ 1 ] [ 1 ] /*:any*/ ) , cell , opts ) : ( f [ 1 ] [ 1 ] /*:any*/ ) ;
753
- stack . push ( encode_cell_xls ( c ) ) ;
756
+ stack . push ( encode_cell_xls ( c , biff ) ) ;
754
757
break ;
755
758
case 'PtgRef3d' : /* [MS-XLS] 2.5.198.85 */
756
759
/*::type = f[1][0]; */ ixti = /*::Number(*/ f [ 1 ] [ 1 ] /*::)*/ ; c = shift_cell_xls ( ( f [ 1 ] [ 2 ] /*:any*/ ) , _range , opts ) ;
757
760
sname = get_ixti ( supbooks , ixti , opts ) ;
758
761
var w = sname ; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars
759
- stack . push ( sname + "!" + encode_cell_xls ( c ) ) ;
762
+ stack . push ( sname + "!" + encode_cell_xls ( c , biff ) ) ;
760
763
break ;
761
764
762
765
case 'PtgFunc' : /* [MS-XLS] 2.5.198.62 */
763
766
case 'PtgFuncVar' : /* [MS-XLS] 2.5.198.63 */
764
767
/* f[1] = [argc, func, type] */
765
768
var argc /*:number*/ = ( f [ 1 ] [ 0 ] /*:any*/ ) , func /*:string*/ = ( f [ 1 ] [ 1 ] /*:any*/ ) ;
766
769
if ( ! argc ) argc = 0 ;
770
+ argc &= 0x7F ;
767
771
var args = argc == 0 ? [ ] : stack . slice ( - argc ) ;
768
772
stack . length -= argc ;
769
773
if ( func === 'User' ) func = args . shift ( ) ;
@@ -798,6 +802,7 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
798
802
stack . push ( "SUM(" + stack . pop ( ) + ")" ) ;
799
803
break ;
800
804
805
+ case 'PtgAttrBaxcel' : /* [MS-XLS] 2.5.198.33 */
801
806
case 'PtgAttrSemi' : /* [MS-XLS] 2.5.198.37 */
802
807
break ;
803
808
@@ -931,8 +936,6 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
931
936
case 'PtgElfRwV' : /* [MS-XLS] 2.5.198.55 */
932
937
throw new Error ( "Unsupported ELFs" ) ;
933
938
934
- case 'PtgAttrBaxcel' : /* [MS-XLS] 2.5.198.33 TODO -- find a test case*/
935
- throw new Error ( 'Unrecognized Formula Token: ' + String ( f ) ) ;
936
939
case 'PtgSxName' : /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
937
940
throw new Error ( 'Unrecognized Formula Token: ' + String ( f ) ) ;
938
941
case 'PtgList' : /* [MS-XLSB] 2.5.97.52 TODO -- find a test case */
0 commit comments