diff options
Diffstat (limited to 'sc/source/filter/oox/formulaparser.cxx')
-rw-r--r-- | sc/source/filter/oox/formulaparser.cxx | 273 |
1 files changed, 0 insertions, 273 deletions
diff --git a/sc/source/filter/oox/formulaparser.cxx b/sc/source/filter/oox/formulaparser.cxx index e5e88722225b..888edd6e3af9 100644 --- a/sc/source/filter/oox/formulaparser.cxx +++ b/sc/source/filter/oox/formulaparser.cxx @@ -44,15 +44,6 @@ using namespace ::com::sun::star::sheet::ReferenceFlags; using namespace ::com::sun::star::table; using namespace ::com::sun::star::uno; -namespace { - -sal_uInt16 lclReadFmlaSize( BiffInputStream& rStrm, BiffType eBiff, const sal_uInt16* pnFmlaSize ) -{ - return pnFmlaSize ? *pnFmlaSize : ((eBiff == BIFF2) ? rStrm.readuInt8() : rStrm.readuInt16()); -} - -} // namespace - // formula finalizer ========================================================== FormulaFinalizer::FormulaFinalizer( const OpCodeProvider& rOpCodeProv ) : @@ -441,12 +432,6 @@ public: FormulaType eType, SequenceInputStream& rStrm ); - /** Imports and converts a BIFF2-BIFF8 token array from the passed stream. */ - virtual ApiTokenSequence importBiffFormula( - const CellAddress& rBaseAddress, - FormulaType eType, - BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize ); - /** Tries to resolve the passed ref-id to an OLE target URL. */ OUString resolveOleTarget( sal_Int32 nRefId, bool bUseRefSheets ) const; @@ -600,12 +585,6 @@ ApiTokenSequence FormulaParserImpl::importBiff12Formula( const CellAddress&, For return ApiTokenSequence(); } -ApiTokenSequence FormulaParserImpl::importBiffFormula( const CellAddress&, FormulaType, BiffInputStream&, const sal_uInt16* ) -{ - OSL_FAIL( "FormulaParserImpl::importBiffFormula - not implemented" ); - return ApiTokenSequence(); -} - OUString FormulaParserImpl::resolveOleTarget( sal_Int32 nRefId, bool bUseRefSheets ) const { const ExternalLink* pExtLink = getExternalLinks().getExternalLink( nRefId, bUseRefSheets ).get(); @@ -1842,11 +1821,6 @@ class BiffFormulaParserImpl : public FormulaParserImpl public: explicit BiffFormulaParserImpl( const FormulaParser& rParent ); - virtual ApiTokenSequence importBiffFormula( - const CellAddress& rBaseAddr, - FormulaType eType, - BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize ) override; - private: // import token contents and create API formula token --------------------- @@ -1854,7 +1828,6 @@ private: bool importRefTokenNotAvailable( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); bool importStrToken2( BiffInputStream& rStrm ); bool importStrToken8( BiffInputStream& rStrm ); - bool importAttrToken( BiffInputStream& rStrm ); bool importSpaceToken3( BiffInputStream& rStrm ); bool importSpaceToken4( BiffInputStream& rStrm ); bool importSheetToken2( BiffInputStream& rStrm ); @@ -1862,7 +1835,6 @@ private: bool importEndSheetToken2( BiffInputStream& rStrm ); bool importEndSheetToken3( BiffInputStream& rStrm ); bool importNlrToken( BiffInputStream& rStrm ); - bool importArrayToken( BiffInputStream& rStrm ); bool importRefToken2( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); bool importRefToken8( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); bool importAreaToken2( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); @@ -1871,17 +1843,12 @@ private: bool importRef3dToken8( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); bool importArea3dToken5( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); bool importArea3dToken8( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); - bool importMemAreaToken( BiffInputStream& rStrm, bool bAddData ); - bool importMemFuncToken( BiffInputStream& rStrm ); - bool importNameToken( BiffInputStream& rStrm ); bool importNameXToken( BiffInputStream& rStrm ); bool importFuncToken2( BiffInputStream& rStrm ); bool importFuncToken4( BiffInputStream& rStrm ); bool importFuncVarToken2( BiffInputStream& rStrm ); bool importFuncVarToken4( BiffInputStream& rStrm ); bool importFuncCEToken( BiffInputStream& rStrm ); - bool importExpToken( BiffInputStream& rStrm ); - bool importTblToken( BiffInputStream& rStrm ); bool importNlrAddrToken( BiffInputStream& rStrm, bool bRow ); bool importNlrRangeToken( BiffInputStream& rStrm ); @@ -1895,7 +1862,6 @@ private: LinkSheetRange readSheetRange8( BiffInputStream& rStrm ); void swapStreamPosition( BiffInputStream& rStrm ); - void skipMemAreaAddData( BiffInputStream& rStrm ); bool readNlrSAddrAddData( BiffNlr& orNlr, BiffInputStream& rStrm, bool bRow ); bool readNlrSRangeAddData( BiffNlr& orNlr, bool& orbIsRow, BiffInputStream& rStrm ); @@ -2075,110 +2041,6 @@ BiffFormulaParserImpl::BiffFormulaParserImpl( const FormulaParser& rParent ) : } } -ApiTokenSequence BiffFormulaParserImpl::importBiffFormula( const CellAddress& rBaseAddr, - FormulaType eType, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize ) -{ - initializeImport( rBaseAddr, eType ); - mnCurrRefId = 0; - - sal_uInt16 nFmlaSize = lclReadFmlaSize( rStrm, getBiff(), pnFmlaSize ); - sal_Int64 nEndPos = mnAddDataPos = rStrm.tell() + nFmlaSize; - - bool bOk = true; - while( bOk && !rStrm.isEof() && (rStrm.tell() < nEndPos) ) - { - sal_uInt8 nTokenId; - rStrm >> nTokenId; - sal_uInt8 nTokenClass = nTokenId & BIFF_TOKCLASS_MASK; - sal_uInt8 nBaseId = nTokenId & BIFF_TOKID_MASK; - - bOk = !getFlag( nTokenId, BIFF_TOKFLAG_INVALID ); - if( bOk ) - { - if( nTokenClass == BIFF_TOKCLASS_NONE ) - { - // base tokens - switch( nBaseId ) - { - case BIFF_TOKID_EXP: bOk = importExpToken( rStrm ); break; - case BIFF_TOKID_TBL: bOk = importTblToken( rStrm ); break; - case BIFF_TOKID_ADD: bOk = pushBinaryOperator( OPCODE_ADD ); break; - case BIFF_TOKID_SUB: bOk = pushBinaryOperator( OPCODE_SUB ); break; - case BIFF_TOKID_MUL: bOk = pushBinaryOperator( OPCODE_MULT ); break; - case BIFF_TOKID_DIV: bOk = pushBinaryOperator( OPCODE_DIV ); break; - case BIFF_TOKID_POWER: bOk = pushBinaryOperator( OPCODE_POWER ); break; - case BIFF_TOKID_CONCAT: bOk = pushBinaryOperator( OPCODE_CONCAT ); break; - case BIFF_TOKID_LT: bOk = pushBinaryOperator( OPCODE_LESS ); break; - case BIFF_TOKID_LE: bOk = pushBinaryOperator( OPCODE_LESS_EQUAL ); break; - case BIFF_TOKID_EQ: bOk = pushBinaryOperator( OPCODE_EQUAL ); break; - case BIFF_TOKID_GE: bOk = pushBinaryOperator( OPCODE_GREATER_EQUAL ); break; - case BIFF_TOKID_GT: bOk = pushBinaryOperator( OPCODE_GREATER ); break; - case BIFF_TOKID_NE: bOk = pushBinaryOperator( OPCODE_NOT_EQUAL ); break; - case BIFF_TOKID_ISECT: bOk = pushBinaryOperator( OPCODE_INTERSECT ); break; - case BIFF_TOKID_LIST: bOk = pushBinaryOperator( OPCODE_LIST ); break; - case BIFF_TOKID_RANGE: bOk = pushBinaryOperator( OPCODE_RANGE ); break; - case BIFF_TOKID_UPLUS: bOk = pushUnaryPreOperator( OPCODE_PLUS_SIGN ); break; - case BIFF_TOKID_UMINUS: bOk = pushUnaryPreOperator( OPCODE_MINUS_SIGN ); break; - case BIFF_TOKID_PERCENT: bOk = pushUnaryPostOperator( OPCODE_PERCENT ); break; - case BIFF_TOKID_PAREN: bOk = pushParenthesesOperator(); break; - case BIFF_TOKID_MISSARG: bOk = pushOperand( OPCODE_MISSING ); break; - case BIFF_TOKID_STR: bOk = (this->*mpImportStrToken)( rStrm ); break; - case BIFF_TOKID_NLR: bOk = (this->*mpImportNlrToken)( rStrm ); break; - case BIFF_TOKID_ATTR: bOk = importAttrToken( rStrm ); break; - case BIFF_TOKID_SHEET: bOk = (this->*mpImportSheetToken)( rStrm ); break; - case BIFF_TOKID_ENDSHEET: bOk = (this->*mpImportEndSheetToken)( rStrm ); break; - case BIFF_TOKID_ERR: bOk = pushBiffErrorOperand( rStrm.readuInt8() ); break; - case BIFF_TOKID_BOOL: bOk = pushBiffBoolOperand( rStrm.readuInt8() ); break; - case BIFF_TOKID_INT: bOk = pushValueOperand< double >( rStrm.readuInt16() ); break; - case BIFF_TOKID_NUM: bOk = pushValueOperand( rStrm.readDouble() ); break; - default: bOk = false; - } - } - else - { - // classified tokens - switch( nBaseId ) - { - case BIFF_TOKID_ARRAY: bOk = importArrayToken( rStrm ); break; - case BIFF_TOKID_FUNC: bOk = (this->*mpImportFuncToken)( rStrm ); break; - case BIFF_TOKID_FUNCVAR: bOk = (this->*mpImportFuncVarToken)( rStrm ); break; - case BIFF_TOKID_NAME: bOk = importNameToken( rStrm ); break; - case BIFF_TOKID_REF: bOk = (this->*mpImportRefToken)( rStrm, false, false ); break; - case BIFF_TOKID_AREA: bOk = (this->*mpImportAreaToken)( rStrm, false, false ); break; - case BIFF_TOKID_MEMAREA: bOk = importMemAreaToken( rStrm, true ); break; - case BIFF_TOKID_MEMERR: bOk = importMemAreaToken( rStrm, false ); break; - case BIFF_TOKID_MEMNOMEM: bOk = importMemAreaToken( rStrm, false ); break; - case BIFF_TOKID_MEMFUNC: bOk = importMemFuncToken( rStrm ); break; - case BIFF_TOKID_REFERR: bOk = (this->*mpImportRefToken)( rStrm, true, false ); break; - case BIFF_TOKID_AREAERR: bOk = (this->*mpImportAreaToken)( rStrm, true, false ); break; - case BIFF_TOKID_REFN: bOk = (this->*mpImportRefToken)( rStrm, false, true ); break; - case BIFF_TOKID_AREAN: bOk = (this->*mpImportAreaToken)( rStrm, false, true ); break; - case BIFF_TOKID_MEMAREAN: bOk = importMemFuncToken( rStrm ); break; - case BIFF_TOKID_MEMNOMEMN: bOk = importMemFuncToken( rStrm ); break; - case BIFF_TOKID_FUNCCE: bOk = (this->*mpImportFuncCEToken)( rStrm ); break; - case BIFF_TOKID_NAMEX: bOk = (this->*mpImportNameXToken)( rStrm ); break; - case BIFF_TOKID_REF3D: bOk = (this->*mpImportRef3dToken)( rStrm, false, mbRelativeAsOffset ); break; - case BIFF_TOKID_AREA3D: bOk = (this->*mpImportArea3dToken)( rStrm, false, mbRelativeAsOffset ); break; - case BIFF_TOKID_REFERR3D: bOk = (this->*mpImportRef3dToken)( rStrm, true, mbRelativeAsOffset ); break; - case BIFF_TOKID_AREAERR3D: bOk = (this->*mpImportArea3dToken)( rStrm, true, mbRelativeAsOffset ); break; - default: bOk = false; - } - } - } - } - - // build and finalize the token sequence - ApiTokenSequence aFinalTokens; - if( bOk && (rStrm.tell() == nEndPos) ) - aFinalTokens = finalizeImport(); - - // seek behind additional token data of tArray, tMemArea, tNlr tokens - rStrm.seek( mnAddDataPos ); - - // return the final token sequence - return aFinalTokens; -} - // import token contents and create API formula token ------------------------- bool BiffFormulaParserImpl::importTokenNotAvailable( BiffInputStream& ) @@ -2204,37 +2066,6 @@ bool BiffFormulaParserImpl::importStrToken8( BiffInputStream& rStrm ) return pushValueOperand( rStrm.readUniStringBody( rStrm.readuInt8(), mbAllowNulChars ) ); } -bool BiffFormulaParserImpl::importAttrToken( BiffInputStream& rStrm ) -{ - bool bOk = true; - sal_uInt8 nType; - rStrm >> nType; - switch( nType ) - { - case 0: // sometimes, tAttrSkip tokens miss the type flag - case BIFF_TOK_ATTR_VOLATILE: - case BIFF_TOK_ATTR_IF: - case BIFF_TOK_ATTR_SKIP: - case BIFF_TOK_ATTR_ASSIGN: - rStrm.skip( mnAttrDataSize ); - break; - case BIFF_TOK_ATTR_CHOOSE: - rStrm.skip( mnAttrDataSize * (1 + ((getBiff() == BIFF2) ? rStrm.readuInt8() : rStrm.readuInt16())) ); - break; - case BIFF_TOK_ATTR_SUM: - rStrm.skip( mnAttrDataSize ); - bOk = pushBiffFunction( BIFF_FUNC_SUM, 1 ); - break; - case BIFF_TOK_ATTR_SPACE: - case BIFF_TOK_ATTR_SPACE_VOLATILE: - bOk = (this->*mpImportSpaceToken)( rStrm ); - break; - default: - bOk = false; - } - return bOk; -} - bool BiffFormulaParserImpl::importSpaceToken3( BiffInputStream& rStrm ) { rStrm.skip( 2 ); @@ -2322,68 +2153,6 @@ bool BiffFormulaParserImpl::importNlrToken( BiffInputStream& rStrm ) return bOk; } -bool BiffFormulaParserImpl::importArrayToken( BiffInputStream& rStrm ) -{ - rStrm.skip( mnArraySize ); - - // start token array with opening brace and leading spaces - pushOperand( OPCODE_ARRAY_OPEN ); - size_t nOpSize = popOperandSize(); - size_t nOldArraySize = getFormulaSize(); - bool bBiff8 = getBiff() == BIFF8; - - // read array size - swapStreamPosition( rStrm ); - sal_uInt16 nCols = rStrm.readuInt8(); - sal_uInt16 nRows = rStrm.readuInt16(); - if( bBiff8 ) { ++nCols; ++nRows; } else if( nCols == 0 ) nCols = 256; - OSL_ENSURE( (nCols > 0) && (nRows > 0), "BiffFormulaParserImpl::importArrayToken - empty array" ); - - // read array values and build token array - for( sal_uInt16 nRow = 0; !rStrm.isEof() && (nRow < nRows); ++nRow ) - { - if( nRow > 0 ) - appendRawToken( OPCODE_ARRAY_ROWSEP ); - for( sal_uInt16 nCol = 0; !rStrm.isEof() && (nCol < nCols); ++nCol ) - { - if( nCol > 0 ) - appendRawToken( OPCODE_ARRAY_COLSEP ); - switch( rStrm.readuInt8() ) - { - case BIFF_DATATYPE_EMPTY: - appendRawToken( OPCODE_PUSH ) <<= OUString(); - rStrm.skip( 8 ); - break; - case BIFF_DATATYPE_DOUBLE: - appendRawToken( OPCODE_PUSH ) <<= rStrm.readDouble(); - break; - case BIFF_DATATYPE_STRING: - appendRawToken( OPCODE_PUSH ) <<= bBiff8 ? - rStrm.readUniString( mbAllowNulChars ) : - rStrm.readByteStringUC( false, getTextEncoding(), mbAllowNulChars ); - break; - case BIFF_DATATYPE_BOOL: - appendRawToken( OPCODE_PUSH ) <<= (static_cast< double >( (rStrm.readuInt8() == BIFF_TOK_BOOL_FALSE) ? 0.0 : 1.0 )); - rStrm.skip( 7 ); - break; - case BIFF_DATATYPE_ERROR: - appendRawToken( OPCODE_PUSH ) <<= BiffHelper::calcDoubleFromError( rStrm.readuInt8() ); - rStrm.skip( 7 ); - break; - default: - OSL_FAIL( "BiffFormulaParserImpl::importArrayToken - unknown data type" ); - appendRawToken( OPCODE_PUSH ) <<= BiffHelper::calcDoubleFromError( BIFF_ERR_NA ); - } - } - } - swapStreamPosition( rStrm ); - - // close token array and set resulting operand size - appendRawToken( OPCODE_ARRAY_CLOSE ); - pushOperandSize( nOpSize + getFormulaSize() - nOldArraySize ); - return true; -} - bool BiffFormulaParserImpl::importRefToken2( BiffInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) { BinSingleRef2d aRef; @@ -2444,26 +2213,6 @@ bool BiffFormulaParserImpl::importArea3dToken8( BiffInputStream& rStrm, bool bDe return pushReferenceOperand( aSheetRange, aRef, bDeleted, bRelativeAsOffset ); } -bool BiffFormulaParserImpl::importMemAreaToken( BiffInputStream& rStrm, bool bAddData ) -{ - rStrm.skip( mnMemAreaSize ); - if( bAddData ) - skipMemAreaAddData( rStrm ); - return true; -} - -bool BiffFormulaParserImpl::importMemFuncToken( BiffInputStream& rStrm ) -{ - rStrm.skip( mnMemFuncSize ); - return true; -} - -bool BiffFormulaParserImpl::importNameToken( BiffInputStream& rStrm ) -{ - sal_uInt16 nNameId = readNameId( rStrm ); - return (mnCurrRefId > 0) ? pushBiffExtName( mnCurrRefId, nNameId ) : pushBiffName( nNameId ); -} - bool BiffFormulaParserImpl::importNameXToken( BiffInputStream& rStrm ) { sal_Int32 nRefId = readRefId( rStrm ); @@ -2509,20 +2258,6 @@ bool BiffFormulaParserImpl::importFuncCEToken( BiffInputStream& rStrm ) return pushBiffFunction( nCmdId, nParamCount ); } -bool BiffFormulaParserImpl::importExpToken( BiffInputStream& rStrm ) -{ - BinAddress aBaseAddr; - aBaseAddr.read( rStrm ); - return pushSpecialTokenOperand( aBaseAddr, false ); -} - -bool BiffFormulaParserImpl::importTblToken( BiffInputStream& rStrm ) -{ - BinAddress aBaseAddr; - aBaseAddr.read( rStrm ); - return pushSpecialTokenOperand( aBaseAddr, true ); -} - bool BiffFormulaParserImpl::importNlrAddrToken( BiffInputStream& rStrm, bool bRow ) { BiffNlr aNlr; @@ -2599,14 +2334,6 @@ void BiffFormulaParserImpl::swapStreamPosition( BiffInputStream& rStrm ) mnAddDataPos = nRecPos; } -void BiffFormulaParserImpl::skipMemAreaAddData( BiffInputStream& rStrm ) -{ - swapStreamPosition( rStrm ); - sal_Int32 nCount = rStrm.readuInt16(); - rStrm.skip( ((getBiff() == BIFF8) ? 8 : 6) * nCount ); - swapStreamPosition( rStrm ); -} - bool BiffFormulaParserImpl::readNlrSAddrAddData( BiffNlr& orNlr, BiffInputStream& rStrm, bool bRow ) { bool bIsRow = false; |