File indexing completed on 2024-04-21 05:44:11
0001 /* 0002 SPDX-FileCopyrightText: 2002-2004 Otto Bruggeman <otto.bruggeman@home.nl> 0003 SPDX-FileCopyrightText: 2010 Kevin Kofler <kevin.kofler@chello.at> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #ifndef KOMPAREDIFF2_PARSERBASE_H 0009 #define KOMPAREDIFF2_PARSERBASE_H 0010 0011 // lib 0012 #include "difference.h" 0013 #include "global.h" 0014 // Qt 0015 #include <QRegularExpression> 0016 #include <QStringList> 0017 0018 class QString; 0019 0020 namespace KompareDiff2 0021 { 0022 0023 class ModelList; 0024 class DiffModelList; 0025 class DiffModel; 0026 0027 class ParserBase 0028 { 0029 public: 0030 ParserBase(const ModelList *list, const QStringList &diff); 0031 virtual ~ParserBase(); 0032 0033 static QString escapePath(QString path); 0034 static QString unescapePath(QString path); 0035 0036 public: 0037 Format format() 0038 { 0039 return determineFormat(); 0040 }; 0041 0042 DiffModelList *parse(bool *malformed = nullptr); 0043 0044 protected: 0045 virtual bool parseContextDiffHeader(); 0046 virtual bool parseEdDiffHeader(); 0047 virtual bool parseNormalDiffHeader(); 0048 virtual bool parseRCSDiffHeader(); 0049 virtual bool parseUnifiedDiffHeader(); 0050 0051 virtual bool parseContextHunkHeader(); 0052 virtual bool parseEdHunkHeader(); 0053 virtual bool parseNormalHunkHeader(); 0054 virtual bool parseRCSHunkHeader(); 0055 virtual bool parseUnifiedHunkHeader(); 0056 0057 virtual bool parseContextHunkBody(); 0058 virtual bool parseEdHunkBody(); 0059 virtual bool parseNormalHunkBody(); 0060 virtual bool parseRCSHunkBody(); 0061 virtual bool parseUnifiedHunkBody(); 0062 0063 virtual DiffModelList *parseContext(); 0064 virtual DiffModelList *parseEd(); 0065 virtual DiffModelList *parseNormal(); 0066 virtual DiffModelList *parseRCS(); 0067 virtual DiffModelList *parseUnified(); 0068 0069 protected: // Helper methods to speed things up 0070 bool matchesUnifiedHunkLine(const QString &line) const; 0071 void checkHeader(const QRegularExpression &header); 0072 0073 protected: 0074 /** What is format of the diff */ 0075 virtual Format determineFormat(); 0076 0077 protected: 0078 // Regexps for context parsing 0079 QRegularExpression m_contextDiffHeader1; 0080 QRegularExpression m_contextDiffHeader2; 0081 0082 QRegularExpression m_contextHunkHeader1; 0083 QRegularExpression m_contextHunkHeader2; 0084 QRegularExpression m_contextHunkHeader3; 0085 QRegularExpressionMatch m_contextHunkHeader1Match; 0086 QRegularExpressionMatch m_contextHunkHeader2Match; 0087 0088 QRegularExpression m_contextHunkBodyRemoved; 0089 QRegularExpression m_contextHunkBodyAdded; 0090 QRegularExpression m_contextHunkBodyChanged; 0091 QRegularExpression m_contextHunkBodyContext; 0092 QRegularExpression m_contextHunkBodyLine; // Added for convenience 0093 0094 // Regexps for normal parsing 0095 QRegularExpression m_normalDiffHeader; 0096 0097 QRegularExpression m_normalHunkHeaderAdded; 0098 QRegularExpression m_normalHunkHeaderRemoved; 0099 QRegularExpression m_normalHunkHeaderChanged; 0100 QRegularExpressionMatch m_normalHunkHeaderAddedMatch; 0101 QRegularExpressionMatch m_normalHunkHeaderRemovedMatch; 0102 QRegularExpressionMatch m_normalHunkHeaderChangedMatch; 0103 0104 QRegularExpression m_normalHunkBodyRemoved; 0105 QRegularExpression m_normalHunkBodyAdded; 0106 QRegularExpression m_normalHunkBodyDivider; 0107 0108 Difference::Type m_normalDiffType; 0109 0110 // RegExps for rcs parsing 0111 QRegularExpression m_rcsDiffHeader; 0112 0113 // Regexps for unified parsing 0114 QRegularExpression m_unifiedDiffHeader1; 0115 QRegularExpression m_unifiedDiffHeader2; 0116 0117 QRegularExpression m_unifiedHunkHeader; 0118 QRegularExpressionMatch m_unifiedHunkHeaderMatch; 0119 0120 protected: 0121 const QStringList &m_diffLines; 0122 DiffModel *m_currentModel = nullptr; 0123 DiffModelList *m_models = nullptr; 0124 QStringList::ConstIterator m_diffIterator; 0125 0126 bool m_singleFileDiff = false; 0127 bool m_malformed = false; 0128 0129 protected: 0130 const ModelList *m_list; 0131 }; 0132 0133 } // End of namespace KompareDiff2 0134 0135 #endif