From 1d0727a104d76210814f41c1169df318e40c9d80 Mon Sep 17 00:00:00 2001 From: Kohei Yoshida Date: Mon, 27 Aug 2018 11:06:17 -0400 Subject: [PATCH] Update orcus to 0.14.0. And make all necessary adjustments for the new version of orcus. Change-Id: I0dc207162a3ddfaad6da198a3d13b65f530757d5 Reviewed-on: https://gerrit.libreoffice.org/59884 Tested-by: Jenkins Reviewed-by: Kohei Yoshida --- RepositoryExternal.mk | 4 +- configure.ac | 2 +- download.lst | 4 +- .../0001-Missing-header-for-std-tolower.patch | 24 ++ external/liborcus/ExternalPackage_liborcus.mk | 8 +- external/liborcus/ExternalProject_liborcus.mk | 4 +- external/liborcus/Library_orcus.mk | 2 + external/liborcus/UnpackedTarball_liborcus.mk | 1 + external/liborcus/gcc9.patch.0 | 3 +- sc/source/filter/inc/orcusinterface.hxx | 107 ++++-- sc/source/filter/orcus/interface.cxx | 322 +++++++++++++----- sc/source/filter/orcus/xmlcontext.cxx | 5 +- 12 files changed, 360 insertions(+), 126 deletions(-) create mode 100644 external/liborcus/0001-Missing-header-for-std-tolower.patch diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk index cec79cc105e8..f172765a84f8 100644 --- a/RepositoryExternal.mk +++ b/RepositoryExternal.mk @@ -3295,7 +3295,7 @@ $(call gb_LinkTarget_set_include,$(1),\ ) $(call gb_LinkTarget_add_libs,$(1),\ - -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/liborcus/.libs -lorcus-0.13 \ + -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/liborcus/.libs -lorcus-0.14 \ ) $(if $(SYSTEM_BOOST), \ @@ -3314,7 +3314,7 @@ $(call gb_LinkTarget_set_include,$(1),\ ) $(call gb_LinkTarget_add_libs,$(1),\ - -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/parser/.libs -lorcus-parser-0.13 \ + -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/parser/.libs -lorcus-parser-0.14 \ ) endef diff --git a/configure.ac b/configure.ac index 3c9e5dc5e908..a60a3e72689f 100644 --- a/configure.ac +++ b/configure.ac @@ -9196,7 +9196,7 @@ AC_SUBST(ENABLE_FUZZERS) dnl =================================================================== dnl Orcus dnl =================================================================== -libo_CHECK_SYSTEM_MODULE([orcus],[ORCUS],[liborcus-0.13 >= 0.13.3]) +libo_CHECK_SYSTEM_MODULE([orcus],[ORCUS],[liborcus-0.14 >= 0.14.0]) if test "$with_system_orcus" != "yes"; then if test "$SYSTEM_BOOST" = "TRUE"; then # =========================================================== diff --git a/download.lst b/download.lst index 1ed75b36f3b3..3532e2be3aa3 100644 --- a/download.lst +++ b/download.lst @@ -194,8 +194,8 @@ export OPENLDAP_SHA256SUM := cdd6cffdebcd95161a73305ec13fc7a78e9707b46ca9f84fb89 export OPENLDAP_TARBALL := openldap-2.4.45.tgz export OPENSSL_SHA256SUM := ae51d08bba8a83958e894946f15303ff894d75c2b8bbd44a852b64e3fe11d0d6 export OPENSSL_TARBALL := openssl-1.0.2r.tar.gz -export ORCUS_SHA256SUM := bc01b1b3e9091416f498840d3c19a1aa2704b448100e7f6b80eefe88aab06d5b -export ORCUS_TARBALL := liborcus-0.13.4.tar.gz +export ORCUS_SHA256SUM := 7bcfac3f4f490540292cfc87d3fde7b47eafa8450afa1e1a2c181d8293dcd4ef +export ORCUS_TARBALL := liborcus-0.14.0.tar.gz export OWNCLOUD_ANDROID_LIB_SHA256SUM := b18b3e3ef7fae6a79b62f2bb43cc47a5346b6330f6a383dc4be34439aca5e9fb export OWNCLOUD_ANDROID_LIB_TARBALL := owncloud-android-library-0.9.4-no-binary-deps.tar.gz export PAGEMAKER_SHA256SUM := 66adacd705a7d19895e08eac46d1e851332adf2e736c566bef1164e7a442519d diff --git a/external/liborcus/0001-Missing-header-for-std-tolower.patch b/external/liborcus/0001-Missing-header-for-std-tolower.patch new file mode 100644 index 000000000000..2e00be92a872 --- /dev/null +++ b/external/liborcus/0001-Missing-header-for-std-tolower.patch @@ -0,0 +1,24 @@ +From 3a6bb93a382b4d5f1463ee3fdd54cab7048ff996 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Fri, 31 Aug 2018 16:07:06 -0400 +Subject: [PATCH] Missing header for std::tolower. + +--- + src/parser/sax_token_parser.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/parser/sax_token_parser.cpp b/src/parser/sax_token_parser.cpp +index 9790b498..44ba5844 100644 +--- a/src/parser/sax_token_parser.cpp ++++ b/src/parser/sax_token_parser.cpp +@@ -9,6 +9,7 @@ + #include "orcus/tokens.hpp" + + #include ++#include + + namespace orcus { + +-- +2.17.1 + diff --git a/external/liborcus/ExternalPackage_liborcus.mk b/external/liborcus/ExternalPackage_liborcus.mk index 32382b7d89a1..ffa0b38bea19 100644 --- a/external/liborcus/ExternalPackage_liborcus.mk +++ b/external/liborcus/ExternalPackage_liborcus.mk @@ -12,11 +12,11 @@ $(eval $(call gb_ExternalPackage_ExternalPackage,liborcus,liborcus)) $(eval $(call gb_ExternalPackage_use_external_project,liborcus,liborcus)) ifeq ($(OS),MACOSX) -$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.13.0.dylib,src/liborcus/.libs/liborcus-0.13.0.dylib)) -$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.13.0.dylib,src/parser/.libs/liborcus-parser-0.13.0.dylib)) +$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.14.0.dylib,src/liborcus/.libs/liborcus-0.14.0.dylib)) +$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.14.0.dylib,src/parser/.libs/liborcus-parser-0.14.0.dylib)) else ifeq ($(DISABLE_DYNLOADING),) -$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.13.so.0,src/liborcus/.libs/liborcus-0.13.so.0.0.0)) -$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.13.so.0,src/parser/.libs/liborcus-parser-0.13.so.0.0.0)) +$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.14.so.0,src/liborcus/.libs/liborcus-0.14.so.0.0.0)) +$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.14.so.0,src/parser/.libs/liborcus-parser-0.14.so.0.0.0)) endif # vim: set noet sw=4 ts=4: diff --git a/external/liborcus/ExternalProject_liborcus.mk b/external/liborcus/ExternalProject_liborcus.mk index 928c78e3a267..1aa591228f40 100644 --- a/external/liborcus/ExternalProject_liborcus.mk +++ b/external/liborcus/ExternalProject_liborcus.mk @@ -114,8 +114,8 @@ $(call gb_ExternalProject_get_state_target,liborcus,build) : $(MAKE) \ $(if $(filter MACOSX,$(OS)),\ && $(PERL) $(SRCDIR)/solenv/bin/macosx-change-install-names.pl shl OOO \ - $(EXTERNAL_WORKDIR)/src/liborcus/.libs/liborcus-0.13.0.dylib \ - $(EXTERNAL_WORKDIR)/src/parser/.libs/liborcus-parser-0.13.0.dylib \ + $(EXTERNAL_WORKDIR)/src/liborcus/.libs/liborcus-0.14.0.dylib \ + $(EXTERNAL_WORKDIR)/src/parser/.libs/liborcus-parser-0.14.0.dylib \ ) \ ) diff --git a/external/liborcus/Library_orcus.mk b/external/liborcus/Library_orcus.mk index 6457ec4afc0c..1f026c425244 100644 --- a/external/liborcus/Library_orcus.mk +++ b/external/liborcus/Library_orcus.mk @@ -55,6 +55,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,orcus,\ UnpackedTarball/liborcus/src/liborcus/detection_result \ UnpackedTarball/liborcus/src/liborcus/dom_tree \ UnpackedTarball/liborcus/src/liborcus/format_detection \ + UnpackedTarball/liborcus/src/liborcus/formula_result \ UnpackedTarball/liborcus/src/liborcus/global \ UnpackedTarball/liborcus/src/liborcus/gnumeric_cell_context \ UnpackedTarball/liborcus/src/liborcus/gnumeric_context \ @@ -96,6 +97,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,orcus,\ UnpackedTarball/liborcus/src/liborcus/orcus_xlsx \ UnpackedTarball/liborcus/src/liborcus/orcus_xml \ UnpackedTarball/liborcus/src/liborcus/session_context \ + UnpackedTarball/liborcus/src/liborcus/spreadsheet_iface_util \ UnpackedTarball/liborcus/src/liborcus/spreadsheet_interface \ UnpackedTarball/liborcus/src/liborcus/spreadsheet_types \ UnpackedTarball/liborcus/src/liborcus/string_helper \ diff --git a/external/liborcus/UnpackedTarball_liborcus.mk b/external/liborcus/UnpackedTarball_liborcus.mk index 215bd4b8cc15..f637cc73db46 100644 --- a/external/liborcus/UnpackedTarball_liborcus.mk +++ b/external/liborcus/UnpackedTarball_liborcus.mk @@ -19,5 +19,6 @@ $(eval $(call gb_UnpackedTarball_add_patches,liborcus,\ external/liborcus/0001-workaround-a-linking-problem-on-windows.patch \ external/liborcus/rpath.patch.0 \ + external/liborcus/0001-Missing-header-for-std-tolower.patch \ )) ifeq ($(OS),WNT) diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index 028fb4126f01..dce0d5b0a64e 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -54,6 +54,7 @@ public: ScOrcusGlobalSettings(ScDocumentImport& rDoc); virtual void set_origin_date(int year, int month, int day) override; + virtual void set_character_set(orcus::character_set_t cs) override; virtual void set_default_formula_grammar(orcus::spreadsheet::formula_grammar_t grammar) override; virtual orcus::spreadsheet::formula_grammar_t get_default_formula_grammar() const override; @@ -181,7 +182,7 @@ public: virtual ~ScOrcusAutoFilter() override; - virtual void set_range(const char* p_ref, size_t n_ref) override; + virtual void set_range(const orcus::spreadsheet::range_t& range) override; virtual void set_column(orcus::spreadsheet::col_t col) override; @@ -214,22 +215,95 @@ public: virtual void set_merge_cell_range(const orcus::spreadsheet::range_t& range) override; }; +class ScOrcusSheet; + +class ScOrcusFormula : public orcus::spreadsheet::iface::import_formula +{ + enum class ResultType { NotSet, String, Value, Empty }; + + friend class ScOrcusSheet; + + ScOrcusSheet& mrSheet; + + SCCOL mnCol; + SCROW mnRow; + OUString maFormula; + formula::FormulaGrammar::Grammar meGrammar; + size_t mnSharedFormulaIndex; + bool mbShared; + + ResultType meResType; + size_t mnResult; // result string index. + double mfResult; + + void reset(); + +public: + ScOrcusFormula( ScOrcusSheet& rSheet ); + virtual ~ScOrcusFormula() override; + + virtual void set_position(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col) override; + virtual void set_formula(orcus::spreadsheet::formula_grammar_t grammar, const char* p, size_t n) override; + virtual void set_shared_formula_index(size_t index) override; + virtual void set_result_value(double value) override; + virtual void set_result_string(size_t sindex) override; + virtual void set_result_empty() override; + virtual void set_result_bool(bool value) override; + virtual void commit() override; +}; + +class ScOrcusArrayFormula : public orcus::spreadsheet::iface::import_array_formula +{ + friend class ScOrcusSheet; + + ScOrcusSheet& mrSheet; + + SCCOL mnCol; + SCROW mnRow; + uint32_t mnColRange; + uint32_t mnRowRange; + OUString maFormula; + formula::FormulaGrammar::Grammar meGrammar; + + void reset(); + +public: + ScOrcusArrayFormula( ScOrcusSheet& rSheet ); + virtual ~ScOrcusArrayFormula() override; + + virtual void set_range(const orcus::spreadsheet::range_t& range) override; + virtual void set_formula(orcus::spreadsheet::formula_grammar_t grammar, const char* p, size_t n) override; + virtual void set_result_value(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, double value) override; + virtual void set_result_string(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, size_t sindex) override; + virtual void set_result_empty(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col) override; + virtual void set_result_bool(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, bool value) override; + virtual void commit() override; +}; + class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet { + friend class ScOrcusFormula; + friend class ScOrcusArrayFormula; + ScDocumentImport& mrDoc; SCTAB mnTab; ScOrcusFactory& mrFactory; ScOrcusStyles& mrStyles; sc::SharedFormulaGroups maFormulaGroups; + ScOrcusAutoFilter maAutoFilter; ScOrcusSheetProperties maProperties; ScOrcusConditionalFormat maConditionalFormat; ScOrcusNamedExpression maNamedExpressions; + ScOrcusFormula maFormula; + ScOrcusArrayFormula maArrayFormula; int mnCellCount; void cellInserted(); + ScDocumentImport& getDoc(); + public: ScOrcusSheet(ScDocumentImport& rDoc, SCTAB nTab, ScOrcusFactory& rFactory); @@ -238,6 +312,8 @@ public: virtual orcus::spreadsheet::iface::import_sheet_properties* get_sheet_properties() override; virtual orcus::spreadsheet::iface::import_conditional_format* get_conditional_format() override; virtual orcus::spreadsheet::iface::import_named_expression* get_named_expression() override; + virtual orcus::spreadsheet::iface::import_formula* get_formula() override; + virtual orcus::spreadsheet::iface::import_array_formula* get_array_formula() override; // Orcus import interface virtual void set_auto(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, const char* p, size_t n) override; @@ -251,33 +327,13 @@ public: virtual void set_format(orcus::spreadsheet::row_t row_start, orcus::spreadsheet::col_t col_start, orcus::spreadsheet::row_t row_end, orcus::spreadsheet::col_t col_end, size_t xf_index) override; - virtual void set_formula(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, const char* p, size_t n) override; - virtual void set_formula_result(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, const char* p, size_t n) override; - virtual void set_formula_result(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, double val) override; - - virtual void set_shared_formula( - orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, size_t sindex, - const char* p_formula, size_t n_formula) override; - - virtual void set_shared_formula( - orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, size_t sindex, - const char* p_formula, size_t n_formula, const char* p_range, size_t n_range) override; - - virtual void set_shared_formula(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, size_t sindex) override; - - virtual void set_array_formula( - orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, - const char* p, size_t n, orcus::spreadsheet::row_t array_rows, orcus::spreadsheet::col_t array_cols) override; - - virtual void set_array_formula( - orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, - const char* p, size_t n, const char* p_range, size_t n_range) override; - virtual orcus::spreadsheet::range_size_t get_sheet_size() const override; SCTAB getIndex() const { return mnTab; } const sc::SharedFormulaGroups& getSharedFormulaGroups() const; + sc::SharedFormulaGroups& getSharedFormulaGroups(); + ScOrcusFactory& getFactory(); }; class ScOrcusStyles : public orcus::spreadsheet::iface::import_styles @@ -312,7 +368,7 @@ private: struct fill { - OUString maPattern; + orcus::spreadsheet::fill_pattern_t mePattern; Color maFgColor; Color maBgColor; @@ -446,7 +502,7 @@ public: // fill virtual void set_fill_count(size_t n) override; - virtual void set_fill_pattern_type(const char* s, size_t n) override; + virtual void set_fill_pattern_type(orcus::spreadsheet::fill_pattern_t fp) override; virtual void set_fill_fg_color(orcus::spreadsheet::color_elem_t alpha, orcus::spreadsheet::color_elem_t red, orcus::spreadsheet::color_elem_t green, orcus::spreadsheet::color_elem_t blue) override; virtual void set_fill_bg_color(orcus::spreadsheet::color_elem_t alpha, orcus::spreadsheet::color_elem_t red, orcus::spreadsheet::color_elem_t green, orcus::spreadsheet::color_elem_t blue) override; virtual size_t commit_fill() override; @@ -580,6 +636,7 @@ public: size_t appendString(const OUString& rStr); size_t addString(const OUString& rStr); + const OUString* getString(size_t nIndex) const; void pushCellStoreAutoToken( const ScAddress& rPos, const OUString& rVal ); void pushCellStoreToken( const ScAddress& rPos, uint32_t nStrIndex ); diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx index dcf3e83d7eae..7b8425d3007d 100644 --- a/sc/source/filter/orcus/interface.cxx +++ b/sc/source/filter/orcus/interface.cxx @@ -101,6 +101,11 @@ void ScOrcusGlobalSettings::set_origin_date(int year, int month, int day) mrDoc.setOriginDate(year, month, day); } +void ScOrcusGlobalSettings::set_character_set(orcus::character_set_t /*cs*/) +{ + // TODO +} + void ScOrcusGlobalSettings::set_default_formula_grammar(os::formula_grammar_t grammar) { meCalcGrammar = getCalcGrammarFromOrcus(grammar); @@ -463,6 +468,11 @@ size_t ScOrcusFactory::addString(const OUString& rStr) return appendString(rStr); } +const OUString* ScOrcusFactory::getString(size_t nIndex) const +{ + return nIndex < maStrings.size() ? &maStrings[nIndex] : nullptr; +} + void ScOrcusFactory::pushCellStoreAutoToken( const ScAddress& rPos, const OUString& rVal ) { maCellStoreTokens.emplace_back(rPos, CellStoreToken::Type::Auto); @@ -816,10 +826,197 @@ ScOrcusSheet::ScOrcusSheet(ScDocumentImport& rDoc, SCTAB nTab, ScOrcusFactory& r maProperties(mnTab, mrDoc), maConditionalFormat(mnTab, rDoc.getDoc()), maNamedExpressions(rDoc, rFactory.getGlobalSettings(), nTab), + maFormula(*this), + maArrayFormula(*this), mnCellCount(0) { } +void ScOrcusFormula::reset() +{ + mnCol = -1; + mnRow = -1; + maFormula.clear(); + meGrammar = formula::FormulaGrammar::GRAM_UNSPECIFIED; + mnSharedFormulaIndex = 0; + mbShared = false; + meResType = ResultType::NotSet; + mnResult = 0; + mfResult = 0.0; +} + +ScOrcusFormula::ScOrcusFormula( ScOrcusSheet& rSheet ) : + mrSheet(rSheet), + mnCol(-1), + mnRow(-1), + meGrammar(formula::FormulaGrammar::GRAM_UNSPECIFIED), + mnSharedFormulaIndex(0), + mbShared(false), + meResType(ResultType::NotSet), + mnResult(0), + mfResult(0.0) {} + +ScOrcusFormula::~ScOrcusFormula() {} + +void ScOrcusFormula::set_position(os::row_t row, os::col_t col) +{ + mnCol = col; + mnRow = row; +} + +void ScOrcusFormula::set_formula(os::formula_grammar_t grammar, const char* p, size_t n) +{ + maFormula = OUString(p, n, RTL_TEXTENCODING_UTF8); + meGrammar = getCalcGrammarFromOrcus(grammar); +} + +void ScOrcusFormula::set_shared_formula_index(size_t index) +{ + mnSharedFormulaIndex = index; + mbShared = true; +} + +void ScOrcusFormula::set_result_value(double value) +{ + meResType = ResultType::Value; + mfResult = value; +} + +void ScOrcusFormula::set_result_string(size_t sindex) +{ + meResType = ResultType::String; + mnResult = sindex; +} + +void ScOrcusFormula::set_result_empty() +{ + meResType = ResultType::Empty; +} + +void ScOrcusFormula::set_result_bool(bool value) +{ + meResType = ResultType::Value; + mfResult = value ? 1.0 : 0.0; +} + +void ScOrcusFormula::commit() +{ + ScOrcusFactory& rFactory = mrSheet.getFactory(); + sc::SharedFormulaGroups& rGroups = mrSheet.getSharedFormulaGroups(); + ScAddress aPos(mnCol, mnRow, mrSheet.getIndex()); + + if (mbShared) + { + if (maFormula.isEmpty()) + { + // shared formula that references existing formula token. + const ScTokenArray* pArray = rGroups.get(mnSharedFormulaIndex); + if (!pArray) + return; + } + else + { + // topmost shared formula with new formula token. + + // Compile the formula expression into tokens. + ScCompiler aComp(&mrSheet.getDoc().getDoc(), aPos, meGrammar); + ScTokenArray* pArray = aComp.CompileString(maFormula); + if (!pArray) + // Tokenization failed. + return; + + rGroups.set(mnSharedFormulaIndex, pArray); + } + rFactory.pushSharedFormulaToken(aPos, mnSharedFormulaIndex); + } + else + { + // non-shared formula + rFactory.pushCellStoreToken(aPos, maFormula, meGrammar); + } + + switch (meResType) + { + case ResultType::String: + { + const OUString* pStr = rFactory.getString(mnResult); + if (pStr) + rFactory.pushFormulaResult(aPos, *pStr); + break; + } + case ResultType::Value: + rFactory.pushFormulaResult(aPos, mfResult); + break; + default: + ; + } + + mrSheet.cellInserted(); +} + +void ScOrcusArrayFormula::reset() +{ + mnCol = -1; + mnRow = -1; + mnColRange = 0; + mnRowRange = 0; + + maFormula.clear(); + meGrammar = formula::FormulaGrammar::GRAM_UNSPECIFIED; +} + +ScOrcusArrayFormula::ScOrcusArrayFormula( ScOrcusSheet& rSheet ) : + mrSheet(rSheet), + mnCol(-1), + mnRow(-1), + mnColRange(0), + mnRowRange(0), + meGrammar(formula::FormulaGrammar::GRAM_UNSPECIFIED) {} + +ScOrcusArrayFormula::~ScOrcusArrayFormula() {} + +void ScOrcusArrayFormula::set_range(const os::range_t& range) +{ + mnCol = range.first.column; + mnRow = range.first.row; + + mnColRange = range.last.column - range.first.column + 1; + mnRowRange = range.last.row - range.first.column + 1; +} + +void ScOrcusArrayFormula::set_formula(os::formula_grammar_t grammar, const char* p, size_t n) +{ + meGrammar = getCalcGrammarFromOrcus(grammar); + maFormula = OUString(p, n, RTL_TEXTENCODING_UTF8); +} + +void ScOrcusArrayFormula::set_result_value(os::row_t /*row*/, os::col_t /*col*/, double /*value*/) +{ + // TODO : implement result cache for matrix +} + +void ScOrcusArrayFormula::set_result_string(os::row_t /*row*/, os::col_t /*col*/, size_t /*sindex*/) +{ + // TODO : implement result cache for matrix +} + +void ScOrcusArrayFormula::set_result_empty(os::row_t /*row*/, os::col_t /*col*/) +{ + // TODO : implement result cache for matrix +} + +void ScOrcusArrayFormula::set_result_bool(os::row_t /*row*/, os::col_t /*col*/, bool /*value*/) +{ + // TODO : implement result cache for matrix +} + +void ScOrcusArrayFormula::commit() +{ + ScAddress aPos(mnCol, mnRow, mrSheet.getIndex()); + mrSheet.getFactory().pushMatrixFormulaToken(aPos, maFormula, meGrammar, mnRowRange, mnColRange); + mrSheet.cellInserted(); +} + void ScOrcusSheet::cellInserted() { ++mnCellCount; @@ -830,6 +1027,11 @@ void ScOrcusSheet::cellInserted() } } +ScDocumentImport& ScOrcusSheet::getDoc() +{ + return mrDoc; +} + os::iface::import_auto_filter* ScOrcusSheet::get_auto_filter() { return &maAutoFilter; @@ -855,6 +1057,18 @@ os::iface::import_named_expression* ScOrcusSheet::get_named_expression() return &maNamedExpressions; } +os::iface::import_formula* ScOrcusSheet::get_formula() +{ + maFormula.reset(); + return &maFormula; +} + +os::iface::import_array_formula* ScOrcusSheet::get_array_formula() +{ + maArrayFormula.reset(); + return &maArrayFormula; +} + void ScOrcusSheet::set_auto(os::row_t row, os::col_t col, const char* p, size_t n) { OUString aVal(p, n, RTL_TEXTENCODING_UTF8); @@ -921,83 +1135,6 @@ void ScOrcusSheet::set_format(os::row_t row_start, os::col_t col_start, mrDoc.getDoc().ApplyPatternAreaTab(col_start, row_start, col_end, row_end, mnTab, aPattern); } -void ScOrcusSheet::set_formula( - os::row_t row, os::col_t col, os::formula_grammar_t grammar, const char* p, size_t n) -{ - OUString aFormula(p, n, RTL_TEXTENCODING_UTF8); - mrFactory.pushCellStoreToken( - ScAddress(col, row, mnTab), aFormula, getCalcGrammarFromOrcus(grammar)); - cellInserted(); -} - -void ScOrcusSheet::set_formula_result(os::row_t row, os::col_t col, const char* p, size_t n) -{ - OUString aResult( p, n, RTL_TEXTENCODING_UTF8); - mrFactory.pushFormulaResult(ScAddress(col, row, mnTab), aResult); -} - -void ScOrcusSheet::set_formula_result(os::row_t row, os::col_t col, double val) -{ - mrFactory.pushFormulaResult(ScAddress(col, row, mnTab), val); -} - -void ScOrcusSheet::set_shared_formula( - os::row_t row, os::col_t col, os::formula_grammar_t grammar, size_t sindex, - const char* p_formula, size_t n_formula) -{ - ScAddress aPos(col, row, mnTab); - OUString aFormula(p_formula, n_formula, RTL_TEXTENCODING_UTF8); - formula::FormulaGrammar::Grammar eGram = getCalcGrammarFromOrcus(grammar); - - // Compile the formula expression into tokens. - ScCompiler aComp(&mrDoc.getDoc(), aPos, eGram); - ScTokenArray* pArray = aComp.CompileString(aFormula); - if (!pArray) - // Tokenization failed. - return; - - maFormulaGroups.set(sindex, pArray); - - mrFactory.pushSharedFormulaToken(aPos, sindex); - cellInserted(); -} - -void ScOrcusSheet::set_shared_formula( - os::row_t row, os::col_t col, os::formula_grammar_t grammar, size_t sindex, - const char* p_formula, size_t n_formula, const char* /*p_range*/, size_t /*n_range*/) -{ - set_shared_formula(row, col, grammar, sindex, p_formula, n_formula); -} - -void ScOrcusSheet::set_shared_formula(os::row_t row, os::col_t col, size_t sindex) -{ - ScAddress aPos(col, row, mnTab); - - const ScTokenArray* pArray = maFormulaGroups.get(sindex); - if (!pArray) - return; - - mrFactory.pushSharedFormulaToken(aPos, sindex); - cellInserted(); -} - -void ScOrcusSheet::set_array_formula( - os::row_t row, os::col_t col, os::formula_grammar_t grammar, - const char* p, size_t n, os::row_t array_rows, os::col_t array_cols) -{ - OUString aFormula(p, n, RTL_TEXTENCODING_UTF8); - formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus(grammar); - - ScAddress aPos(col, row, mnTab); - mrFactory.pushMatrixFormulaToken(aPos, aFormula, eGrammar, array_rows, array_cols); -} - -void ScOrcusSheet::set_array_formula( - os::row_t /*row*/, os::col_t /*col*/, os::formula_grammar_t /*grammar*/, - const char* /*p*/, size_t /*n*/, const char* /*p_range*/, size_t /*n_range*/) -{ -} - orcus::spreadsheet::range_size_t ScOrcusSheet::get_sheet_size() const { orcus::spreadsheet::range_size_t ret; @@ -1012,6 +1149,16 @@ const sc::SharedFormulaGroups& ScOrcusSheet::getSharedFormulaGroups() const return maFormulaGroups; } +sc::SharedFormulaGroups& ScOrcusSheet::getSharedFormulaGroups() +{ + return maFormulaGroups; +} + +ScOrcusFactory& ScOrcusSheet::getFactory() +{ + return mrFactory; +} + ScOrcusSharedStrings::ScOrcusSharedStrings(ScOrcusFactory& rFactory) : mrFactory(rFactory) {} @@ -1087,7 +1234,7 @@ ScOrcusStyles::font::font(): } ScOrcusStyles::fill::fill(): - maPattern(""), + mePattern(orcus::spreadsheet::fill_pattern_t::none), maFgColor(COL_WHITE), maBgColor(COL_WHITE), mbHasFillAttr(false) @@ -1143,13 +1290,13 @@ void ScOrcusStyles::font::applyToItemSet(SfxItemSet& rSet) const void ScOrcusStyles::fill::applyToItemSet(SfxItemSet& rSet) const { - if (maPattern.equalsIgnoreAsciiCase("none")) + if (mePattern == orcus::spreadsheet::fill_pattern_t::none) { SAL_INFO("sc.orcus.style", "no fill style"); return; } - if (maPattern.equalsIgnoreAsciiCase("solid")) + if (mePattern == orcus::spreadsheet::fill_pattern_t::solid) rSet.Put(SvxBrushItem(maFgColor, ATTR_BACKGROUND)); } @@ -1575,10 +1722,9 @@ void ScOrcusStyles::set_fill_count(size_t /*n*/) // needed at all? } -void ScOrcusStyles::set_fill_pattern_type(const char* s, size_t n) +void ScOrcusStyles::set_fill_pattern_type(orcus::spreadsheet::fill_pattern_t fp) { - maCurrentFill.maPattern = OUString(s, n, RTL_TEXTENCODING_UTF8); - maCurrentFill.mbHasFillAttr = true; + maCurrentFill.mePattern = fp; } void ScOrcusStyles::set_fill_fg_color( @@ -1962,12 +2108,12 @@ ScOrcusAutoFilter::~ScOrcusAutoFilter() { } -void ScOrcusAutoFilter::set_range(const char* p_ref, size_t n_ref) +void ScOrcusAutoFilter::set_range(const orcus::spreadsheet::range_t& range) { - OUString aRange(p_ref, n_ref, RTL_TEXTENCODING_UTF8); - SAL_INFO("sc.orcus.autofilter", "set_range: " << aRange); - - maRange.Parse(aRange); + maRange.aStart.SetRow(range.first.row); + maRange.aStart.SetCol(range.first.column); + maRange.aEnd.SetRow(range.last.row); + maRange.aEnd.SetCol(range.last.column); } void ScOrcusAutoFilter::set_column(orcus::spreadsheet::col_t col) diff --git a/sc/source/filter/orcus/xmlcontext.cxx b/sc/source/filter/orcus/xmlcontext.cxx index e47b862c2138..5494ddefc434 100644 --- a/sc/source/filter/orcus/xmlcontext.cxx +++ b/sc/source/filter/orcus/xmlcontext.cxx @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -289,7 +290,9 @@ void ScOrcusXMLContextImpl::importXML(const ScOrcusImportXMLParam& rParam) } } - filter.read_file(path); + std::string content = orcus::load_file_content(path); + filter.read_stream(content.data(), content.size()); + aFactory.finalize(); } catch (const std::exception&) -- 2.17.1