Alien-SmokeQt
view release on metacpan or search on metacpan
generator/parser/stringhelpers.cpp view on Meta::CPAN
case '(':
case '[':
case '{':
case '<':
a = findClose( str, a );
if( a == -1 ) return str.length();
break;
case ')':
case ']':
case '}':
case '>':
if( validEnd != ' ' && validEnd != str[a] )
continue;
case ',':
return a;
}
}
return str.length();
}
QString reverse( const QString& str ) {
QString ret;
int len = str.length();
for( int a = len-1; a >= 0; --a ) {
switch(str[a].toAscii()) {
case '(':
ret += ')';
continue;
case '[':
ret += ']';
continue;
case '{':
ret += '}';
continue;
case '<':
ret += '>';
continue;
case ')':
ret += '(';
continue;
case ']':
ret += '[';
continue;
case '}':
ret += '{';
continue;
case '>':
ret += '<';
continue;
default:
ret += str[a];
continue;
}
}
return ret;
}
///@todo this hackery sucks
QString escapeForBracketMatching(QString str) {
str.replace("<<", "$&");
str.replace(">>", "$$");
str.replace("\\\"", "$!");
str.replace("->", "$?");
return str;
}
QString escapeFromBracketMatching(QString str) {
str.replace("$&", "<<");
str.replace("$$", ">>");
str.replace("$!", "\\\"");
str.replace("$?", "->");
return str;
}
void skipFunctionArguments(QString str, QStringList& skippedArguments, int& argumentsStart ) {
QString withStrings = escapeForBracketMatching(str);
str = escapeForBracketMatching(clearStrings(str));
//Blank out everything that can confuse the bracket-matching algorithm
QString reversed = reverse( str.left(argumentsStart) );
QString withStringsReversed = reverse( withStrings.left(argumentsStart) );
//Now we should decrease argumentStart at the end by the count of steps we go right until we find the beginning of the function
SafetyCounter s( 1000 );
int pos = 0;
int len = reversed.length();
//we are searching for an opening-brace, but the reversion has also reversed the brace
while( pos < len && s ) {
int lastPos = pos;
pos = findCommaOrEnd( reversed, pos ) ;
if( pos > lastPos ) {
QString arg = reverse( withStringsReversed.mid(lastPos, pos-lastPos) ).trimmed();
if( !arg.isEmpty() )
skippedArguments.push_front( escapeFromBracketMatching(arg) ); //We are processing the reversed reverseding, so push to front
}
if( reversed[pos] == ')' || reversed[pos] == '>' )
break;
else
++pos;
}
if( !s ) {
qDebug() << "skipFunctionArguments: Safety-counter triggered";
}
argumentsStart -= pos;
}
QString reduceWhiteSpace(QString str) {
str = str.trimmed();
QString ret;
QChar spaceChar = ' ';
bool hadSpace = false;
for( int a = 0; a < str.length(); a++ ) {
if( str[a].isSpace() ) {
hadSpace = true;
} else {
if( hadSpace ) {
hadSpace = false;
ret += spaceChar;
}
ret += str[a];
}
}
return ret;
}
void fillString( QString& str, int start, int end, QChar replacement ) {
for( int a = start; a < end; a++) str[a] = replacement;
}
QString stripFinalWhitespace(QString str) {
for( int a = str.length() - 1; a >= 0; --a ) {
if( !str[a].isSpace() )
return str.left( a+1 );
}
return QString();
}
QString clearComments( QString str, QChar replacement ) {
QString withoutStrings = clearStrings(str, '$');
SafetyCounter s( 1000 );
int lastPos = 0;
int pos;
int len = str.length();
while( (pos = withoutStrings.indexOf( "/*", lastPos )) != -1 ) {
if( !s ) return str;
( run in 1.345 second using v1.01-cache-2.11-cpan-df04353d9ac )