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