##// END OF EJS Templates
fixed initialization order, the importer needs to be store BEFORE the import module is initialized...
fixed initialization order, the importer needs to be store BEFORE the import module is initialized git-svn-id: svn://svn.code.sf.net/p/pythonqt/code/trunk@120 ea8d5007-eb21-0410-b261-ccb3ea6e24a9

File last commit:

r10:21d959e02207
r84:8f25be796564
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;
}
*/