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,
|
processEnvironment(documents, thisDocument,
|
||||||
&env, &processed);
|
&env, &processed);
|
||||||
const QByteArray code = expression.toUtf8();
|
const QByteArray code = expression.toUtf8();
|
||||||
pp preproc(0, env);
|
Preprocessor preproc(0, env);
|
||||||
QByteArray preprocessedCode;
|
QByteArray preprocessedCode;
|
||||||
preproc("<expression>", code, &preprocessedCode);
|
preproc("<expression>", code, &preprocessedCode);
|
||||||
return QString::fromUtf8(preprocessedCode);
|
return QString::fromUtf8(preprocessedCode);
|
||||||
|
|||||||
@@ -22,13 +22,13 @@ HEADERS += \
|
|||||||
TypePrettyPrinter.h \
|
TypePrettyPrinter.h \
|
||||||
ResolveExpression.h \
|
ResolveExpression.h \
|
||||||
LookupContext.h \
|
LookupContext.h \
|
||||||
|
pp.h \
|
||||||
pp-cctype.h \
|
pp-cctype.h \
|
||||||
pp-engine.h \
|
pp-engine.h \
|
||||||
pp-macro-expander.h \
|
pp-macro-expander.h \
|
||||||
pp-scanner.h \
|
pp-scanner.h \
|
||||||
pp-client.h \
|
pp-client.h \
|
||||||
pp-environment.h \
|
pp-environment.h \
|
||||||
pp-internal.h \
|
|
||||||
pp-macro.h
|
pp-macro.h
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
@@ -46,6 +46,7 @@ SOURCES += \
|
|||||||
LookupContext.cpp \
|
LookupContext.cpp \
|
||||||
pp-engine.cpp \
|
pp-engine.cpp \
|
||||||
pp-environment.cpp \
|
pp-environment.cpp \
|
||||||
pp-macro-expander.cpp
|
pp-macro-expander.cpp \
|
||||||
|
pp-scanner.cpp
|
||||||
|
|
||||||
RESOURCES += cplusplus.qrc
|
RESOURCES += cplusplus.qrc
|
||||||
|
|||||||
@@ -50,8 +50,8 @@
|
|||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PP_CCTYPE_H
|
#ifndef CPLUSPLUS_PP_CCTYPE_H
|
||||||
#define PP_CCTYPE_H
|
#define CPLUSPLUS_PP_CCTYPE_H
|
||||||
|
|
||||||
#include <CPlusPlusForwardDeclarations.h>
|
#include <CPlusPlusForwardDeclarations.h>
|
||||||
|
|
||||||
@@ -73,4 +73,4 @@ inline bool CPLUSPLUS_EXPORT pp_isspace (int __ch)
|
|||||||
|
|
||||||
} // namespace CPlusPlus
|
} // namespace CPlusPlus
|
||||||
|
|
||||||
#endif // PP_CCTYPE_H
|
#endif // CPLUSPLUS_PP_CCTYPE_H
|
||||||
|
|||||||
@@ -31,8 +31,8 @@
|
|||||||
**
|
**
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef PP_CLIENT_H
|
#ifndef CPLUSPLUS_PP_CLIENT_H
|
||||||
#define PP_CLIENT_H
|
#define CPLUSPLUS_PP_CLIENT_H
|
||||||
|
|
||||||
#include <CPlusPlusForwardDeclarations.h>
|
#include <CPlusPlusForwardDeclarations.h>
|
||||||
|
|
||||||
@@ -79,4 +79,4 @@ public:
|
|||||||
|
|
||||||
} // namespace CPlusPlus
|
} // namespace CPlusPlus
|
||||||
|
|
||||||
#endif // PP_CLIENT_H
|
#endif // CPLUSPLUS_PP_CLIENT_H
|
||||||
|
|||||||
@@ -451,7 +451,7 @@ private:
|
|||||||
} // end of anonymous namespace
|
} // end of anonymous namespace
|
||||||
|
|
||||||
|
|
||||||
pp::pp (Client *client, Environment &env)
|
Preprocessor::Preprocessor(Client *client, Environment &env)
|
||||||
: client(client),
|
: client(client),
|
||||||
env(env),
|
env(env),
|
||||||
expand(env)
|
expand(env)
|
||||||
@@ -459,7 +459,7 @@ pp::pp (Client *client, Environment &env)
|
|||||||
resetIfLevel ();
|
resetIfLevel ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::pushState(const State &s)
|
void Preprocessor::pushState(const State &s)
|
||||||
{
|
{
|
||||||
_savedStates.append(state());
|
_savedStates.append(state());
|
||||||
_source = s.source;
|
_source = s.source;
|
||||||
@@ -467,7 +467,7 @@ void pp::pushState(const State &s)
|
|||||||
_dot = s.dot;
|
_dot = s.dot;
|
||||||
}
|
}
|
||||||
|
|
||||||
pp::State pp::state() const
|
Preprocessor::State Preprocessor::state() const
|
||||||
{
|
{
|
||||||
State state;
|
State state;
|
||||||
state.source = _source;
|
state.source = _source;
|
||||||
@@ -476,7 +476,7 @@ pp::State pp::state() const
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::popState()
|
void Preprocessor::popState()
|
||||||
{
|
{
|
||||||
const State &state = _savedStates.last();
|
const State &state = _savedStates.last();
|
||||||
_source = state.source;
|
_source = state.source;
|
||||||
@@ -485,7 +485,7 @@ void pp::popState()
|
|||||||
_savedStates.removeLast();
|
_savedStates.removeLast();
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::operator () (const QByteArray &filename,
|
void Preprocessor::operator () (const QByteArray &filename,
|
||||||
const QByteArray &source,
|
const QByteArray &source,
|
||||||
QByteArray *result)
|
QByteArray *result)
|
||||||
{
|
{
|
||||||
@@ -497,7 +497,7 @@ void pp::operator () (const QByteArray &filename,
|
|||||||
env.currentFile = previousFile;
|
env.currentFile = previousFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
pp::State pp::createStateFromSource(const QByteArray &source) const
|
Preprocessor::State Preprocessor::createStateFromSource(const QByteArray &source) const
|
||||||
{
|
{
|
||||||
State state;
|
State state;
|
||||||
state.source = source;
|
state.source = source;
|
||||||
@@ -512,7 +512,7 @@ pp::State pp::createStateFromSource(const QByteArray &source) const
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::operator()(const QByteArray &source, QByteArray *result)
|
void Preprocessor::operator()(const QByteArray &source, QByteArray *result)
|
||||||
{
|
{
|
||||||
pushState(createStateFromSource(source));
|
pushState(createStateFromSource(source));
|
||||||
|
|
||||||
@@ -700,27 +700,27 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
|
|||||||
env.currentLine = previousCurrentLine;
|
env.currentLine = previousCurrentLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *pp::startOfToken(const Token &token) const
|
const char *Preprocessor::startOfToken(const Token &token) const
|
||||||
{ return _source.constBegin() + token.begin(); }
|
{ 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(); }
|
{ 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,
|
const QByteArray text = QByteArray::fromRawData(_source.constBegin() + token.offset,
|
||||||
token.length);
|
token.length);
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray pp::tokenText(const Token &token) const
|
QByteArray Preprocessor::tokenText(const Token &token) const
|
||||||
{
|
{
|
||||||
const QByteArray text(_source.constBegin() + token.offset,
|
const QByteArray text(_source.constBegin() + token.offset,
|
||||||
token.length);
|
token.length);
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::processDirective(TokenIterator firstToken, TokenIterator lastToken)
|
void Preprocessor::processDirective(TokenIterator firstToken, TokenIterator lastToken)
|
||||||
{
|
{
|
||||||
RangeLexer tk(firstToken, lastToken);
|
RangeLexer tk(firstToken, lastToken);
|
||||||
++tk; // skip T_POUND
|
++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;
|
QVector<Token> tokens;
|
||||||
Lexer lex(text.constBegin(), text.constEnd());
|
Lexer lex(text.constBegin(), text.constEnd());
|
||||||
@@ -784,7 +784,7 @@ QVector<Token> pp::tokenize(const QByteArray &text) const
|
|||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::processInclude(bool skipCurentPath,
|
void Preprocessor::processInclude(bool skipCurentPath,
|
||||||
TokenIterator firstToken, TokenIterator lastToken,
|
TokenIterator firstToken, TokenIterator lastToken,
|
||||||
bool acceptMacros)
|
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);
|
RangeLexer tk(firstToken, lastToken);
|
||||||
|
|
||||||
@@ -921,7 +921,7 @@ void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken)
|
|||||||
client->macroAdded(macro);
|
client->macroAdded(macro);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::processIf(TokenIterator firstToken, TokenIterator lastToken)
|
void Preprocessor::processIf(TokenIterator firstToken, TokenIterator lastToken)
|
||||||
{
|
{
|
||||||
RangeLexer tk(firstToken, 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);
|
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);
|
RangeLexer tk(firstToken, lastToken);
|
||||||
++tk; // skip T_POUND
|
++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()) {
|
if (iflevel == 0 && !skipping()) {
|
||||||
// std::cerr << "*** WARNING #endif without #if" << std::endl;
|
// 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)
|
TokenIterator firstToken, TokenIterator lastToken)
|
||||||
{
|
{
|
||||||
RangeLexer tk(firstToken, 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);
|
RangeLexer tk(firstToken, lastToken);
|
||||||
|
|
||||||
@@ -1029,14 +1029,14 @@ void pp::processUndef(TokenIterator firstToken, TokenIterator lastToken)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pp::resetIfLevel ()
|
void Preprocessor::resetIfLevel ()
|
||||||
{
|
{
|
||||||
iflevel = 0;
|
iflevel = 0;
|
||||||
_skipping[iflevel] = false;
|
_skipping[iflevel] = false;
|
||||||
_true_test[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())
|
switch (__directive.size())
|
||||||
{
|
{
|
||||||
@@ -1085,7 +1085,7 @@ pp::PP_DIRECTIVE_TYPE pp::classifyDirective (const QByteArray &__directive) cons
|
|||||||
return PP_UNKNOWN_DIRECTIVE;
|
return PP_UNKNOWN_DIRECTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pp::testIfLevel()
|
bool Preprocessor::testIfLevel()
|
||||||
{
|
{
|
||||||
const bool result = !_skipping[iflevel++];
|
const bool result = !_skipping[iflevel++];
|
||||||
_skipping[iflevel] = _skipping[iflevel - 1];
|
_skipping[iflevel] = _skipping[iflevel - 1];
|
||||||
@@ -1093,10 +1093,10 @@ bool pp::testIfLevel()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pp::skipping() const
|
int Preprocessor::skipping() const
|
||||||
{ return _skipping[iflevel]; }
|
{ return _skipping[iflevel]; }
|
||||||
|
|
||||||
Value pp::evalExpression(TokenIterator firstToken, TokenIterator lastToken,
|
Value Preprocessor::evalExpression(TokenIterator firstToken, TokenIterator lastToken,
|
||||||
const QByteArray &source) const
|
const QByteArray &source) const
|
||||||
{
|
{
|
||||||
ExpressionEvaluator eval(&env);
|
ExpressionEvaluator eval(&env);
|
||||||
@@ -1104,7 +1104,7 @@ Value pp::evalExpression(TokenIterator firstToken, TokenIterator lastToken,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pp::isQtReservedWord (const QByteArray ¯oId) const
|
bool Preprocessor::isQtReservedWord (const QByteArray ¯oId) const
|
||||||
{
|
{
|
||||||
const int size = macroId.size();
|
const int size = macroId.size();
|
||||||
if (size == 9 && macroId.at(0) == 'Q' && macroId == "Q_SIGNALS")
|
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.
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PP_ENGINE_H
|
#ifndef CPLUSPLUS_PP_ENGINE_H
|
||||||
#define PP_ENGINE_H
|
#define CPLUSPLUS_PP_ENGINE_H
|
||||||
|
|
||||||
#include "pp-client.h"
|
#include "pp-client.h"
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@ namespace CPlusPlus {
|
|||||||
#undef PP_DEFINE_BIN_OP
|
#undef PP_DEFINE_BIN_OP
|
||||||
};
|
};
|
||||||
|
|
||||||
class CPLUSPLUS_EXPORT pp
|
class CPLUSPLUS_EXPORT Preprocessor
|
||||||
{
|
{
|
||||||
Client *client;
|
Client *client;
|
||||||
Environment &env;
|
Environment &env;
|
||||||
@@ -182,7 +182,7 @@ namespace CPlusPlus {
|
|||||||
State createStateFromSource(const QByteArray &source) const;
|
State createStateFromSource(const QByteArray &source) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
pp(Client *client, Environment &env);
|
Preprocessor(Client *client, Environment &env);
|
||||||
|
|
||||||
void operator()(const QByteArray &filename,
|
void operator()(const QByteArray &filename,
|
||||||
const QByteArray &source,
|
const QByteArray &source,
|
||||||
@@ -228,4 +228,4 @@ namespace CPlusPlus {
|
|||||||
|
|
||||||
} // 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.
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PP_ENVIRONMENT_H
|
#ifndef CPLUSPLUS_PP_ENVIRONMENT_H
|
||||||
#define PP_ENVIRONMENT_H
|
#define CPLUSPLUS_PP_ENVIRONMENT_H
|
||||||
|
|
||||||
#include "CPlusPlusForwardDeclarations.h"
|
#include "CPlusPlusForwardDeclarations.h"
|
||||||
|
|
||||||
@@ -108,4 +108,4 @@ private:
|
|||||||
|
|
||||||
} // namespace CPlusPlus
|
} // 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.h"
|
||||||
|
#include "pp-cctype.h"
|
||||||
#include "pp-macro-expander.h"
|
#include "pp-macro-expander.h"
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
|
||||||
using namespace CPlusPlus;
|
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)
|
MacroExpander::MacroExpander (Environment &env, pp_frame *frame)
|
||||||
: env(env), frame(frame),
|
: env(env), frame(frame),
|
||||||
lines(0), generated_lines(0)
|
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);
|
__result->append(__first, next_pos - __first);
|
||||||
__first = next_pos;
|
__first = next_pos;
|
||||||
}
|
}
|
||||||
else if (_PP_internal::comment_p (__first, __last))
|
else if (comment_p (__first, __last))
|
||||||
{
|
{
|
||||||
__first = skip_comment_or_divop (__first, __last);
|
__first = skip_comment_or_divop (__first, __last);
|
||||||
int n = skip_comment_or_divop.lines;
|
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.
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PP_SCANNER_H
|
#ifndef CPLUSPLUS_PP_SCANNER_H
|
||||||
#define PP_SCANNER_H
|
#define CPLUSPLUS_PP_SCANNER_H
|
||||||
|
|
||||||
namespace CPlusPlus {
|
namespace CPlusPlus {
|
||||||
|
|
||||||
struct pp_skip_blanks
|
struct pp_skip_blanks
|
||||||
{
|
{
|
||||||
int lines;
|
int lines;
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_skip_whitespaces
|
struct pp_skip_whitespaces
|
||||||
{
|
{
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_skip_comment_or_divop
|
struct pp_skip_comment_or_divop
|
||||||
{
|
{
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_skip_identifier
|
struct pp_skip_identifier
|
||||||
{
|
{
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_skip_number
|
struct pp_skip_number
|
||||||
{
|
{
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_skip_string_literal
|
struct pp_skip_string_literal
|
||||||
{
|
{
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_skip_char_literal
|
struct pp_skip_char_literal
|
||||||
{
|
{
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_skip_argument
|
struct pp_skip_argument
|
||||||
@@ -321,60 +112,9 @@ struct pp_skip_argument
|
|||||||
pp_skip_comment_or_divop skip_comment_or_divop;
|
pp_skip_comment_or_divop skip_comment_or_divop;
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
|
const char *operator () (const char *first, const char *last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace CPlusPlus
|
} // namespace CPlusPlus
|
||||||
|
|
||||||
#endif // PP_SCANNER_H
|
#endif // CPLUSPLUS_PP_SCANNER_H
|
||||||
|
|
||||||
// kate: space-indent on; indent-width 2; replace-tabs on;
|
|
||||||
|
|||||||
@@ -50,15 +50,9 @@
|
|||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PP_H
|
#ifndef CPLUSPLUS_PREPROCESSOR_H
|
||||||
#define PP_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-macro.h"
|
||||||
#include "pp-environment.h"
|
#include "pp-environment.h"
|
||||||
#include "pp-scanner.h"
|
#include "pp-scanner.h"
|
||||||
@@ -66,4 +60,4 @@
|
|||||||
#include "pp-engine.h"
|
#include "pp-engine.h"
|
||||||
#include "pp-client.h"
|
#include "pp-client.h"
|
||||||
|
|
||||||
#endif // PP_H
|
#endif // CPLUSPLUS_PREPROCESSOR_H
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ private:
|
|||||||
QPointer<CppModelManager> m_modelManager;
|
QPointer<CppModelManager> m_modelManager;
|
||||||
Snapshot m_snapshot;
|
Snapshot m_snapshot;
|
||||||
Environment env;
|
Environment env;
|
||||||
pp m_proc;
|
Preprocessor m_proc;
|
||||||
QStringList m_includePaths;
|
QStringList m_includePaths;
|
||||||
QStringList m_systemIncludePaths;
|
QStringList m_systemIncludePaths;
|
||||||
QMap<QString, QByteArray> m_workingCopy;
|
QMap<QString, QByteArray> m_workingCopy;
|
||||||
|
|||||||
Reference in New Issue
Block a user