File indexing completed on 2024-05-12 03:47:02

0001 /*
0002     File                 : OriginParser.h
0003     Description          : Origin file parser base class
0004     --------------------------------------------------------------------
0005     SPDX-FileCopyrightText: 2008 Alex Kargovsky <kargovsky@yumr.phys.msu.su>
0006     SPDX-FileCopyrightText: 2017 Stefan Gerlach <stefan.gerlach@uni.kn>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #ifndef ORIGIN_PARSER_H
0011 #define ORIGIN_PARSER_H
0012 
0013 #include "OriginObj.h"
0014 #include "tree.hh"
0015 
0016 #ifdef GENERATE_CODE_FOR_LOG
0017 #    define LOG_PRINT(logfile, ...)                                                                \
0018         {                                                                                          \
0019             fprintf(logfile, __VA_ARGS__);                                                         \
0020         }
0021 #else // !GENERATE_CODE_FOR_LOG
0022 #    define LOG_PRINT(logfile, ...) {};
0023 #endif
0024 
0025 class ORIGIN_EXPORT OriginParser
0026 {
0027 public:
0028     virtual ~OriginParser() = default;
0029     virtual bool parse() = 0;
0030 
0031     std::vector<Origin::SpreadSheet>::difference_type
0032     findSpreadByName(const std::string &name) const;
0033     std::vector<Origin::Matrix>::difference_type findMatrixByName(const std::string &name) const;
0034     std::vector<Origin::Function>::difference_type
0035     findFunctionByName(const std::string &name) const;
0036     std::vector<Origin::Excel>::difference_type findExcelByName(const std::string &name) const;
0037 
0038 protected:
0039     std::vector<Origin::SpreadColumn>::difference_type
0040     findSpreadColumnByName(std::vector<Origin::SpreadSheet>::size_type spread,
0041                            const std::string &name) const;
0042     std::vector<Origin::SpreadColumn>::difference_type
0043     findExcelColumnByName(std::vector<Origin::Excel>::size_type excel,
0044                           std::vector<Origin::SpreadSheet>::size_type sheet,
0045                           const std::string &name) const;
0046     std::pair<std::string, std::string> findDataByIndex(unsigned int index) const;
0047     std::pair<Origin::ProjectNode::NodeType, std::string>
0048     findObjectByIndex(unsigned int index) const;
0049     std::pair<Origin::ProjectNode::NodeType, Origin::Window>
0050     findWindowObjectByIndex(unsigned int index) const;
0051     void convertSpreadToExcel(std::vector<Origin::SpreadSheet>::size_type spread);
0052 
0053     int findColumnByName(int spread, const std::string &name);
0054 
0055 private:
0056     bool iequals(const std::string &, const std::string &,
0057                  const std::locale & = std::locale()) const;
0058 
0059 public:
0060     std::vector<Origin::SpreadColumn> datasets;
0061     std::vector<Origin::SpreadSheet> spreadSheets;
0062     std::vector<Origin::Matrix> matrixes;
0063     std::vector<Origin::Excel> excels;
0064     std::vector<Origin::Function> functions;
0065     std::vector<Origin::Graph> graphs;
0066     std::vector<Origin::Note> notes;
0067     tree<Origin::ProjectNode> projectTree;
0068     std::string resultsLog;
0069     unsigned int windowsCount;
0070     unsigned int fileVersion, buildVersion;
0071 };
0072 
0073 OriginParser *createOriginAnyParser(const std::string &fileName);
0074 
0075 #endif // ORIGIN_PARSER_H