// NOTE: setting 'peek' to true allows the same char to be read again, // however this still advances the internal byte processing. QChar readNext(bool peek=false) { QChar c; if(mightChangeEncoding) c = EndOfData; else { if(out.isEmpty()) { QString s; if(!tryExtractPart(&s)) c = EndOfData; else { out = s; c = out[0]; } } else c = out[0]; if(!peek) out.remove(0, 1); } if(c == EndOfData) { #ifdef XMPP_PARSER_DEBUG printf("next() = EOD\n"); #endif } else { #ifdef XMPP_PARSER_DEBUG printf("next() = [%c]\n", c.latin1()); #endif last = c; } return c; }
char toAscii(QChar c) { #if QT_VERSION>=0x040000 // QT4 code return c.toAscii(); #else // QT3 code return c.latin1(); #endif }
void TabDialog::latinize(QString & s) { unsigned i = s.length(); while (i != 0) { QChar c = s.at(--i); if (c.latin1() == 0) { if (c.unicode() == 8217) // special case for the pseudo ' returned by microsoft editors c = '\''; else c = ' '; s.replace(i, 1, &c, 1); } } }
static int DecodeEscapedChar(QString & password,int idx) { QChar a = password[idx + 1].lower(); QChar b = password[idx + 2].lower(); if (!a.isNumber() && !(a.latin1() >= 'a' && a.latin1() <= 'f')) return idx + 2; // not a valid hex digit if (!b.isNumber() && !(b.latin1() >= 'a' && b.latin1() <= 'f')) return idx + 2; // not a valid hex digit // calculate high and low nibble Uint8 h = (a.latin1() - (a.isNumber() ? '0' : 'a')) << 4; Uint8 l = (b.latin1() - (b.isNumber() ? '0' : 'a')); char r = (char) h | l; // combine them and cast to a char password.replace(idx,3,r); return idx + 1; }
void QSASyntaxHighlighter::process( QTextDocument *doc, QTextParagraph *string, int, bool invalidate ) { // ### AbanQ if (this == 0) return; QTextFormat *formatStandard = format( Standard ); QTextFormat *formatComment = format( Comment ); QTextFormat *formatNumber = format( Number ); QTextFormat *formatString = format( String ); QTextFormat *formatType = format( Type ); QTextFormat *formatPreProcessor = format( PreProcessor ); QTextFormat *formatLabel = format( Label ); // states const int StateStandard = 0; const int StateCommentStart1 = 1; const int StateCCommentStart2 = 2; const int StateCppCommentStart2 = 3; const int StateCComment = 4; const int StateCppComment = 5; const int StateCCommentEnd1 = 6; const int StateCCommentEnd2 = 7; const int StateStringStart = 8; const int StateString = 9; const int StateStringEnd = 10; const int StateString2Start = 11; const int StateString2 = 12; const int StateString2End = 13; const int StateNumber = 14; const int StatePreProcessor = 15; // tokens const int InputAlpha = 0; const int InputNumber = 1; const int InputAsterix = 2; const int InputSlash = 3; const int InputParen = 4; const int InputSpace = 5; const int InputHash = 6; const int InputQuotation = 7; const int InputApostrophe = 8; const int InputSep = 9; static const uchar table[ 16 ][ 10 ] = { { StateStandard, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStandard { StateStandard, StateNumber, StateCCommentStart2, StateCppCommentStart2, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCommentStart1 { StateCComment, StateCComment, StateCCommentEnd1, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCCommentStart2 { StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment }, // CppCommentStart2 { StateCComment, StateCComment, StateCCommentEnd1, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCComment { StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment }, // StateCppComment { StateCComment, StateCComment, StateCCommentEnd1, StateCCommentEnd2, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCCommentEnd1 { StateStandard, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCCommentEnd2 { StateString, StateString, StateString, StateString, StateString, StateString, StateString, StateStringEnd, StateString, StateString }, // StateStringStart { StateString, StateString, StateString, StateString, StateString, StateString, StateString, StateStringEnd, StateString, StateString }, // StateString { StateStandard, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStringEnd { StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2End, StateString2 }, // StateString2Start { StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2End, StateString2 }, // StateString2 { StateStandard, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateString2End { StateNumber, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateNumber { StatePreProcessor, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard } // StatePreProcessor }; QString buffer; int state = StateStandard; if ( string->prev() ) { if ( string->prev()->endState() == -1 ) process( doc, string->prev(), 0, FALSE ); state = string->prev()->endState(); } int input = -1; int i = 0; bool lastWasBackSlash = FALSE; bool makeLastStandard = FALSE; ParagData *paragData = (ParagData*)string->extraData(); if ( paragData ) paragData->parenList.clear(); else paragData = new ParagData; string->setExtraData( paragData ); static QString alphabeth = QString::fromLatin1("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); static QString mathChars = QString::fromLatin1("xXeE"); static QString numbers = QString::fromLatin1("0123456789"); bool questionMark = FALSE; bool resetLineState = TRUE; QChar lastChar; QString firstWord; while ( TRUE ) { QChar c = string->at( i )->c; if ( lastWasBackSlash ) { input = InputSep; } else { switch ( c.latin1() ) { case '*': input = InputAsterix; break; case '/': input = InputSlash; break; case '(': case '[': case '{': input = InputParen; if ( state == StateStandard || state == StateNumber || state == StatePreProcessor || state == StateCCommentEnd2 || state == StateCCommentEnd1 || state == StateString2End || state == StateStringEnd ) paragData->parenList << Paren( Paren::Open, c, i ); break; case ')': case ']': case '}': input = InputParen; if ( state == StateStandard || state == StateNumber || state == StatePreProcessor || state == StateCCommentEnd2 || state == StateCCommentEnd1 || state == StateString2End || state == StateStringEnd ) { paragData->parenList << Paren( Paren::Closed, c, i ); if ( c == '}' ) { if ( checkFunctionEnd( string, i ) ) resetLineState = FALSE; } } break; case '#': input = InputHash; break; case '"': input = InputQuotation; break; case '\'': input = InputApostrophe; break; case ' ': input = InputSpace; if ( firstWord == QString::fromLatin1("function") || firstWord == QString::fromLatin1("constructor") || firstWord == QString::fromLatin1("class")/* || firstWord == "if" || firstWord == "for" || firstWord == "while" || firstWord == "else"*/ ) { paragData->lineState = ParagData::FunctionStart; resetLineState = FALSE; } break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': if ( alphabeth.find( lastChar ) != -1 && ( mathChars.find( lastChar ) == -1 || numbers.find( string->at( i - 1 )->c ) == -1 ) ) { input = InputAlpha; } else { if ( input == InputAlpha && numbers.find( lastChar ) != -1 ) input = InputAlpha; else input = InputNumber; } break; case ':': { input = InputAlpha; QChar nextChar = ' '; if ( i < string->length() - 1 ) nextChar = string->at( i + 1 )->c; if ( state == StateStandard && !questionMark && lastChar != ':' && nextChar != ':' && lastChar.isLetter() ) { for ( int j = 0; j < i; ++j ) { if ( string->at( j )->format() == formatStandard ) string->setFormat( j, 1, formatLabel, FALSE ); } } break; } default: { if ( c != '\t' ) firstWord += c; QString s = firstWord.simplifyWhiteSpace(); if ( s == QString::fromLatin1("private") || s == QString::fromLatin1("protected") || s == QString::fromLatin1("public") || s == QString::fromLatin1("static") ) firstWord = ""; if ( !questionMark && c == '?' ) questionMark = TRUE; if ( c.isLetter() || c == '_' ) input = InputAlpha; else input = InputSep; } break; } } lastWasBackSlash = !lastWasBackSlash && c == '\\'; if ( input == InputAlpha ) buffer += c; state = table[ state ][ input ]; switch ( state ) { case StateStandard: { int len = buffer.length(); string->setFormat( i, 1, formatStandard, FALSE ); if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; if ( buffer.length() > 0 && input != InputAlpha ) { if ( buffer == QString::fromLatin1("true") || buffer == QString::fromLatin1("false") || buffer == QString::fromLatin1("NaN") || buffer == QString::fromLatin1("Infinity") || buffer == QString::fromLatin1("undefined") ) { string->setFormat( i - buffer.length(), buffer.length(), formatType, FALSE ); } else { QMap<int, QMap<QString, int > >::Iterator it = wordMap->find( len ); if ( it != wordMap->end() ) { QMap<QString, int >::Iterator it2 = ( *it ).find( buffer ); if ( it2 != ( *it ).end() ) string->setFormat( i - buffer.length(), buffer.length(), format( ( *it2 ) ), FALSE ); } } buffer = QString::null; } } break; case StateCommentStart1: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = TRUE; buffer = QString::null; break; case StateCCommentStart2: string->setFormat( i - 1, 2, formatComment, FALSE ); makeLastStandard = FALSE; buffer = QString::null; break; case StateCppCommentStart2: string->setFormat( i - 1, 2, formatComment, FALSE ); makeLastStandard = FALSE; buffer = QString::null; break; case StateCComment: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateCppComment: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateCCommentEnd1: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateCCommentEnd2: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateStringStart: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateString: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatString, FALSE ); buffer = QString::null; break; case StateStringEnd: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateString2Start: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateString2: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatString, FALSE ); buffer = QString::null; break; case StateString2End: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateNumber: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatNumber, FALSE ); buffer = QString::null; break; case StatePreProcessor: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatPreProcessor, FALSE ); buffer = QString::null; break; } lastChar = c; i++; if ( i >= string->length() ) break; } if ( resetLineState ) paragData->lineState = ParagData::InFunction; string->setExtraData( paragData ); int oldEndState = string->endState(); if ( state == StateCComment || state == StateCCommentEnd1 ) { string->setEndState( StateCComment ); } else if ( state == StateString ) { string->setEndState( StateString ); } else if ( state == StateString2 ) { string->setEndState( StateString2 ); } else { string->setEndState( StateStandard ); } string->setFirstPreProcess( FALSE ); QTextParagraph *p = string->next(); if ( (!!oldEndState || !!string->endState()) && oldEndState != string->endState() && invalidate && p && !p->firstPreProcess() && p->endState() != -1 ) { while ( p ) { if ( p->endState() == -1 ) return; p->setEndState( -1 ); p = p->next(); } } }
void TypeDesc::init( QString stri ) { m_data = 0; maybeInit(); if ( stri.isEmpty() ) return ; m_data->m_dec = stri; ///Store the decoration QStringList ls = splitType( stri ); QString str = ls.front().stripWhiteSpace(); ///Extract multiple types that may be written as a scope and put them to the next-types-list if ( !ls.isEmpty() ) { ls.pop_front(); if ( !ls.isEmpty() ) { m_data->m_nextType = TypeDescPointer( new TypeDescShared( ls.join( "::" ) ) ); } } while ( str.startsWith( QString( functionMark ) ) ) { m_data->m_functionDepth++; str = str.mid( strlen( functionMark ) ).stripWhiteSpace(); } bool isFunction = false, shorten = true; //Little hack done for performance-reasons, to do less comparing if( str.length() >= 4 ) { QChar c = str[0]; switch( c.latin1() ) { case 's': if( str[1] == 'h' ) { if( str.startsWith( "short" ) ) shorten = false; } else if( str[1] == 'i' ) { if( str.startsWith( "signed" ) ) shorten = false; } break; case 'l': if( str.startsWith( "long" ) ) shorten = false; break; case 'u': if( str.startsWith( "unsigned" ) ) shorten = false; break; case 'o': if( str.startsWith( "operator " ) ) { isFunction = true; shorten = false; } } } ///Since function-names are also processed by this function, this check has to be done if( shorten ) { ///Remove any prefixes like const or typename(very limited algorithm) int len = str.find( "<" ); if ( len == -1 ) len = str.length(); int currentStart = 0; bool wasEmpty = false; for ( int a = 0; a < len; a++ ) { if ( str[ a ] == ' ' ) { wasEmpty = true; } else if( wasEmpty && isValidIdentifierSign( str[a] ) ){ currentStart = a; wasEmpty = false; } } str = str.mid( currentStart ); } #ifdef USELEXER Driver d; Lexer lex( &d ); lex.setSource( str ); Parser parser( &d, &lex ); TypeSpecifierAST::Node typeSpec; if ( parser.parseTypeSpecifier( typeSpec ) ) { NameAST * name = typeSpec->name(); QPtrList<ClassOrNamespaceNameAST> l = name->classOrNamespaceNameList(); QPtrListIterator<ClassOrNamespaceNameAST> it( l ); QString type; while ( it.current() ) { if ( it.current() ->name() ) { type += it.current() ->name() ->text() + "::"; } ++it; } if ( name->unqualifiedName() && name->unqualifiedName() ->name() ) { type += name->unqualifiedName() ->name() ->text(); } m_data->m_cleanName = type.stripWhiteSpace(); takeTemplateParams( str ); m_data->m_pointerDepth = countExtract( '*', str ); } #else if( !isFunction ) { takeData( str ); m_data->m_pointerDepth = countExtract( '*', str ); } else { m_data->m_cleanName = str; } #endif }
bool Q3Url::parse( const QString& url ) { QString url_( url ); slashify( url_ ); if ( url_.isEmpty() ) { d->isValid = false; return false; } d->cleanPathDirty = true; d->isValid = true; QString oldProtocol = d->protocol; d->protocol.clear(); const int Init = 0; const int Protocol = 1; const int Separator1= 2; // : const int Separator2= 3; // :/ const int Separator3= 4; // :// or more slashes const int User = 5; const int Pass = 6; const int Host = 7; const int Path = 8; const int Ref = 9; const int Query = 10; const int Port = 11; const int Done = 12; const int InputAlpha= 1; const int InputDigit= 2; const int InputSlash= 3; const int InputColon= 4; const int InputAt = 5; const int InputHash = 6; const int InputQuery= 7; static uchar table[ 12 ][ 8 ] = { /* None InputAlpha InputDigit InputSlash InputColon InputAt InputHash InputQuery */ { 0, Protocol, 0, Path, 0, 0, 0, 0, }, // Init { 0, Protocol, Protocol, 0, Separator1, 0, 0, 0, }, // Protocol { 0, Path, Path, Separator2, 0, 0, 0, 0, }, // Separator1 { 0, Path, Path, Separator3, 0, 0, 0, 0, }, // Separator2 { 0, User, User, Separator3, Pass, Host, 0, 0, }, // Separator3 { 0, User, User, User, Pass, Host, User, User, }, // User { 0, Pass, Pass, Pass, Pass, Host, Pass, Pass, }, // Pass { 0, Host, Host, Path, Port, Host, Ref, Query, }, // Host { 0, Path, Path, Path, Path, Path, Ref, Query, }, // Path { 0, Ref, Ref, Ref, Ref, Ref, Ref, Query, }, // Ref { 0, Query, Query, Query, Query, Query, Query, Query, }, // Query { 0, 0, Port, Path, 0, 0, 0, 0, } // Port }; bool relPath = false; relPath = false; bool forceRel = false; // If ':' is at pos 1, we have only one letter // before that separator => that's a drive letter! if ( url_.length() >= 2 && url_[1] == QLatin1Char(':') ) relPath = forceRel = true; int hasNoHost = -1; int cs = url_.find( QLatin1String(":/") ); if ( cs != -1 ) // if a protocol is there, find out if there is a host or directly the path after it hasNoHost = url_.find( QLatin1String("///"), cs ); table[ 4 ][ 1 ] = User; table[ 4 ][ 2 ] = User; if ( cs == -1 || forceRel ) { // we have a relative file if ( url.find( QLatin1Char(':') ) == -1 || forceRel ) { table[ 0 ][ 1 ] = Path; // Filenames may also begin with a digit table[ 0 ][ 2 ] = Path; } else { table[ 0 ][ 1 ] = Protocol; } relPath = true; } else { // some checking table[ 0 ][ 1 ] = Protocol; // find the part between the protocol and the path as the meaning // of that part is dependent on some chars ++cs; while ( url_[ cs ] == QLatin1Char('/') ) ++cs; int slash = url_.find( QLatin1String("/"), cs ); if ( slash == -1 ) slash = url_.length() - 1; QString tmp = url_.mid( cs, slash - cs + 1 ); if ( !tmp.isEmpty() ) { // if this part exists // look for the @ in this part int at = tmp.find( QLatin1String("@") ); if ( at != -1 ) at += cs; // we have no @, which means host[:port], so directly // after the protocol the host starts, or if the protocol // is file or there were more than 2 slashes, it is the // path if ( at == -1 ) { if ( url_.left( 4 ) == QLatin1String("file") || hasNoHost != -1 ) table[ 4 ][ 1 ] = Path; else table[ 4 ][ 1 ] = Host; table[ 4 ][ 2 ] = table[ 4 ][ 1 ]; } } } int state = Init; // parse state int input; // input token QChar c = url_[ 0 ]; int i = 0; QString port; for ( ;; ) { switch ( c.latin1() ) { case '?': input = InputQuery; break; case '#': input = InputHash; break; case '@': input = InputAt; break; case ':': input = InputColon; break; case '/': input = InputSlash; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': input = InputDigit; break; default: input = InputAlpha; } state = table[ state ][ input ]; switch ( state ) { case Protocol: d->protocol += c; break; case User: d->user += c; break; case Pass: d->pass += c; break; case Host: d->host += c; break; case Path: d->path += c; break; case Ref: d->refEncoded += c; break; case Query: d->queryEncoded += c; break; case Port: port += c; break; default: break; } ++i; if ( i > (int)url_.length() - 1 || state == Done || state == 0 ) break; c = url_[ i ]; } if ( !port.isEmpty() ) { port.remove( (uint)0, 1 ); d->port = port.toInt(); } // error if ( i < (int)url_.length() - 1 ) { d->isValid = false; return false; } if ( d->protocol.isEmpty() ) d->protocol = oldProtocol; if ( d->path.isEmpty() ) d->path = QLatin1String("/"); // hack for windows if ( d->path.length() == 2 && d->path[ 1 ] == QLatin1Char(':') ) d->path += QLatin1String("/"); // #### do some corrections, should be done nicer too if ( !d->pass.isEmpty() ) { if ( d->pass[ 0 ] == QLatin1Char(':') ) d->pass.remove( (uint)0, 1 ); decode( d->pass ); } if ( !d->user.isEmpty() ) { decode( d->user ); } if ( !d->path.isEmpty() ) { if ( d->path[ 0 ] == QLatin1Char('@') || d->path[ 0 ] == QLatin1Char(':') ) d->path.remove( (uint)0, 1 ); if ( d->path[ 0 ] != QLatin1Char('/') && !relPath && d->path[ 1 ] != QLatin1Char(':') ) d->path.prepend( QLatin1String("/") ); } if ( !d->refEncoded.isEmpty() && d->refEncoded[ 0 ] == QLatin1Char('#') ) d->refEncoded.remove( (uint)0, 1 ); if ( !d->queryEncoded.isEmpty() && d->queryEncoded[ 0 ] == QLatin1Char('?') ) d->queryEncoded.remove( (uint)0, 1 ); if ( !d->host.isEmpty() && d->host[ 0 ] == QLatin1Char('@') ) d->host.remove( (uint)0, 1 ); #if defined(Q_OS_WIN32) // hack for windows file://machine/path syntax if ( d->protocol == QLatin1String("file") ) { if ( url.left( 7 ) == QLatin1String("file://") && d->path.length() > 1 && d->path[ 1 ] != QLatin1Char(':') ) d->path.prepend( QLatin1String("/") ); } #endif decode( d->path ); d->cleanPathDirty = true; #if 0 qDebug( "URL: %s", url.latin1() ); qDebug( "protocol: %s", d->protocol.latin1() ); qDebug( "user: %s", d->user.latin1() ); qDebug( "pass: %s", d->pass.latin1() ); qDebug( "host: %s", d->host.latin1() ); qDebug( "path: %s", path().latin1() ); qDebug( "ref: %s", d->refEncoded.latin1() ); qDebug( "query: %s", d->queryEncoded.latin1() ); qDebug( "port: %d\n\n----------------------------\n\n", d->port ); #endif return true; }
bool PMDeclareEdit::isDataValid( ) { if( !Base::isDataValid( ) ) return false; QString text = m_pNameEdit->text( ); if( text.length( ) == 0 ) { KMessageBox::error( this, i18n( "Please enter an identifier!" ), i18n( "Error" ) ); return false; } if( text == m_pDisplayedObject->id( ) ) return true; QTextStream str( &text, IO_ReadOnly ); QChar c; int ac; bool ok = true; int i = 0; while( !str.atEnd( ) && ok ) { str >> c; ac = c.latin1( ); // QChar::category can't be used because umlauts are not allowed if( i == 0 ) ok = ( ( ( ac >= 'a' ) && ( ac <= 'z' ) ) || ( ( ac >= 'A' ) && ( ac <= 'Z' ) ) || ( ac == '_' ) ); else ok = ( ( ( ac >= 'a' ) && ( ac <= 'z' ) ) || ( ( ac >= 'A' ) && ( ac <= 'Z' ) ) || ( ( ac >= '0' ) && ( ac <= '9' ) ) || ( ac == '_' ) ); i++; } if( !ok ) { KMessageBox::error( this, i18n( "An identifier may consist of letters," " digits and the underscore character" " ('_').\n" "The first character must be a letter" " or the underscore character!" ), i18n( "Error" ) ); return false; } // valid identifer! PMReservedWordDict* dict = PMScanner::reservedWords( ); if( dict->find( text.latin1( ) ) != -1 ) { KMessageBox::error( this, i18n( "You can't use a povray reserved word" " as an identifier!" ), i18n( "Error" ) ); return false; } dict = PMScanner::directives( ); if( dict->find( text.latin1( ) ) != -1 ) { KMessageBox::error( this, i18n( "You can't use a povray directive" " as an identifier!" ), i18n( "Error" ) ); return false; } // no reserved word PMSymbolTable* st = part( )->symbolTable( ); if( st->find( text ) ) { KMessageBox::error( this, i18n( "Please enter a unique identifier!" ), i18n( "Error" ) ); return false; } return true; }