##// END OF EJS Templates
moved return value creation AFTER the successful check of the call parameters, otherwise the return value allocation is done for nothing...
moved return value creation AFTER the successful check of the call parameters, otherwise the return value allocation is done for nothing git-svn-id: svn://svn.code.sf.net/p/pythonqt/code/trunk@81 ea8d5007-eb21-0410-b261-ccb3ea6e24a9

File last commit:

r10:21d959e02207
r45:73b37bcd54f9
Show More
preprocessor.cpp
149 lines | 3.5 KiB | text/x-c | CppLexer
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 /****************************************************************************
**
** 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;
}
*/