diff --git a/0001-Update-orcus-to-0.14.0.patch b/0001-Update-orcus-to-0.14.0.patch new file mode 100644 index 0000000..1ab6dc0 --- /dev/null +++ b/0001-Update-orcus-to-0.14.0.patch @@ -0,0 +1,801 @@ +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 +@@ -192,8 +192,8 @@ export OPENLDAP_SHA256SUM := cdd6cffdebcd95161a73305ec13fc7a78e9707b46ca9f84fb89 + export OPENLDAP_TARBALL := openldap-2.4.45.tgz + export OPENSSL_SHA256SUM := ec3f5c9714ba0fd45cb4e087301eb1336c317e0d20b575a125050470e8089e4d + export OPENSSL_TARBALL := openssl-1.0.2o.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 + diff --git a/libreoffice.spec b/libreoffice.spec index b1af5a1..ceec383 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -64,7 +64,7 @@ Summary: Free Software Productivity Suite Name: libreoffice Epoch: 1 Version: %{libo_version}.3 -Release: 1%{?libo_prerelease}%{?dist} +Release: 2%{?libo_prerelease}%{?dist} License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and MPLv2.0 and CC0 URL: http://www.libreoffice.org/ @@ -235,11 +235,12 @@ BuildRequires: pkgconfig(graphite2) BuildRequires: pkgconfig(harfbuzz) BuildRequires: pkgconfig(libeot) BuildRequires: pkgconfig(libepubgen-0.1) -BuildRequires: pkgconfig(liborcus-0.13) BuildRequires: pkgconfig(libqxp-0.0) %if 0%{?rhel} +BuildRequires: pkgconfig(liborcus-0.13) BuildRequires: pkgconfig(mdds-1.2) %else +BuildRequires: pkgconfig(liborcus-0.14) BuildRequires: pkgconfig(mdds-1.4) %endif BuildRequires: libnumbertext-devel @@ -276,6 +277,7 @@ Patch1: 0001-Resolves-rhbz-1432468-disable-opencl-by-default.patch Patch2: 0001-gtk3-only-for-3.20.patch %if !0%{?rhel} Patch3: 0001-mdds-1.4.1-is-now-a-minimum-requirement.patch +Patch4: 0001-Update-orcus-to-0.14.0.patch %endif %if 0%{?rhel} @@ -2325,6 +2327,9 @@ done %{_includedir}/LibreOfficeKit %changelog +* Sun Sep 02 2018 David Tardon - 1:6.1.0.3-2 +- rebuild for liborcus 0.14.0 + * Thu Aug 16 2018 Caolán McNamara - 1:6.1.0.3-1 - 6.1.X series