forked from qt-creator/qt-creator
		
	Some cleanup in the C++ preprocessor.
Introduced pp-scanner.cpp, renamed `pp' to `Preprocessor' and removed useless #includes.
This commit is contained in:
		| @@ -136,7 +136,7 @@ QString TypeOfExpression::preprocessedExpression(const QString &expression, | ||||
|     processEnvironment(documents, thisDocument, | ||||
|                        &env, &processed); | ||||
|     const QByteArray code = expression.toUtf8(); | ||||
|     pp preproc(0, env); | ||||
|     Preprocessor preproc(0, env); | ||||
|     QByteArray preprocessedCode; | ||||
|     preproc("<expression>", code, &preprocessedCode); | ||||
|     return QString::fromUtf8(preprocessedCode); | ||||
|   | ||||
| @@ -22,13 +22,13 @@ HEADERS += \ | ||||
|     TypePrettyPrinter.h \ | ||||
|     ResolveExpression.h \ | ||||
|     LookupContext.h \ | ||||
|     pp.h \ | ||||
|     pp-cctype.h \ | ||||
|     pp-engine.h \ | ||||
|     pp-macro-expander.h \ | ||||
|     pp-scanner.h \ | ||||
|     pp-client.h \ | ||||
|     pp-environment.h \ | ||||
|     pp-internal.h \ | ||||
|     pp-macro.h | ||||
|  | ||||
| SOURCES += \ | ||||
| @@ -46,6 +46,7 @@ SOURCES += \ | ||||
|     LookupContext.cpp \ | ||||
|     pp-engine.cpp \ | ||||
|     pp-environment.cpp \ | ||||
|     pp-macro-expander.cpp | ||||
|     pp-macro-expander.cpp \ | ||||
|     pp-scanner.cpp | ||||
|  | ||||
| RESOURCES += cplusplus.qrc | ||||
|   | ||||
| @@ -50,8 +50,8 @@ | ||||
|   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #ifndef PP_CCTYPE_H | ||||
| #define PP_CCTYPE_H | ||||
| #ifndef CPLUSPLUS_PP_CCTYPE_H | ||||
| #define CPLUSPLUS_PP_CCTYPE_H | ||||
|  | ||||
| #include <CPlusPlusForwardDeclarations.h> | ||||
|  | ||||
| @@ -73,4 +73,4 @@ inline bool CPLUSPLUS_EXPORT pp_isspace (int __ch) | ||||
|  | ||||
| } // namespace CPlusPlus | ||||
|  | ||||
| #endif // PP_CCTYPE_H | ||||
| #endif // CPLUSPLUS_PP_CCTYPE_H | ||||
|   | ||||
| @@ -31,8 +31,8 @@ | ||||
| ** | ||||
| ***************************************************************************/ | ||||
|  | ||||
| #ifndef PP_CLIENT_H | ||||
| #define PP_CLIENT_H | ||||
| #ifndef CPLUSPLUS_PP_CLIENT_H | ||||
| #define CPLUSPLUS_PP_CLIENT_H | ||||
|  | ||||
| #include <CPlusPlusForwardDeclarations.h> | ||||
|  | ||||
| @@ -79,4 +79,4 @@ public: | ||||
|  | ||||
| } // namespace CPlusPlus | ||||
|  | ||||
| #endif // PP_CLIENT_H | ||||
| #endif // CPLUSPLUS_PP_CLIENT_H | ||||
|   | ||||
| @@ -451,7 +451,7 @@ private: | ||||
| } // end of anonymous namespace | ||||
|  | ||||
|  | ||||
| pp::pp (Client *client, Environment &env) | ||||
| Preprocessor::Preprocessor(Client *client, Environment &env) | ||||
|     : client(client), | ||||
|       env(env), | ||||
|       expand(env) | ||||
| @@ -459,7 +459,7 @@ pp::pp (Client *client, Environment &env) | ||||
|     resetIfLevel (); | ||||
| } | ||||
|  | ||||
| void pp::pushState(const State &s) | ||||
| void Preprocessor::pushState(const State &s) | ||||
| { | ||||
|     _savedStates.append(state()); | ||||
|     _source = s.source; | ||||
| @@ -467,7 +467,7 @@ void pp::pushState(const State &s) | ||||
|     _dot = s.dot; | ||||
| } | ||||
|  | ||||
| pp::State pp::state() const | ||||
| Preprocessor::State Preprocessor::state() const | ||||
| { | ||||
|     State state; | ||||
|     state.source = _source; | ||||
| @@ -476,7 +476,7 @@ pp::State pp::state() const | ||||
|     return state; | ||||
| } | ||||
|  | ||||
| void pp::popState() | ||||
| void Preprocessor::popState() | ||||
| { | ||||
|     const State &state = _savedStates.last(); | ||||
|     _source = state.source; | ||||
| @@ -485,7 +485,7 @@ void pp::popState() | ||||
|     _savedStates.removeLast(); | ||||
| } | ||||
|  | ||||
| void pp::operator () (const QByteArray &filename, | ||||
| void Preprocessor::operator () (const QByteArray &filename, | ||||
|                       const QByteArray &source, | ||||
|                       QByteArray *result) | ||||
| { | ||||
| @@ -497,7 +497,7 @@ void pp::operator () (const QByteArray &filename, | ||||
|     env.currentFile = previousFile; | ||||
| } | ||||
|  | ||||
| pp::State pp::createStateFromSource(const QByteArray &source) const | ||||
| Preprocessor::State Preprocessor::createStateFromSource(const QByteArray &source) const | ||||
| { | ||||
|     State state; | ||||
|     state.source = source; | ||||
| @@ -512,7 +512,7 @@ pp::State pp::createStateFromSource(const QByteArray &source) const | ||||
|     return state; | ||||
| } | ||||
|  | ||||
| void pp::operator()(const QByteArray &source, QByteArray *result) | ||||
| void Preprocessor::operator()(const QByteArray &source, QByteArray *result) | ||||
| { | ||||
|     pushState(createStateFromSource(source)); | ||||
|  | ||||
| @@ -700,27 +700,27 @@ void pp::operator()(const QByteArray &source, QByteArray *result) | ||||
|     env.currentLine = previousCurrentLine; | ||||
| } | ||||
|  | ||||
| const char *pp::startOfToken(const Token &token) const | ||||
| const char *Preprocessor::startOfToken(const Token &token) const | ||||
| { return _source.constBegin() + token.begin(); } | ||||
|  | ||||
| const char *pp::endOfToken(const Token &token) const | ||||
| const char *Preprocessor::endOfToken(const Token &token) const | ||||
| { return _source.constBegin() + token.end(); } | ||||
|  | ||||
| QByteArray pp::tokenSpell(const Token &token) const | ||||
| QByteArray Preprocessor::tokenSpell(const Token &token) const | ||||
| { | ||||
|     const QByteArray text = QByteArray::fromRawData(_source.constBegin() + token.offset, | ||||
|                                                     token.length); | ||||
|     return text; | ||||
| } | ||||
|  | ||||
| QByteArray pp::tokenText(const Token &token) const | ||||
| QByteArray Preprocessor::tokenText(const Token &token) const | ||||
| { | ||||
|     const QByteArray text(_source.constBegin() + token.offset, | ||||
|                           token.length); | ||||
|     return text; | ||||
| } | ||||
|  | ||||
| void pp::processDirective(TokenIterator firstToken, TokenIterator lastToken) | ||||
| void Preprocessor::processDirective(TokenIterator firstToken, TokenIterator lastToken) | ||||
| { | ||||
|     RangeLexer tk(firstToken, lastToken); | ||||
|     ++tk; // skip T_POUND | ||||
| @@ -771,7 +771,7 @@ void pp::processDirective(TokenIterator firstToken, TokenIterator lastToken) | ||||
|     } | ||||
| } | ||||
|  | ||||
| QVector<Token> pp::tokenize(const QByteArray &text) const | ||||
| QVector<Token> Preprocessor::tokenize(const QByteArray &text) const | ||||
| { | ||||
|     QVector<Token> tokens; | ||||
|     Lexer lex(text.constBegin(), text.constEnd()); | ||||
| @@ -784,7 +784,7 @@ QVector<Token> pp::tokenize(const QByteArray &text) const | ||||
|     return tokens; | ||||
| } | ||||
|  | ||||
| void pp::processInclude(bool skipCurentPath, | ||||
| void Preprocessor::processInclude(bool skipCurentPath, | ||||
|                         TokenIterator firstToken, TokenIterator lastToken, | ||||
|                         bool acceptMacros) | ||||
| { | ||||
| @@ -836,7 +836,7 @@ void pp::processInclude(bool skipCurentPath, | ||||
|     } | ||||
| } | ||||
|  | ||||
| void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken) | ||||
| void Preprocessor::processDefine(TokenIterator firstToken, TokenIterator lastToken) | ||||
| { | ||||
|     RangeLexer tk(firstToken, lastToken); | ||||
|  | ||||
| @@ -921,7 +921,7 @@ void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken) | ||||
|         client->macroAdded(macro); | ||||
| } | ||||
|  | ||||
| void pp::processIf(TokenIterator firstToken, TokenIterator lastToken) | ||||
| void Preprocessor::processIf(TokenIterator firstToken, TokenIterator lastToken) | ||||
| { | ||||
|     RangeLexer tk(firstToken, lastToken); | ||||
|  | ||||
| @@ -948,7 +948,7 @@ void pp::processIf(TokenIterator firstToken, TokenIterator lastToken) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void pp::processElse(TokenIterator firstToken, TokenIterator lastToken) | ||||
| void Preprocessor::processElse(TokenIterator firstToken, TokenIterator lastToken) | ||||
| { | ||||
|     RangeLexer tk(firstToken, lastToken); | ||||
|  | ||||
| @@ -961,7 +961,7 @@ void pp::processElse(TokenIterator firstToken, TokenIterator lastToken) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void pp::processElif(TokenIterator firstToken, TokenIterator lastToken) | ||||
| void Preprocessor::processElif(TokenIterator firstToken, TokenIterator lastToken) | ||||
| { | ||||
|     RangeLexer tk(firstToken, lastToken); | ||||
|     ++tk; // skip T_POUND | ||||
| @@ -980,7 +980,7 @@ void pp::processElif(TokenIterator firstToken, TokenIterator lastToken) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void pp::processEndif(TokenIterator, TokenIterator) | ||||
| void Preprocessor::processEndif(TokenIterator, TokenIterator) | ||||
| { | ||||
|     if (iflevel == 0 && !skipping()) { | ||||
|         // std::cerr << "*** WARNING #endif without #if" << std::endl; | ||||
| @@ -992,7 +992,7 @@ void pp::processEndif(TokenIterator, TokenIterator) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void pp::processIfdef(bool checkUndefined, | ||||
| void Preprocessor::processIfdef(bool checkUndefined, | ||||
|                       TokenIterator firstToken, TokenIterator lastToken) | ||||
| { | ||||
|     RangeLexer tk(firstToken, lastToken); | ||||
| @@ -1013,7 +1013,7 @@ void pp::processIfdef(bool checkUndefined, | ||||
|     } | ||||
| } | ||||
|  | ||||
| void pp::processUndef(TokenIterator firstToken, TokenIterator lastToken) | ||||
| void Preprocessor::processUndef(TokenIterator firstToken, TokenIterator lastToken) | ||||
| { | ||||
|     RangeLexer tk(firstToken, lastToken); | ||||
|  | ||||
| @@ -1029,14 +1029,14 @@ void pp::processUndef(TokenIterator firstToken, TokenIterator lastToken) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void pp::resetIfLevel () | ||||
| void Preprocessor::resetIfLevel () | ||||
| { | ||||
|     iflevel = 0; | ||||
|     _skipping[iflevel] = false; | ||||
|     _true_test[iflevel] = false; | ||||
| } | ||||
|  | ||||
| pp::PP_DIRECTIVE_TYPE pp::classifyDirective (const QByteArray &__directive) const | ||||
| Preprocessor::PP_DIRECTIVE_TYPE Preprocessor::classifyDirective (const QByteArray &__directive) const | ||||
| { | ||||
|     switch (__directive.size()) | ||||
|     { | ||||
| @@ -1085,7 +1085,7 @@ pp::PP_DIRECTIVE_TYPE pp::classifyDirective (const QByteArray &__directive) cons | ||||
|     return PP_UNKNOWN_DIRECTIVE; | ||||
| } | ||||
|  | ||||
| bool pp::testIfLevel() | ||||
| bool Preprocessor::testIfLevel() | ||||
| { | ||||
|     const bool result = !_skipping[iflevel++]; | ||||
|     _skipping[iflevel] = _skipping[iflevel - 1]; | ||||
| @@ -1093,10 +1093,10 @@ bool pp::testIfLevel() | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| int pp::skipping() const | ||||
| int Preprocessor::skipping() const | ||||
| { return _skipping[iflevel]; } | ||||
|  | ||||
| Value pp::evalExpression(TokenIterator firstToken, TokenIterator lastToken, | ||||
| Value Preprocessor::evalExpression(TokenIterator firstToken, TokenIterator lastToken, | ||||
|                          const QByteArray &source) const | ||||
| { | ||||
|     ExpressionEvaluator eval(&env); | ||||
| @@ -1104,7 +1104,7 @@ Value pp::evalExpression(TokenIterator firstToken, TokenIterator lastToken, | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| bool pp::isQtReservedWord (const QByteArray ¯oId) const | ||||
| bool Preprocessor::isQtReservedWord (const QByteArray ¯oId) const | ||||
| { | ||||
|     const int size = macroId.size(); | ||||
|     if      (size == 9 && macroId.at(0) == 'Q' && macroId == "Q_SIGNALS") | ||||
|   | ||||
| @@ -50,8 +50,8 @@ | ||||
|   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #ifndef PP_ENGINE_H | ||||
| #define PP_ENGINE_H | ||||
| #ifndef CPLUSPLUS_PP_ENGINE_H | ||||
| #define CPLUSPLUS_PP_ENGINE_H | ||||
|  | ||||
| #include "pp-client.h" | ||||
|  | ||||
| @@ -134,7 +134,7 @@ namespace CPlusPlus { | ||||
| #undef PP_DEFINE_BIN_OP | ||||
|     }; | ||||
|  | ||||
|     class CPLUSPLUS_EXPORT pp | ||||
|     class CPLUSPLUS_EXPORT Preprocessor | ||||
|     { | ||||
|         Client *client; | ||||
|         Environment &env; | ||||
| @@ -182,7 +182,7 @@ namespace CPlusPlus { | ||||
|         State createStateFromSource(const QByteArray &source) const; | ||||
|  | ||||
|     public: | ||||
|         pp(Client *client, Environment &env); | ||||
|         Preprocessor(Client *client, Environment &env); | ||||
|  | ||||
|         void operator()(const QByteArray &filename, | ||||
|                         const QByteArray &source, | ||||
| @@ -228,4 +228,4 @@ namespace CPlusPlus { | ||||
|  | ||||
| } // namespace CPlusPlus | ||||
|  | ||||
| #endif // PP_ENGINE_H | ||||
| #endif // CPLUSPLUS_PP_ENGINE_H | ||||
|   | ||||
| @@ -50,8 +50,8 @@ | ||||
|   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #ifndef PP_ENVIRONMENT_H | ||||
| #define PP_ENVIRONMENT_H | ||||
| #ifndef CPLUSPLUS_PP_ENVIRONMENT_H | ||||
| #define CPLUSPLUS_PP_ENVIRONMENT_H | ||||
|  | ||||
| #include "CPlusPlusForwardDeclarations.h" | ||||
|  | ||||
| @@ -108,4 +108,4 @@ private: | ||||
|  | ||||
| } // namespace CPlusPlus | ||||
|  | ||||
| #endif // PP_ENVIRONMENT_H | ||||
| #endif // CPLUSPLUS_PP_ENVIRONMENT_H | ||||
|   | ||||
| @@ -1,78 +0,0 @@ | ||||
| /*************************************************************************** | ||||
| ** | ||||
| ** This file is part of Qt Creator | ||||
| ** | ||||
| ** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). | ||||
| ** | ||||
| ** Contact:  Qt Software Information (qt-info@nokia.com) | ||||
| ** | ||||
| ** | ||||
| ** Non-Open Source Usage | ||||
| ** | ||||
| ** Licensees may use this file in accordance with the Qt Beta Version | ||||
| ** License Agreement, Agreement version 2.2 provided with the Software or, | ||||
| ** alternatively, in accordance with the terms contained in a written | ||||
| ** agreement between you and Nokia. | ||||
| ** | ||||
| ** GNU General Public License Usage | ||||
| ** | ||||
| ** Alternatively, this file may be used under the terms of the GNU General | ||||
| ** Public License versions 2.0 or 3.0 as published by the Free Software | ||||
| ** Foundation and appearing in the file LICENSE.GPL included in the packaging | ||||
| ** of this file.  Please review the following information to ensure GNU | ||||
| ** General Public Licensing requirements will be met: | ||||
| ** | ||||
| ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and | ||||
| ** http://www.gnu.org/copyleft/gpl.html. | ||||
| ** | ||||
| ** In addition, as a special exception, Nokia gives you certain additional | ||||
| ** rights. These rights are described in the Nokia Qt GPL Exception | ||||
| ** version 1.3, included in the file GPL_EXCEPTION.txt in this package. | ||||
| ** | ||||
| ***************************************************************************/ | ||||
| /* | ||||
|   Copyright 2005 Roberto Raggi <roberto@kdevelop.org> | ||||
|  | ||||
|   Permission to use, copy, modify, distribute, and sell this software and its | ||||
|   documentation for any purpose is hereby granted without fee, provided that | ||||
|   the above copyright notice appear in all copies and that both that | ||||
|   copyright notice and this permission notice appear in supporting | ||||
|   documentation. | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in | ||||
|   all copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE | ||||
|   KDEVELOP TEAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | ||||
|   AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #ifndef PP_INTERNAL_H | ||||
| #define PP_INTERNAL_H | ||||
|  | ||||
| #include <QByteArray> | ||||
|  | ||||
| namespace CPlusPlus { | ||||
| namespace _PP_internal { | ||||
|  | ||||
| inline bool comment_p (const char *__first, const char *__last) | ||||
| { | ||||
|     if (__first == __last) | ||||
|         return false; | ||||
|  | ||||
|     if (*__first != '/') | ||||
|         return false; | ||||
|  | ||||
|     if (++__first == __last) | ||||
|         return false; | ||||
|  | ||||
|     return (*__first == '/' || *__first == '*'); | ||||
| } | ||||
|  | ||||
| } // _PP_internal | ||||
| } // namespace CPlusPlus | ||||
|  | ||||
| #endif // PP_INTERNAL_H | ||||
| @@ -32,11 +32,26 @@ | ||||
| ***************************************************************************/ | ||||
|  | ||||
| #include "pp.h" | ||||
| #include "pp-cctype.h" | ||||
| #include "pp-macro-expander.h" | ||||
| #include <QDateTime> | ||||
|  | ||||
| using namespace CPlusPlus; | ||||
|  | ||||
| inline static bool comment_p (const char *__first, const char *__last) | ||||
| { | ||||
|     if (__first == __last) | ||||
|         return false; | ||||
|  | ||||
|     if (*__first != '/') | ||||
|         return false; | ||||
|  | ||||
|     if (++__first == __last) | ||||
|         return false; | ||||
|  | ||||
|     return (*__first == '/' || *__first == '*'); | ||||
| } | ||||
|  | ||||
| MacroExpander::MacroExpander (Environment &env, pp_frame *frame) | ||||
|     : env(env), frame(frame), | ||||
|       lines(0), generated_lines(0) | ||||
| @@ -137,7 +152,7 @@ const char *MacroExpander::operator () (const char *__first, const char *__last, | ||||
|             __result->append(__first, next_pos - __first); | ||||
|             __first = next_pos; | ||||
|         } | ||||
|         else if (_PP_internal::comment_p (__first, __last)) | ||||
|         else if (comment_p (__first, __last)) | ||||
|         { | ||||
|             __first = skip_comment_or_divop (__first, __last); | ||||
|             int n = skip_comment_or_divop.lines; | ||||
|   | ||||
							
								
								
									
										296
									
								
								src/libs/cplusplus/pp-scanner.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								src/libs/cplusplus/pp-scanner.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,296 @@ | ||||
| /*************************************************************************** | ||||
| ** | ||||
| ** This file is part of Qt Creator | ||||
| ** | ||||
| ** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). | ||||
| ** | ||||
| ** Contact:  Qt Software Information (qt-info@nokia.com) | ||||
| ** | ||||
| ** | ||||
| ** Non-Open Source Usage | ||||
| ** | ||||
| ** Licensees may use this file in accordance with the Qt Beta Version | ||||
| ** License Agreement, Agreement version 2.2 provided with the Software or, | ||||
| ** alternatively, in accordance with the terms contained in a written | ||||
| ** agreement between you and Nokia. | ||||
| ** | ||||
| ** GNU General Public License Usage | ||||
| ** | ||||
| ** Alternatively, this file may be used under the terms of the GNU General | ||||
| ** Public License versions 2.0 or 3.0 as published by the Free Software | ||||
| ** Foundation and appearing in the file LICENSE.GPL included in the packaging | ||||
| ** of this file.  Please review the following information to ensure GNU | ||||
| ** General Public Licensing requirements will be met: | ||||
| ** | ||||
| ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and | ||||
| ** http://www.gnu.org/copyleft/gpl.html. | ||||
| ** | ||||
| ** In addition, as a special exception, Nokia gives you certain additional | ||||
| ** rights. These rights are described in the Nokia Qt GPL Exception | ||||
| ** version 1.3, included in the file GPL_EXCEPTION.txt in this package. | ||||
| ** | ||||
| ***************************************************************************/ | ||||
| /* | ||||
|   Copyright 2005 Roberto Raggi <roberto@kdevelop.org> | ||||
|  | ||||
|   Permission to use, copy, modify, distribute, and sell this software and its | ||||
|   documentation for any purpose is hereby granted without fee, provided that | ||||
|   the above copyright notice appear in all copies and that both that | ||||
|   copyright notice and this permission notice appear in supporting | ||||
|   documentation. | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in | ||||
|   all copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE | ||||
|   KDEVELOP TEAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | ||||
|   AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #include "pp-scanner.h" | ||||
| #include "pp-cctype.h" | ||||
|  | ||||
| using namespace CPlusPlus; | ||||
|  | ||||
| const char *pp_skip_blanks::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) { | ||||
|         if (*__first == '\\') { | ||||
|             const char *__begin = __first; | ||||
|             ++__begin; | ||||
|  | ||||
|             if (__begin != __last && *__begin == '\n') | ||||
|                 ++__first; | ||||
|             else | ||||
|                 break; | ||||
|         } else if (*__first == '\n' || !pp_isspace (*__first)) | ||||
|             break; | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| const char *pp_skip_whitespaces::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) { | ||||
|         if (! pp_isspace (*__first)) | ||||
|             break; | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| const char *pp_skip_comment_or_divop::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     enum { | ||||
|         MAYBE_BEGIN, | ||||
|         BEGIN, | ||||
|         MAYBE_END, | ||||
|         END, | ||||
|         IN_COMMENT, | ||||
|         IN_CXX_COMMENT | ||||
|     } state (MAYBE_BEGIN); | ||||
|  | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) { | ||||
|         switch (state) { | ||||
|         default: | ||||
|             break; | ||||
|  | ||||
|         case MAYBE_BEGIN: | ||||
|             if (*__first != '/') | ||||
|                 return __first; | ||||
|  | ||||
|             state = BEGIN; | ||||
|             break; | ||||
|  | ||||
|         case BEGIN: | ||||
|             if (*__first == '*') | ||||
|                 state = IN_COMMENT; | ||||
|             else if (*__first == '/') | ||||
|                 state = IN_CXX_COMMENT; | ||||
|             else | ||||
|                 return __first; | ||||
|             break; | ||||
|  | ||||
|         case IN_COMMENT: | ||||
|             if (*__first == '*') | ||||
|                 state = MAYBE_END; | ||||
|             break; | ||||
|  | ||||
|         case IN_CXX_COMMENT: | ||||
|             if (*__first == '\n') | ||||
|                 return __first; | ||||
|             break; | ||||
|  | ||||
|         case MAYBE_END: | ||||
|             if (*__first == '/') | ||||
|                 state = END; | ||||
|             else if (*__first != '*') | ||||
|                 state = IN_COMMENT; | ||||
|             break; | ||||
|  | ||||
|         case END: | ||||
|             return __first; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| const char *pp_skip_identifier::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) { | ||||
|         if (! pp_isalnum (*__first) && *__first != '_') | ||||
|             break; | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| const char *pp_skip_number::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) { | ||||
|         if (! pp_isalnum (*__first) && *__first != '.') | ||||
|             break; | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| const char *pp_skip_string_literal::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     enum { | ||||
|         BEGIN, | ||||
|         IN_STRING, | ||||
|         QUOTE, | ||||
|         END | ||||
|     } state (BEGIN); | ||||
|  | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) { | ||||
|         switch (state) | ||||
|         { | ||||
|         default: | ||||
|             break; | ||||
|  | ||||
|         case BEGIN: | ||||
|             if (*__first != '\"') | ||||
|                 return __first; | ||||
|             state = IN_STRING; | ||||
|             break; | ||||
|  | ||||
|         case IN_STRING: | ||||
|             if (! (*__first != '\n')) | ||||
|                 return __last; | ||||
|  | ||||
|             if (*__first == '\"') | ||||
|                 state = END; | ||||
|             else if (*__first == '\\') | ||||
|                 state = QUOTE; | ||||
|             break; | ||||
|  | ||||
|         case QUOTE: | ||||
|             state = IN_STRING; | ||||
|             break; | ||||
|  | ||||
|         case END: | ||||
|             return __first; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| const char *pp_skip_char_literal::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     enum { | ||||
|         BEGIN, | ||||
|         IN_STRING, | ||||
|         QUOTE, | ||||
|         END | ||||
|     } state (BEGIN); | ||||
|  | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; state != END && __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) { | ||||
|         switch (state) | ||||
|         { | ||||
|         default: | ||||
|             break; | ||||
|  | ||||
|         case BEGIN: | ||||
|             if (*__first != '\'') | ||||
|                 return __first; | ||||
|             state = IN_STRING; | ||||
|             break; | ||||
|  | ||||
|         case IN_STRING: | ||||
|             if (! (*__first != '\n')) | ||||
|                 return __last; | ||||
|  | ||||
|             if (*__first == '\'') | ||||
|                 state = END; | ||||
|             else if (*__first == '\\') | ||||
|                 state = QUOTE; | ||||
|             break; | ||||
|  | ||||
|         case QUOTE: | ||||
|             state = IN_STRING; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| const char *pp_skip_argument::operator () (const char *__first, const char *__last) | ||||
| { | ||||
|     int depth = 0; | ||||
|     lines = 0; | ||||
|  | ||||
|     while (__first != __last) { | ||||
|         if (!depth && (*__first == ')' || *__first == ',')) | ||||
|             break; | ||||
|         else if (*__first == '(') | ||||
|             ++depth, ++__first; | ||||
|         else if (*__first == ')') | ||||
|             --depth, ++__first; | ||||
|         else if (*__first == '\"') { | ||||
|             __first = skip_string_literal (__first, __last); | ||||
|             lines += skip_string_literal.lines; | ||||
|         } else if (*__first == '\'') { | ||||
|             __first = skip_char_literal (__first, __last); | ||||
|             lines += skip_char_literal.lines; | ||||
|         } else if (*__first == '/') { | ||||
|             __first = skip_comment_or_divop (__first, __last); | ||||
|             lines += skip_comment_or_divop.lines; | ||||
|         } else if (pp_isalpha (*__first) || *__first == '_') { | ||||
|             __first = skip_identifier (__first, __last); | ||||
|             lines += skip_identifier.lines; | ||||
|         } else if (pp_isdigit (*__first)) { | ||||
|             __first = skip_number (__first, __last); | ||||
|             lines += skip_number.lines; | ||||
|         } else if (*__first == '\n') { | ||||
|             ++__first; | ||||
|             ++lines; | ||||
|         } else | ||||
|             ++__first; | ||||
|     } | ||||
|  | ||||
|     return __first; | ||||
| } | ||||
|  | ||||
| @@ -50,266 +50,57 @@ | ||||
|   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #ifndef PP_SCANNER_H | ||||
| #define PP_SCANNER_H | ||||
| #ifndef CPLUSPLUS_PP_SCANNER_H | ||||
| #define CPLUSPLUS_PP_SCANNER_H | ||||
|  | ||||
| namespace CPlusPlus { | ||||
|  | ||||
| struct pp_skip_blanks | ||||
| { | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) | ||||
|       { | ||||
|         if (*__first == '\\') | ||||
|           { | ||||
|             const char *__begin = __first; | ||||
|             ++__begin; | ||||
|  | ||||
|             if (__begin != __last && *__begin == '\n') | ||||
|                 ++__first; | ||||
|             else | ||||
|               break; | ||||
|           } | ||||
|         else if (*__first == '\n' || !pp_isspace (*__first)) | ||||
|           break; | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| struct pp_skip_whitespaces | ||||
| { | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) | ||||
|       { | ||||
|         if (! pp_isspace (*__first)) | ||||
|           break; | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| struct pp_skip_comment_or_divop | ||||
| { | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     enum { | ||||
|       MAYBE_BEGIN, | ||||
|       BEGIN, | ||||
|       MAYBE_END, | ||||
|       END, | ||||
|       IN_COMMENT, | ||||
|       IN_CXX_COMMENT | ||||
|     } state (MAYBE_BEGIN); | ||||
|  | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) | ||||
|       { | ||||
|         switch (state) | ||||
|           { | ||||
|             default: | ||||
|               assert (0); | ||||
|               break; | ||||
|  | ||||
|             case MAYBE_BEGIN: | ||||
|               if (*__first != '/') | ||||
|                 return __first; | ||||
|  | ||||
|               state = BEGIN; | ||||
|               break; | ||||
|  | ||||
|             case BEGIN: | ||||
|               if (*__first == '*') | ||||
|                 state = IN_COMMENT; | ||||
|               else if (*__first == '/') | ||||
|                 state = IN_CXX_COMMENT; | ||||
|               else | ||||
|                 return __first; | ||||
|               break; | ||||
|  | ||||
|             case IN_COMMENT: | ||||
|               if (*__first == '*') | ||||
|                 state = MAYBE_END; | ||||
|               break; | ||||
|  | ||||
|             case IN_CXX_COMMENT: | ||||
|               if (*__first == '\n') | ||||
|                 return __first; | ||||
|               break; | ||||
|  | ||||
|             case MAYBE_END: | ||||
|               if (*__first == '/') | ||||
|                 state = END; | ||||
|               else if (*__first != '*') | ||||
|                 state = IN_COMMENT; | ||||
|               break; | ||||
|  | ||||
|             case END: | ||||
|               return __first; | ||||
|           } | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| struct pp_skip_identifier | ||||
| { | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) | ||||
|       { | ||||
|         if (! pp_isalnum (*__first) && *__first != '_') | ||||
|           break; | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| struct pp_skip_number | ||||
| { | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) | ||||
|       { | ||||
|         if (! pp_isalnum (*__first) && *__first != '.') | ||||
|           break; | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| struct pp_skip_string_literal | ||||
| { | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     enum { | ||||
|       BEGIN, | ||||
|       IN_STRING, | ||||
|       QUOTE, | ||||
|       END | ||||
|     } state (BEGIN); | ||||
|  | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) | ||||
|       { | ||||
|         switch (state) | ||||
|           { | ||||
|             default: | ||||
|               assert (0); | ||||
|               break; | ||||
|  | ||||
|             case BEGIN: | ||||
|               if (*__first != '\"') | ||||
|                 return __first; | ||||
|               state = IN_STRING; | ||||
|               break; | ||||
|  | ||||
|             case IN_STRING: | ||||
|               if (! (*__first != '\n')) | ||||
|                 return __last; | ||||
|  | ||||
|               if (*__first == '\"') | ||||
|                 state = END; | ||||
|               else if (*__first == '\\') | ||||
|                 state = QUOTE; | ||||
|               break; | ||||
|  | ||||
|             case QUOTE: | ||||
|               state = IN_STRING; | ||||
|               break; | ||||
|  | ||||
|             case END: | ||||
|               return __first; | ||||
|           } | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| struct pp_skip_char_literal | ||||
| { | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     enum { | ||||
|       BEGIN, | ||||
|       IN_STRING, | ||||
|       QUOTE, | ||||
|       END | ||||
|     } state (BEGIN); | ||||
|  | ||||
|     lines = 0; | ||||
|  | ||||
|     for (; state != END && __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) | ||||
|       { | ||||
|         switch (state) | ||||
|           { | ||||
|             default: | ||||
|               assert (0); | ||||
|               break; | ||||
|  | ||||
|             case BEGIN: | ||||
|               if (*__first != '\'') | ||||
|                 return __first; | ||||
|               state = IN_STRING; | ||||
|               break; | ||||
|  | ||||
|             case IN_STRING: | ||||
|               if (! (*__first != '\n')) | ||||
|                 return __last; | ||||
|  | ||||
|               if (*__first == '\'') | ||||
|                 state = END; | ||||
|               else if (*__first == '\\') | ||||
|                 state = QUOTE; | ||||
|               break; | ||||
|  | ||||
|             case QUOTE: | ||||
|               state = IN_STRING; | ||||
|               break; | ||||
|           } | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| struct pp_skip_argument | ||||
| @@ -321,60 +112,9 @@ struct pp_skip_argument | ||||
|   pp_skip_comment_or_divop skip_comment_or_divop; | ||||
|   int lines; | ||||
|  | ||||
|  | ||||
|   const char *operator () (const char *__first, const char *__last) | ||||
|   { | ||||
|     int depth = 0; | ||||
|     lines = 0; | ||||
|  | ||||
|     while (__first != __last) | ||||
|       { | ||||
|         if (!depth && (*__first == ')' || *__first == ',')) | ||||
|           break; | ||||
|         else if (*__first == '(') | ||||
|           ++depth, ++__first; | ||||
|         else if (*__first == ')') | ||||
|           --depth, ++__first; | ||||
|         else if (*__first == '\"') | ||||
|           { | ||||
|             __first = skip_string_literal (__first, __last); | ||||
|             lines += skip_string_literal.lines; | ||||
|           } | ||||
|         else if (*__first == '\'') | ||||
|           { | ||||
|             __first = skip_char_literal (__first, __last); | ||||
|             lines += skip_char_literal.lines; | ||||
|           } | ||||
|         else if (*__first == '/') | ||||
|           { | ||||
|             __first = skip_comment_or_divop (__first, __last); | ||||
|             lines += skip_comment_or_divop.lines; | ||||
|           } | ||||
|         else if (pp_isalpha (*__first) || *__first == '_') | ||||
|           { | ||||
|             __first = skip_identifier (__first, __last); | ||||
|             lines += skip_identifier.lines; | ||||
|           } | ||||
|         else if (pp_isdigit (*__first)) | ||||
|           { | ||||
|             __first = skip_number (__first, __last); | ||||
|             lines += skip_number.lines; | ||||
|           } | ||||
|         else if (*__first == '\n') | ||||
|           { | ||||
|             ++__first; | ||||
|             ++lines; | ||||
|           } | ||||
|         else | ||||
|           ++__first; | ||||
|       } | ||||
|  | ||||
|     return __first; | ||||
|   } | ||||
|   const char *operator () (const char *first, const char *last); | ||||
| }; | ||||
|  | ||||
| } // namespace CPlusPlus | ||||
|  | ||||
| #endif // PP_SCANNER_H | ||||
|  | ||||
| // kate: space-indent on; indent-width 2; replace-tabs on; | ||||
| #endif // CPLUSPLUS_PP_SCANNER_H | ||||
|   | ||||
| @@ -50,15 +50,9 @@ | ||||
|   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #ifndef PP_H | ||||
| #define PP_H | ||||
| #ifndef CPLUSPLUS_PREPROCESSOR_H | ||||
| #define CPLUSPLUS_PREPROCESSOR_H | ||||
|  | ||||
| #include <cassert> | ||||
| #include <cstring> | ||||
| #include <cctype> | ||||
|  | ||||
| #include "pp-cctype.h" | ||||
| #include "pp-internal.h" | ||||
| #include "pp-macro.h" | ||||
| #include "pp-environment.h" | ||||
| #include "pp-scanner.h" | ||||
| @@ -66,4 +60,4 @@ | ||||
| #include "pp-engine.h" | ||||
| #include "pp-client.h" | ||||
|  | ||||
| #endif // PP_H | ||||
| #endif // CPLUSPLUS_PREPROCESSOR_H | ||||
|   | ||||
		Reference in New Issue
	
	Block a user