1
#include "Preprocessor.h"
7
#include "../../SyntopiaCore/Exceptions/Exception.h"
8
#include "../../SyntopiaCore/Logging/Logging.h"
10
using namespace SyntopiaCore::Exceptions;
11
using namespace SyntopiaCore::Logging;
14
namespace StructureSynth {
17
QString Preprocessor::Process(QString input) {
18
QStringList in = input.split(QRegExp("\r\n|\r|\n"));
20
QMap<QString, QString> substitutions;
21
QRegExp ppCommand("^#"); // Look for #define varname value
22
QRegExp defineCommand("^#define\\s([^\\s]+)\\s(.*)*$"); // Look for #define varname value
25
for (QStringList::iterator it = in.begin(); it != in.end(); ++it) {
27
if (ppCommand.indexIn(*it) != -1) {
28
// Preprocessor command
29
if (defineCommand.indexIn(*it) != -1) {
30
//INFO(QString("Found ppC (%1)->(%2): ").arg(defineCommand.cap(1)).arg(defineCommand.cap(2)) + *it);
31
substitutions[defineCommand.cap(1)] = defineCommand.cap(2);
33
WARNING("Could not understand preprocessor command: " + *it);
36
// Non-preprocessor command
37
// Check for substitutions.
38
QMap<QString, QString>::const_iterator it2 = substitutions.constBegin();
40
while (it2 != substitutions.constEnd()) {
42
WARNING("More than 100 recursive preprocessor substitutions... breaking.");
45
if ((*it).contains(it2.key())) {
46
(*it).replace(it2.key(), it2.value());
47
it2 = substitutions.constBegin();
57
return out.join("\r\n");