svgtopt/SVG/SVGImpl/src/SVGPointLexer.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  SVG Implementation source file
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "SVGPointLexer.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include "stdlib.h"
hgs
parents:
diff changeset
    22
#include "string.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
// Below define is used as a mask for getting LSB of 16bit number
hgs
parents:
diff changeset
    25
// for endian-agnostic progressing.
hgs
parents:
diff changeset
    26
#define KLSBMASK ( 0xFF )
hgs
parents:
diff changeset
    27
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    28
//
hgs
parents:
diff changeset
    29
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
TSvgPointLexer::TSvgPointLexer( const TDesC& aDes ) :
hgs
parents:
diff changeset
    31
                iLex( aDes ), iNegativeNumber( EFalse )
hgs
parents:
diff changeset
    32
{
hgs
parents:
diff changeset
    33
    iDataCopy = NULL;
hgs
parents:
diff changeset
    34
    iDataCopy = aDes.Alloc();
hgs
parents:
diff changeset
    35
    if ( iDataCopy )
hgs
parents:
diff changeset
    36
    {
hgs
parents:
diff changeset
    37
        iData = (TUint16 *)iDataCopy->Ptr();
hgs
parents:
diff changeset
    38
        iDataEnd = iData + iDataCopy->Length();
hgs
parents:
diff changeset
    39
    }
hgs
parents:
diff changeset
    40
}
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
void TSvgPointLexer::Cleanup()
hgs
parents:
diff changeset
    43
{
hgs
parents:
diff changeset
    44
    if ( iDataCopy )
hgs
parents:
diff changeset
    45
    {
hgs
parents:
diff changeset
    46
        delete iDataCopy;
hgs
parents:
diff changeset
    47
        iDataCopy = NULL;
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
}
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    52
//
hgs
parents:
diff changeset
    53
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
TInt32 TSvgPointLexer::GetNext( TChar& aCommand, TFloatFixPt& aVal )
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    TReal32 realnum = 0.0;
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    // Parse a command and minus symbol
hgs
parents:
diff changeset
    59
    iNegativeNumber = EFalse;
hgs
parents:
diff changeset
    60
    aCommand = SkipUntilNum();
hgs
parents:
diff changeset
    61
    if ( iLex.Eos() && aCommand != 'z' )
hgs
parents:
diff changeset
    62
        {
hgs
parents:
diff changeset
    63
        return -1;
hgs
parents:
diff changeset
    64
        }
hgs
parents:
diff changeset
    65
    else if ( aCommand == 'z' )
hgs
parents:
diff changeset
    66
        {
hgs
parents:
diff changeset
    67
        // if 'z' was found return immediately
hgs
parents:
diff changeset
    68
        // never parse for numbers
hgs
parents:
diff changeset
    69
        return KErrNone;
hgs
parents:
diff changeset
    70
        }
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
    // Parse a number with fraction
hgs
parents:
diff changeset
    73
    iLex.Mark();
hgs
parents:
diff changeset
    74
    if ( SkipToNumEnd() )
hgs
parents:
diff changeset
    75
        {
hgs
parents:
diff changeset
    76
         TInt result = TLex( iLex.MarkedToken() ).Val( realnum, '.' ) ;
hgs
parents:
diff changeset
    77
	     if (result != KErrNone)
hgs
parents:
diff changeset
    78
			{
hgs
parents:
diff changeset
    79
			realnum= 0.0;
hgs
parents:
diff changeset
    80
			return result;
hgs
parents:
diff changeset
    81
			}
hgs
parents:
diff changeset
    82
        }
hgs
parents:
diff changeset
    83
    else
hgs
parents:
diff changeset
    84
        {
hgs
parents:
diff changeset
    85
        realnum = 0.0;
hgs
parents:
diff changeset
    86
        }
hgs
parents:
diff changeset
    87
    if ( iNegativeNumber )
hgs
parents:
diff changeset
    88
        realnum = -realnum;
hgs
parents:
diff changeset
    89
    aVal = ( TFloatFixPt ) realnum;
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
    return KErrNone;
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
//
hgs
parents:
diff changeset
    96
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
TBool TSvgPointLexer::GetNextWithNumOfPoints( TFloatFixPt *aVal, TInt NoOfPoints)
hgs
parents:
diff changeset
    99
    {
hgs
parents:
diff changeset
   100
    TReal32 realnum = 0.0;
hgs
parents:
diff changeset
   101
	TUint8 tmpchar;
hgs
parents:
diff changeset
   102
    TInt i=0;
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
	for( i=0;i < NoOfPoints;i++ )
hgs
parents:
diff changeset
   105
		{
hgs
parents:
diff changeset
   106
        // Since iData is a TUint16 pointer, and we need to 
hgs
parents:
diff changeset
   107
        // operate with 8bit ASCII, mask LSB to obtain the same
hgs
parents:
diff changeset
   108
		tmpchar = *iData & KLSBMASK;
hgs
parents:
diff changeset
   109
        // Traverse the string while character encountered is
hgs
parents:
diff changeset
   110
        // ' ', LineFeed('\0xa'), ',', Carriage Return ('\0xd')
hgs
parents:
diff changeset
   111
		while( !(tmpchar^32) || !(tmpchar^10) || !(tmpchar^44) || !(tmpchar^13) )
hgs
parents:
diff changeset
   112
			{
hgs
parents:
diff changeset
   113
			iData++;
hgs
parents:
diff changeset
   114
            if ( iData < iDataEnd )    
hgs
parents:
diff changeset
   115
                {
hgs
parents:
diff changeset
   116
		        tmpchar = *iData & KLSBMASK;
hgs
parents:
diff changeset
   117
                }
hgs
parents:
diff changeset
   118
            else
hgs
parents:
diff changeset
   119
                {
hgs
parents:
diff changeset
   120
                // Exceeding buffer limits, return error
hgs
parents:
diff changeset
   121
                return EFalse;
hgs
parents:
diff changeset
   122
                }
hgs
parents:
diff changeset
   123
			}
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
        // Check if character encountered is '-' 
hgs
parents:
diff changeset
   126
		if( !(tmpchar^45) )
hgs
parents:
diff changeset
   127
			{
hgs
parents:
diff changeset
   128
			iData++;
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
            if ( iData < iDataEnd )
hgs
parents:
diff changeset
   131
                {
hgs
parents:
diff changeset
   132
    			if(SkipToNumEndWithoutLex(realnum) )
hgs
parents:
diff changeset
   133
    				{
hgs
parents:
diff changeset
   134
    				realnum = -realnum;
hgs
parents:
diff changeset
   135
    				}
hgs
parents:
diff changeset
   136
    			else
hgs
parents:
diff changeset
   137
    				{
hgs
parents:
diff changeset
   138
    				return EFalse;
hgs
parents:
diff changeset
   139
    				}
hgs
parents:
diff changeset
   140
                }
hgs
parents:
diff changeset
   141
            else // if ( iData < iDataEnd )
hgs
parents:
diff changeset
   142
                {
hgs
parents:
diff changeset
   143
                // Exceeding buffer limits, return error
hgs
parents:
diff changeset
   144
                return EFalse;
hgs
parents:
diff changeset
   145
                }
hgs
parents:
diff changeset
   146
			}
hgs
parents:
diff changeset
   147
		else // Not a '-' char
hgs
parents:
diff changeset
   148
			{
hgs
parents:
diff changeset
   149
			    if( !(tmpchar^43) ) // to increment the data if '+' is given
hgs
parents:
diff changeset
   150
			        {
hgs
parents:
diff changeset
   151
			        iData++;    
hgs
parents:
diff changeset
   152
			        }
hgs
parents:
diff changeset
   153
			
hgs
parents:
diff changeset
   154
			if( !SkipToNumEndWithoutLex(realnum) )
hgs
parents:
diff changeset
   155
				{
hgs
parents:
diff changeset
   156
				return EFalse;
hgs
parents:
diff changeset
   157
				}
hgs
parents:
diff changeset
   158
			}
hgs
parents:
diff changeset
   159
        // Save the converted number into float array 
hgs
parents:
diff changeset
   160
        // provided by caller.
hgs
parents:
diff changeset
   161
		aVal[i] = ( TFloatFixPt )(realnum);
hgs
parents:
diff changeset
   162
		}
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
	return ETrue;
hgs
parents:
diff changeset
   165
    }
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
//
hgs
parents:
diff changeset
   169
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   170
//
hgs
parents:
diff changeset
   171
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   172
TInt32 TSvgPointLexer::GetNextPoint( TChar& aCommand, TFloatFixPt& aX, TFloatFixPt& aY )
hgs
parents:
diff changeset
   173
    {
hgs
parents:
diff changeset
   174
    TReal32 realnum = 0.0;
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
    // Parse X value
hgs
parents:
diff changeset
   177
    iNegativeNumber = EFalse;
hgs
parents:
diff changeset
   178
    aCommand = SkipUntilNum();
hgs
parents:
diff changeset
   179
    if ( iLex.Eos() )
hgs
parents:
diff changeset
   180
        {
hgs
parents:
diff changeset
   181
        return -1;
hgs
parents:
diff changeset
   182
        }
hgs
parents:
diff changeset
   183
    iLex.Mark();
hgs
parents:
diff changeset
   184
    if ( SkipToNumEnd() )
hgs
parents:
diff changeset
   185
        {
hgs
parents:
diff changeset
   186
        TInt result = TLex( iLex.MarkedToken() ).Val( realnum, '.' ) ;
hgs
parents:
diff changeset
   187
		if (result != KErrNone)
hgs
parents:
diff changeset
   188
			{
hgs
parents:
diff changeset
   189
			realnum= 0.0;
hgs
parents:
diff changeset
   190
			return result;
hgs
parents:
diff changeset
   191
			}
hgs
parents:
diff changeset
   192
        }
hgs
parents:
diff changeset
   193
    else
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
        realnum = 0.0;
hgs
parents:
diff changeset
   196
        }
hgs
parents:
diff changeset
   197
    if ( iNegativeNumber )
hgs
parents:
diff changeset
   198
        realnum = -realnum;
hgs
parents:
diff changeset
   199
    aX = realnum;
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
    // Parse Y value
hgs
parents:
diff changeset
   202
    iNegativeNumber = EFalse;
hgs
parents:
diff changeset
   203
    iLex.Mark();
hgs
parents:
diff changeset
   204
    SkipUntilNum();
hgs
parents:
diff changeset
   205
    if ( iLex.Eos() )
hgs
parents:
diff changeset
   206
        {
hgs
parents:
diff changeset
   207
        return -1;
hgs
parents:
diff changeset
   208
        }
hgs
parents:
diff changeset
   209
    iLex.Mark();
hgs
parents:
diff changeset
   210
    if ( SkipToNumEnd() )
hgs
parents:
diff changeset
   211
        {
hgs
parents:
diff changeset
   212
       TInt result = TLex( iLex.MarkedToken() ).Val( realnum, '.') ;
hgs
parents:
diff changeset
   213
	   if (result != KErrNone)
hgs
parents:
diff changeset
   214
			{
hgs
parents:
diff changeset
   215
			realnum= 0.0;
hgs
parents:
diff changeset
   216
			return result;
hgs
parents:
diff changeset
   217
			}
hgs
parents:
diff changeset
   218
        }
hgs
parents:
diff changeset
   219
    else
hgs
parents:
diff changeset
   220
        {
hgs
parents:
diff changeset
   221
        realnum = 0.0;      // exponential description
hgs
parents:
diff changeset
   222
        }
hgs
parents:
diff changeset
   223
    if ( iNegativeNumber )
hgs
parents:
diff changeset
   224
        realnum = -realnum;
hgs
parents:
diff changeset
   225
    aY = realnum;
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
    return KErrNone;
hgs
parents:
diff changeset
   228
    }
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
//
hgs
parents:
diff changeset
   231
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   232
//
hgs
parents:
diff changeset
   233
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   234
TBool TSvgPointLexer::SkipToNumEnd()
hgs
parents:
diff changeset
   235
    {
hgs
parents:
diff changeset
   236
    TChar tmpchar = iLex.Peek();
hgs
parents:
diff changeset
   237
    TBool tmpbool = ETrue;
hgs
parents:
diff changeset
   238
    TBool acceptMinus = EFalse;
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
	while ( tmpchar.IsDigit() ||
hgs
parents:
diff changeset
   241
            !(tmpchar^46) ||
hgs
parents:
diff changeset
   242
            ( !(tmpchar^45) && acceptMinus ) )
hgs
parents:
diff changeset
   243
        {
hgs
parents:
diff changeset
   244
        iLex.Inc();
hgs
parents:
diff changeset
   245
        tmpchar = iLex.Peek();
hgs
parents:
diff changeset
   246
        acceptMinus = EFalse;
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
		if ( !(tmpchar^101) || !(tmpchar^69) )
hgs
parents:
diff changeset
   249
            {
hgs
parents:
diff changeset
   250
            // exponential value
hgs
parents:
diff changeset
   251
            iLex.Inc();
hgs
parents:
diff changeset
   252
            tmpchar = iLex.Peek();
hgs
parents:
diff changeset
   253
            tmpbool = EFalse;
hgs
parents:
diff changeset
   254
            acceptMinus = ETrue;
hgs
parents:
diff changeset
   255
            }
hgs
parents:
diff changeset
   256
        }
hgs
parents:
diff changeset
   257
    return tmpbool;
hgs
parents:
diff changeset
   258
    }
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
//
hgs
parents:
diff changeset
   261
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   262
// TBool TSvgPointLexer::SkipToNumEndWithoutLex(TReal32 &aNum)
hgs
parents:
diff changeset
   263
//   This function parses the number at the current position into aNum
hgs
parents:
diff changeset
   264
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   265
TBool TSvgPointLexer::SkipToNumEndWithoutLex(TReal32 &aNum)
hgs
parents:
diff changeset
   266
    {
hgs
parents:
diff changeset
   267
    TBool numberFound = EFalse;
hgs
parents:
diff changeset
   268
    TReal32 lNumber=0;
hgs
parents:
diff changeset
   269
    // Since iData is a TUint16 pointer, and we need to 
hgs
parents:
diff changeset
   270
    // operate with 8bit ASCII, mask LSB to obtain the same
hgs
parents:
diff changeset
   271
    TUint8 tmpchar = *iData & KLSBMASK;
hgs
parents:
diff changeset
   272
    TInt fractionPart=0;
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
    // Scan through the string while the character is 
hgs
parents:
diff changeset
   275
    // between '0' and '9' 
hgs
parents:
diff changeset
   276
    // or is '.'
hgs
parents:
diff changeset
   277
    // and there are more characters in the string
hgs
parents:
diff changeset
   278
    while ( (((tmpchar > 47) && (tmpchar < 58) )||
hgs
parents:
diff changeset
   279
            !(tmpchar^46)) && iData < iDataEnd )
hgs
parents:
diff changeset
   280
        {
hgs
parents:
diff changeset
   281
        // If a '.' is not found
hgs
parents:
diff changeset
   282
        if(tmpchar^46)
hgs
parents:
diff changeset
   283
            {
hgs
parents:
diff changeset
   284
            // This means that the char is between '0' and '9'
hgs
parents:
diff changeset
   285
            numberFound = ETrue;
hgs
parents:
diff changeset
   286
            // Append it to lNumber
hgs
parents:
diff changeset
   287
            lNumber = 10*lNumber + (tmpchar -'0');
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
            if(fractionPart)
hgs
parents:
diff changeset
   290
                {
hgs
parents:
diff changeset
   291
                fractionPart++;
hgs
parents:
diff changeset
   292
                }
hgs
parents:
diff changeset
   293
            }
hgs
parents:
diff changeset
   294
        else // '.' is found
hgs
parents:
diff changeset
   295
            {
hgs
parents:
diff changeset
   296
            fractionPart++;
hgs
parents:
diff changeset
   297
            }
hgs
parents:
diff changeset
   298
        
hgs
parents:
diff changeset
   299
        iData++;
hgs
parents:
diff changeset
   300
        if ( iData < iDataEnd )
hgs
parents:
diff changeset
   301
            {
hgs
parents:
diff changeset
   302
            tmpchar = *iData & KLSBMASK;
hgs
parents:
diff changeset
   303
            
hgs
parents:
diff changeset
   304
            // Check if characted is 'e' or 'E'
hgs
parents:
diff changeset
   305
            // for eg. -3.486e-007
hgs
parents:
diff changeset
   306
            // This is for floating point representation and is
hgs
parents:
diff changeset
   307
            // not supported currently. Such numbers are treated 
hgs
parents:
diff changeset
   308
            // as 0.0. 
hgs
parents:
diff changeset
   309
            // The number is skipped.
hgs
parents:
diff changeset
   310
            if ( (!(tmpchar^101) || !(tmpchar^69)) )
hgs
parents:
diff changeset
   311
                {
hgs
parents:
diff changeset
   312
                iData++;
hgs
parents:
diff changeset
   313
                if ( iData < iDataEnd )
hgs
parents:
diff changeset
   314
                    {
hgs
parents:
diff changeset
   315
                    tmpchar = *iData & KLSBMASK;                    
hgs
parents:
diff changeset
   316
                
hgs
parents:
diff changeset
   317
                    // Check if character is '-', if so 
hgs
parents:
diff changeset
   318
                    // skip it 
hgs
parents:
diff changeset
   319
                    if( !(tmpchar^45) )
hgs
parents:
diff changeset
   320
                        {
hgs
parents:
diff changeset
   321
                        iData++;
hgs
parents:
diff changeset
   322
                        if ( iData < iDataEnd )
hgs
parents:
diff changeset
   323
                            {
hgs
parents:
diff changeset
   324
                            tmpchar = *iData & KLSBMASK;
hgs
parents:
diff changeset
   325
                            }
hgs
parents:
diff changeset
   326
                        }
hgs
parents:
diff changeset
   327
                    // Skip the numbers and decimal point after 'e'
hgs
parents:
diff changeset
   328
                    while ( ( ( ( tmpchar > 47 ) && ( tmpchar < 58 ) ) ||
hgs
parents:
diff changeset
   329
                        !( tmpchar^46 ) ) && ( iData < iDataEnd ) )
hgs
parents:
diff changeset
   330
                        {
hgs
parents:
diff changeset
   331
                        iData++;
hgs
parents:
diff changeset
   332
                        if ( iData < iDataEnd )
hgs
parents:
diff changeset
   333
                            {
hgs
parents:
diff changeset
   334
                            tmpchar = *iData & KLSBMASK;
hgs
parents:
diff changeset
   335
                            }
hgs
parents:
diff changeset
   336
                        }
hgs
parents:
diff changeset
   337
                    }
hgs
parents:
diff changeset
   338
                aNum = 0.0;
hgs
parents:
diff changeset
   339
                return numberFound;
hgs
parents:
diff changeset
   340
               } // if (exponential number)  
hgs
parents:
diff changeset
   341
            } // if iData < iDataEnd
hgs
parents:
diff changeset
   342
        } // end while 
hgs
parents:
diff changeset
   343
    // Account for decimal point by performing following calculation
hgs
parents:
diff changeset
   344
    // lNumber = lNumber / ( 10^ ( fractionPart - 1 ) )
hgs
parents:
diff changeset
   345
    if(numberFound)
hgs
parents:
diff changeset
   346
        {
hgs
parents:
diff changeset
   347
        TInt l=0;
hgs
parents:
diff changeset
   348
        TInt k=1;
hgs
parents:
diff changeset
   349
        while(l<(fractionPart-1))
hgs
parents:
diff changeset
   350
            {
hgs
parents:
diff changeset
   351
            k=(k*10);
hgs
parents:
diff changeset
   352
            l++;
hgs
parents:
diff changeset
   353
            }
hgs
parents:
diff changeset
   354
        lNumber = (lNumber/k);
hgs
parents:
diff changeset
   355
        aNum = lNumber;
hgs
parents:
diff changeset
   356
        }
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
    return numberFound;
hgs
parents:
diff changeset
   359
    }
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
//
hgs
parents:
diff changeset
   365
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   366
//
hgs
parents:
diff changeset
   367
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   368
TChar TSvgPointLexer::SkipUntilNum()
hgs
parents:
diff changeset
   369
    {
hgs
parents:
diff changeset
   370
    TChar ret = '\0';
hgs
parents:
diff changeset
   371
    iLex.SkipSpace();
hgs
parents:
diff changeset
   372
    TChar tmpchar = iLex.Peek();
hgs
parents:
diff changeset
   373
    // skip until finding a digit or '.'
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
    while ( !( tmpchar.IsDigit() || tmpchar == '.' ) && !iLex.Eos() )
hgs
parents:
diff changeset
   376
        {
hgs
parents:
diff changeset
   377
        if ( tmpchar == '-' )
hgs
parents:
diff changeset
   378
            {
hgs
parents:
diff changeset
   379
            iNegativeNumber = ETrue;
hgs
parents:
diff changeset
   380
            }
hgs
parents:
diff changeset
   381
        else if ( tmpchar == 'Z' || tmpchar == 'z' )
hgs
parents:
diff changeset
   382
            {
hgs
parents:
diff changeset
   383
            // if 'Z' or 'z' was found, return imediately.
hgs
parents:
diff changeset
   384
            iLex.Inc();
hgs
parents:
diff changeset
   385
            return 'z';
hgs
parents:
diff changeset
   386
            }
hgs
parents:
diff changeset
   387
        else if ( tmpchar != ' ' && tmpchar != ',' && tmpchar != '\n' )
hgs
parents:
diff changeset
   388
            // a better way may be for only selected characters to be recognized and not ignored.
hgs
parents:
diff changeset
   389
        {
hgs
parents:
diff changeset
   390
            ret = tmpchar;
hgs
parents:
diff changeset
   391
            }
hgs
parents:
diff changeset
   392
        iLex.Inc();
hgs
parents:
diff changeset
   393
        tmpchar = iLex.Peek();
hgs
parents:
diff changeset
   394
        }
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
    return ret;
hgs
parents:
diff changeset
   397
    }
hgs
parents:
diff changeset
   398
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
//
hgs
parents:
diff changeset
   401
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   402
//
hgs
parents:
diff changeset
   403
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   404
TBool TSvgPointLexer::GetCommand(TUint8 &a)
hgs
parents:
diff changeset
   405
{
hgs
parents:
diff changeset
   406
    a = '\0';
hgs
parents:
diff changeset
   407
    TUint8 tmpchar;
hgs
parents:
diff changeset
   408
    while (iData < iDataEnd )
hgs
parents:
diff changeset
   409
        {
hgs
parents:
diff changeset
   410
        tmpchar = *iData & KLSBMASK;
hgs
parents:
diff changeset
   411
        // If character is a not between '0' and '9' and not '.' and '-'
hgs
parents:
diff changeset
   412
        if (!((tmpchar > 47) && (tmpchar < 58)) && (tmpchar^46) && (tmpchar^45) )
hgs
parents:
diff changeset
   413
             {
hgs
parents:
diff changeset
   414
             // Check if character is an alphabet
hgs
parents:
diff changeset
   415
             if((tmpchar >=65 && tmpchar <= 90) || (tmpchar >=97 && tmpchar <= 122) )
hgs
parents:
diff changeset
   416
                {
hgs
parents:
diff changeset
   417
                a = tmpchar;
hgs
parents:
diff changeset
   418
                iData++;
hgs
parents:
diff changeset
   419
                return ETrue;
hgs
parents:
diff changeset
   420
                }
hgs
parents:
diff changeset
   421
            else
hgs
parents:
diff changeset
   422
                {
hgs
parents:
diff changeset
   423
                iData++;
hgs
parents:
diff changeset
   424
                }
hgs
parents:
diff changeset
   425
             }
hgs
parents:
diff changeset
   426
         else
hgs
parents:
diff changeset
   427
             {
hgs
parents:
diff changeset
   428
             return ETrue;
hgs
parents:
diff changeset
   429
             }
hgs
parents:
diff changeset
   430
hgs
parents:
diff changeset
   431
        }
hgs
parents:
diff changeset
   432
   return EFalse;
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
}
hgs
parents:
diff changeset
   435