diff -r 000000000000 -r 88edb906c587 svgtopt/SVG/SVGImpl/src/SVGTokenizer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svgtopt/SVG/SVGImpl/src/SVGTokenizer.cpp Wed Nov 03 18:56:10 2010 +0200 @@ -0,0 +1,315 @@ +/* +* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: SVG Implementation source file + * +*/ + + +#include "SVGTokenizer.h" + +TTokenizer::TTokenizer( const TPtrC& aString ) +{ + iString.Set( Trim( aString ) ); + iCurrentIndex = 0; + iPreviousIndex = 0; +} + +TBool TTokenizer::IsAtEnd() +{ + return iCurrentIndex >= EndIndex(); +} + +TInt TTokenizer::EndIndex() +{ + return iString.Length(); +} + +TUint16 TTokenizer::NextChar() +{ + if ( IsAtEnd() ) + return '\0'; + else + return iString[iCurrentIndex]; +} + +void TTokenizer::Advance( TInt aCount ) +{ + iCurrentIndex += aCount; + if ( iCurrentIndex > EndIndex() ) + iCurrentIndex = EndIndex(); + else if ( iCurrentIndex < 0 ) + iCurrentIndex = 0; + + iPreviousIndex = iCurrentIndex; +} + +TBool TTokenizer::SkipInteger() +{ + if ( iCurrentIndex >= EndIndex() ) + return EFalse; + + if ( NextChar() == '-' || NextChar() == '+' ) + { + TInt index = iCurrentIndex; + iCurrentIndex++; + if ( SkipInteger() ) + { + iPreviousIndex = index; + return ETrue; + } + else + { + iCurrentIndex = index; + iPreviousIndex = iCurrentIndex; + return EFalse; + } + } + + iPreviousIndex = iCurrentIndex; + TInt index = iCurrentIndex; + + while ( index < EndIndex() && IsDigit( iString[index] ) ) + { + index++; + } + if ( IsAtEnd() ) + return EFalse; + + iCurrentIndex = index; + return ETrue; +} + +TBool TTokenizer::SkipDecimal() +{ + if ( iCurrentIndex >= EndIndex() ) + return EFalse; + + if ( NextChar() == '-' || NextChar() == '+' ) + { + TInt index = iCurrentIndex; + iCurrentIndex++; + if ( NextChar() != '-' && NextChar() != '+' && SkipDecimal() ) + { + iPreviousIndex = index; + return ETrue; + } + else + { + iCurrentIndex = index; + iPreviousIndex = iCurrentIndex; + return EFalse; + } + } + + if ( NextChar() == '.' ) + { + TInt index = iCurrentIndex; + Advance( 1 ); // skip '.' + if ( !IsDigit( NextChar() ) ) + { + // Only found '.' and no digits following + Advance( -1 ); + return EFalse; + } + else + { + // '.xxx' + SkipInteger(); + iPreviousIndex = index; + return ETrue; + } + } + else if ( IsDigit( NextChar() ) ) + { + SkipInteger(); + if ( NextChar() != '.' ) + { + // 'xxx' + return ETrue; + } + else + { + TInt index = iPreviousIndex;//iCurrentIndex; + Advance( 1 ); // skip '.' + + SkipInteger(); + iPreviousIndex = index; + return ETrue; + } + + } + return EFalse; +} + +TBool TTokenizer::SkipHex() +{ + if ( iCurrentIndex >= EndIndex() ) + return EFalse; + + iPreviousIndex = iCurrentIndex; + TInt index = iCurrentIndex; + + while ( index < EndIndex() && IsHexDigit( iString[index] ) ) + { + index++; + } + if ( IsAtEnd() ) + return EFalse; + + iCurrentIndex = index; + return ETrue; +} + +TBool TTokenizer::SkipWhiteSpace() +{ + if ( iCurrentIndex >= EndIndex() ) + return EFalse; + + iPreviousIndex = iCurrentIndex; + TInt index = iCurrentIndex; + + while ( index < EndIndex() && IsWhiteSpace( iString[index] ) ) + { + index++; + } + if ( IsAtEnd() ) + return EFalse; + + iCurrentIndex = index; + return ETrue; +} + +TBool TTokenizer::SkipUntil( TUint16 aChar ) +{ + if ( IsAtEnd() ) + return EFalse; + + iPreviousIndex = iCurrentIndex; + + TPtrC remaining( &iString.Ptr()[iCurrentIndex], iString.Length() - iCurrentIndex ); + TInt index = IndexOf( remaining, aChar ); + if ( index == -1 ) + return EFalse; + + iCurrentIndex += index; + return ETrue; +} + +TBool TTokenizer::SkipUntilEnd( ) +{ + if ( IsAtEnd() ) + return EFalse; + + iPreviousIndex = iCurrentIndex; + + TPtrC remaining( &iString.Ptr()[iCurrentIndex], iString.Length() - iCurrentIndex ); + TInt index = remaining.Length(); + + iCurrentIndex += index; + return ETrue; +} + +TBool TTokenizer::StartsWith( const TDesC& aString ) +{ + if ( IsAtEnd() || aString.Length() > iString.Length() - iCurrentIndex ) + return EFalse; + + TPtrC remaining( &iString.Ptr()[iCurrentIndex], aString.Length() ); + return remaining == aString; +} + +TPtrC TTokenizer::SkippedString() +{ + return TPtrC( &iString.Ptr()[iPreviousIndex], iCurrentIndex - iPreviousIndex ); +} + +TPtrC TTokenizer::Remainder() +{ + if ( iString.Length() == 0 ) + return TPtrC( NULL, 0 ); + else + return TPtrC( &iString.Ptr()[iCurrentIndex], iString.Length() - iCurrentIndex ); +} +//------------------------------------------------------ +// Helping Functions +//------------------------------------------------------ +TBool TTokenizer::IsWhiteSpace( TUint16 aChar ) +{ + return ( aChar == ' ' ) || ( aChar == '\t' ) || ( aChar == '\n' ); +} + +TBool TTokenizer::IsDigit( TUint16 aChar ) +{ + return ( aChar >= '0' && aChar <= '9' ); +} + +TBool TTokenizer::IsHexDigit( TUint16 aChar ) +{ + return ( aChar >= '0' && aChar <= '9' ) || + ( aChar >= 'a' && aChar <= 'f' ) || + ( aChar >= 'A' && aChar <= 'F' ); +} + +TInt TTokenizer::IndexOf( const TDesC& aString, TUint16 aChar ) +{ + TInt length = aString.Length(); + for ( TInt i = 0; i < length; i++ ) + { + if ( aString[i] == aChar ) + return i; + } + return -1; +} + +TPtrC TTokenizer::Trim( const TDesC& aString ) +{ + TInt startIndex = 0; + for ( ; startIndex < aString.Length() && IsWhiteSpace( aString[startIndex] ); startIndex++ ) + { + } + + TInt endIndex = aString.Length(); + for ( ; endIndex > 0 && IsWhiteSpace( aString[endIndex-1] ); endIndex-- ) + { + } + + return TPtrC( &aString.Ptr()[startIndex], endIndex - startIndex ); +} + +TBool TTokenizer::ParseDecimal( const TDesC& aString, TReal32& aValue, TPtrC& aRemainder ) + { + TTokenizer tokenizer( aString ); + tokenizer.SkipWhiteSpace(); + + // blank, setting to zero + if ( tokenizer.IsAtEnd() ) + { + return EFalse; + } + + if ( tokenizer.SkipDecimal() ) + { + // Decimal number, extract it + TPtrC decimalString = tokenizer.SkippedString(); + TLex lex( decimalString ); + // Specify the decimal seperator, instead of using + // locale specific seperator. + lex.Val( aValue, '.' ); + + tokenizer.SkipWhiteSpace(); + aRemainder.Set( tokenizer.Remainder() ); + return ETrue; + } + return EFalse; + }