Alien-SmokeQt
view release on metacpan or search on metacpan
generator/parser/rpp/pp-macro-expander.cpp.orig view on Meta::CPAN
output << '\"';
while (!is.atEnd()) {
if (input == '"') {
output << '\\' << is;
} else if (input == '\n') {
output << '"' << is << '"';
} else {
output << is;
}
skip_whitespaces(++is, output);
}
output << '\"';
}
else if (input == '\"')
{
check_header_section
skip_string_literal(input, output);
}
else if (input == '\'')
{
check_header_section
skip_char_literal(input, output);
}
else if (isSpace(input.current()))
{
do {
if (input == '\n' || !isSpace(input.current()))
break;
output << input;
} while (!(++input).atEnd());
}
else if (isNumber(input.current()))
{
check_header_section
skip_number (input, output);
}
else if (isLetter(input.current()) || input == '_' || !isCharacter(input.current()))
{
check_header_section
Anchor inputPosition = input.inputPosition();
IndexedString name = IndexedString::fromIndex(skip_identifier (input));
Anchor inputPosition2 = input.inputPosition();
pp_actual actual = resolve_formal(name, input);
if (actual.isValid()) {
Q_ASSERT(actual.text.size() == actual.inputPosition.size());
QList<PreprocessedContents>::const_iterator textIt = actual.text.constBegin();
QList<Anchor>::const_iterator cursorIt = actual.inputPosition.constBegin();
for( ; textIt != actual.text.constEnd(); ++textIt, ++cursorIt )
{
output.appendString(*cursorIt, *textIt);
}
output << ' '; //Insert a whitespace to omit implicit token merging
output.mark(input.inputPosition());
if(actual.text.isEmpty()) {
int start = input.offset();
skip_blanks(input, devnull());
//Omit paste tokens behind empty used actuals, else we will merge with the previous text
if(input == '#' && (++input) == '#') {
++input;
//We have skipped a paste token
}else{
input.seek(start);
}
}
continue;
}
// TODO handle inbuilt "defined" etc functions
pp_macro* macro = m_engine->environment()->retrieveMacro(name, false);
if (!macro || !macro->defined || macro->hidden || macro->function_like || m_engine->hideNextMacro())
{
m_engine->setHideNextMacro(name == definedIndex);
if (name == lineIndex)
output.appendString(inputPosition, convertFromByteArray(QString::number(input.inputPosition().line).toUtf8()));
else if (name == fileIndex)
output.appendString(inputPosition, convertFromByteArray(QString("\"%1\"").arg(m_engine->currentFileNameString()).toUtf8()));
else if (name == dateIndex)
output.appendString(inputPosition, convertFromByteArray(QDate::currentDate().toString("MMM dd yyyy").toUtf8()));
else if (name == timeIndex)
output.appendString(inputPosition, convertFromByteArray(QTime::currentTime().toString("hh:mm:ss").toUtf8()));
else
output.appendString(inputPosition, name);
continue;
}
EnableMacroExpansion enable(output, input.inputPosition()); //Configure the output-stream so it marks all stored input-positions as transformed through a macro
if (macro->definition.size()) {
macro->hidden = true;
pp_macro_expander expand_macro(m_engine);
///@todo UGLY conversion
Stream ms((uint*)macro->definition.constData(), macro->definition.size(), Anchor(input.inputPosition(), true));
ms.setOriginalInputPosition(input.originalInputPosition());
PreprocessedContents expanded;
{
Stream es(&expanded);
expand_macro(ms, es);
}
if (!expanded.isEmpty())
{
Stream es(&expanded, Anchor(input.inputPosition(), true));
es.setOriginalInputPosition(input.originalInputPosition());
( run in 2.260 seconds using v1.01-cache-2.11-cpan-524268b4103 )