##// END OF EJS Templates
changed so that paths are ignored when they startWith() an ignore path instead of matching the ignore path...
changed so that paths are ignored when they startWith() an ignore path instead of matching the ignore path git-svn-id: svn://svn.code.sf.net/p/pythonqt/code/trunk@76 ea8d5007-eb21-0410-b261-ccb3ea6e24a9

File last commit:

r10:21d959e02207
r40:054959ca17a1
Show More
preprocessor.cpp
149 lines | 3.5 KiB | text/x-c | CppLexer
/****************************************************************************
**
** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
** Copyright 2005 Harald Fernengel <harry@kdevelop.org>
**
** This file is part of $PRODUCT$.
**
** $CPP_LICENSE$
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/
#include "preprocessor.h"
#include <string>
// register callback for include hooks
static void includeFileHook(const std::string &, const std::string &, FILE *);
#define PP_HOOK_ON_FILE_INCLUDED(A, B, C) includeFileHook(A, B, C)
#include "pp.h"
using namespace rpp;
#include <QtCore/QtCore>
class PreprocessorPrivate
{
public:
QByteArray result;
pp_environment env;
QStringList includePaths;
void initPP(pp &proc)
{
foreach(QString path, includePaths)
proc.push_include_path(path.toStdString());
}
};
QHash<QString, QStringList> includedFiles;
void includeFileHook(const std::string &fileName, const std::string &filePath, FILE *)
{
includedFiles[QString::fromStdString(fileName)].append(QString::fromStdString(filePath));
}
Preprocessor::Preprocessor()
{
d = new PreprocessorPrivate;
includedFiles.clear();
}
Preprocessor::~Preprocessor()
{
delete d;
}
void Preprocessor::processFile(const QString &fileName)
{
pp proc(d->env);
d->initPP(proc);
d->result.reserve(d->result.size() + 20 * 1024);
d->result += "# 1 \"" + fileName.toLatin1() + "\"\n"; // ### REMOVE ME
proc.file(fileName.toLocal8Bit().constData(), std::back_inserter(d->result));
}
void Preprocessor::processString(const QByteArray &str)
{
pp proc(d->env);
d->initPP(proc);
proc(str.begin(), str.end(), std::back_inserter(d->result));
}
QByteArray Preprocessor::result() const
{
return d->result;
}
void Preprocessor::addIncludePaths(const QStringList &includePaths)
{
d->includePaths += includePaths;
}
QStringList Preprocessor::macroNames() const
{
QStringList macros;
pp_environment::const_iterator it = d->env.first_macro();
while (it != d->env.last_macro()) {
const pp_macro *m = *it;
macros += QString::fromLatin1(m->name->begin(), m->name->size());
++it;
}
return macros;
}
QList<Preprocessor::MacroItem> Preprocessor::macros() const
{
QList<MacroItem> items;
pp_environment::const_iterator it = d->env.first_macro();
while (it != d->env.last_macro()) {
const pp_macro *m = *it;
MacroItem item;
item.name = QString::fromLatin1(m->name->begin(), m->name->size());
item.definition = QString::fromLatin1(m->definition->begin(),
m->definition->size());
for (size_t i = 0; i < m->formals.size(); ++i) {
item.parameters += QString::fromLatin1(m->formals[i]->begin(),
m->formals[i]->size());
}
item.isFunctionLike = m->function_like;
#ifdef PP_WITH_MACRO_POSITION
item.fileName = QString::fromLatin1(m->file->begin(), m->file->size());
#endif
items += item;
++it;
}
return items;
}
/*
int main()
{
Preprocessor pp;
QStringList paths;
paths << "/usr/include";
pp.addIncludePaths(paths);
pp.processFile("pp-configuration");
pp.processFile("/usr/include/stdio.h");
qDebug() << pp.result();
return 0;
}
*/