diff -r e686773b3f54 -r 0ba2181d7c28 logsui/tsrc/logdbmodifier/addeventtest/src/argstest.cpp --- /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