logsui/tsrc/logdbmodifier/addeventtest/src/argstest.cpp
changeset 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/tsrc/logdbmodifier/addeventtest/src/argstest.cpp	Fri Mar 19 09:27:18 2010 +0200
@@ -0,0 +1,400 @@
+/*
+* Copyright (c) 2002 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:  Argument parser
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "argstest.h"
+
+// EXTERNAL DATA STRUCTURES
+// none
+
+// EXTERNAL FUNCTION PROTOTYPES  
+// none
+
+// CONSTANTS
+// none
+
+// MACROS
+// none
+
+// LOCAL CONSTANTS AND MACROS
+// none
+
+// MODULE DATA STRUCTURES
+// none
+
+// LOCAL FUNCTION PROTOTYPES
+// none
+
+// FORWARD DECLARATIONS
+// none
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// none
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+//  CArgs::CArgs
+//  C++ default constructor can NOT contain any code, that
+//  might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CArgs::CArgs() 
+    {
+    }
+
+// Destructor
+EXPORT_C CArgs::~CArgs()
+    {
+
+    ClearArgs();
+
+    }
+
+// -----------------------------------------------------------------------------
+//  CArgs::ArgCount
+//  Returns count of parsed arguments
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CArgs::ArgCount() const
+    {
+
+    return iArgCount;
+
+    }
+
+// -----------------------------------------------------------------------------
+//  CArgs::ArgType
+//  Returns type of argument (string/numeric)
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TArgType CArgs::ArgType( const TInt aArgIndex ) const
+    {
+
+    if ( aArgIndex < 1 || aArgIndex > iArgCount )
+        {
+        return EArgNotSpecified;
+        }
+    else
+        {
+        return iArgType[aArgIndex - 1];
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+//  CArgs::NumArg
+//  Returns argument value as TInt
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CArgs::NumArg( const TInt aArgIndex ) const
+    {
+
+    if ( aArgIndex < 1 ||
+         aArgIndex > iArgCount ||
+         iArgType[aArgIndex - 1] != EArgNum )
+        {
+        return 0;
+        }
+    else
+        {
+        return iNumArg[aArgIndex - 1];
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+//  CArgs::StrArg
+//  Returns argument value as string
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CArgs::StrArg( const TInt aArgIndex ) const
+    {
+
+    if ( aArgIndex < 1 || aArgIndex > iArgCount )
+        {
+        return KNullDesC;
+        }
+    else
+        {
+        return *iStrArg[aArgIndex - 1];
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+//  CArgs::ParseLineL
+//  Parses arguments from a string
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CArgs::ParseLineL(
+    const TParseType aType,
+    const TDes& aLine )
+    {
+
+    TBuf<1024> line;
+    line.Append( aLine );
+
+    ClearArgs();
+    
+    switch ( aType )
+        {
+        case EParseComment:
+
+            line.Trim();
+
+            // if line starts with "//"
+            //
+            if ( line.Length() >= 2 &&
+                 line[0] == static_cast< TInt >( TChar( '/' ) ) &&
+                 line[1] == static_cast< TInt >( TChar( '/' ) ) )
+                {
+                return KErrNone;
+                }
+            break;
+
+        case EParseFunction:
+
+            TInt posDot = line.Locate( '.' );
+            posDot = -1; // Messes stuff in case of ip addresses
+            TInt posBraceOpen = line.Locate( '(' );
+
+            if ( posBraceOpen == -1 )
+                {
+                return KErrArgument;
+                }
+
+            iArgType[0] = EArgStr;
+            iArgType[1] = EArgStr;
+
+            // read classname and methodname: "class.method("
+            //
+            if ( posDot != -1 && posDot < posBraceOpen )
+                {
+                iStrArg[0] = HBufC::NewL( posDot );
+                iStrArg[0]->Des().Append( line.Ptr(), posDot );
+                iStrArg[0]->Des().Trim();
+                iStrArg[1] = HBufC::NewL( posBraceOpen - posDot );
+                iStrArg[1]->Des().Append( line.Ptr() + posDot + 1,
+                                          posBraceOpen - ( posDot + 1 ) );
+                iStrArg[1]->Des().Trim();
+                }
+            else // only methodname: "method("
+                {
+                iStrArg[0] = HBufC::NewL( 0 );
+                iStrArg[1] = HBufC::NewL( posBraceOpen );
+                iStrArg[1]->Des().Append( line.Ptr(), posBraceOpen );
+                iStrArg[1]->Des().Trim();
+                }
+
+            iArgCount = 2;
+
+            // remove "class.method(" or "method(" from line
+            //
+            line.Delete( 0, posBraceOpen + 1 );
+            line.Trim();
+
+            // parse arguments
+            //
+            while ( line.Length() > 0 )
+                {
+                line.Trim();
+                TInt pos = line.Locate( '"' );
+
+                // string
+                //
+                if ( pos == 0 )
+                    {
+                    line.Delete( 0, 1 );
+                    pos = line.Locate( '"' );
+                    if ( pos == -1 )
+                        {
+                        return KErrArgument;
+                        }
+
+                    iArgType[iArgCount] = EArgStr;
+                    iStrArg[iArgCount] = HBufC::NewL( pos );
+                    iStrArg[iArgCount]->Des().Append( line.Ptr(), pos );
+                    iArgCount++;
+                    line.Delete( 0, pos + 1 );
+                    line.Trim();
+
+                    // remove possible comma
+                    //
+                    if ( line.Locate( ',' ) == 0 )
+                        {
+                        line.Delete( 0, 1 );
+                        line.Trim();
+                        }
+                    }
+
+                else // numeric? or enum value
+                    {
+                    pos = line.Locate( ',' );
+                    if ( pos == -1 )
+                        {
+                        pos = line.Locate( ')' );
+                        if ( pos == -1 )
+                            {
+                            return KErrArgument;
+                            }
+                        else if ( pos == 0 )
+                            {
+                            break;
+                            }
+                        }
+
+                    iArgType[iArgCount] = EArgStr;
+                    iStrArg[iArgCount] = HBufC::NewL( pos );
+                    iStrArg[iArgCount]->Des().Append( line.Ptr(), pos );
+                    iStrArg[iArgCount]->Des().Trim();
+                    iArgCount++;
+                    line.Delete( 0, pos + 1 );
+                    line.Trim();
+
+                    // len must be > 0
+                    //
+                    if ( iStrArg[iArgCount-1]->Length() == 0 )
+                        {
+                        return KErrArgument;
+                        }
+
+                    TBool isNum = ETrue;
+                    TBool isNegative = EFalse;
+                    TInt numVal = 0;
+
+                    // check if argument is numeric -> [-]n(0-9)
+                    //
+                    for ( pos=0; pos < iStrArg[iArgCount - 1]->Length(); pos++ )
+                        {
+                        if ( pos == 0 &&
+                             iStrArg[iArgCount - 1]->Locate( '-' ) == 0 )
+                            {
+                            isNegative = ETrue;
+                            // if number is negative, len must be >= 2
+                            //
+                            if ( iStrArg[iArgCount - 1]->Length() < 2 )
+                                {
+                                isNum = EFalse;
+                                break;
+                                }
+                            }
+                        else
+                            {
+                            TInt number;
+
+                            if      ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '0' ) ) ) number = 0;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '1' ) ) ) number = 1;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '2' ) ) ) number = 2;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '3' ) ) ) number = 3;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '4' ) ) ) number = 4;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '5' ) ) ) number = 5;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '6' ) ) ) number = 6;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '7' ) ) ) number = 7;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '8' ) ) ) number = 8;
+                            else if ( (*iStrArg[iArgCount - 1])[pos] ==
+                               static_cast< TInt >( TChar( '9' ) ) ) number = 9;
+                            else
+                                {
+                                isNum = EFalse;
+                                break;
+                                }
+                            numVal = (numVal * 10) + number;
+                            }
+                        }
+                
+                    // argument is numeric
+                    //
+                    if ( isNum )
+                        {
+                        if ( isNegative )
+                            {
+                            numVal = -numVal;
+                            }
+
+                        iNumArg[iArgCount - 1] = numVal;
+                        iArgType[iArgCount - 1] = EArgNum;
+                        } 
+
+                    } // else
+
+                } // while
+
+            return KErrNone;
+
+        } // switch
+
+    return KErrArgument;
+
+    }
+
+// -----------------------------------------------------------------------------
+//  CArgs::ClearArgs
+//  Clears all parsed arguments and frees allocated memory
+// -----------------------------------------------------------------------------
+//
+void CArgs::ClearArgs()
+    {
+
+    for ( TInt i = 0; i < iArgCount; i++ )
+        {
+        delete iStrArg[i];
+        }
+
+    iArgCount = 0;
+
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+#if defined(__WINS__) && !defined(EKA2)
+
+// -----------------------------------------------------------------------------
+// E32Dll 
+// 
+// DLL entry point function. In a MARM implementation, the 
+// entry point is called when a thread is attached to or detached from the 
+// DLL.?description
+//
+// Returns: TInt:   For DLLs which do not set up thread-local storage, 
+//                  the function can ignore the TDllReason type 
+//                  parameter passed to it and simply return KErrNone;
+// -----------------------------------------------------------------------------
+//
+
+GLDEF_C TInt E32Dll( TDllReason /*aReason*/ )
+    {
+
+    return KErrNone;
+    
+    }
+    
+#endif
+
+//  End of File