diff -r 000000000000 -r dfb7c4ff071f commsfwtools/commstools/utracedecoder/src/messagedefparser/integeridentifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwtools/commstools/utracedecoder/src/messagedefparser/integeridentifier.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,127 @@ +// Copyright (c) 2007-2009 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: +// + +#include +#include +#include +#include +#include + +#include "messagedefparser\integeridentifier.h" + +namespace Parser +{ + + +bool CIntegerTypeIdentifier::ValueInRange(unsigned int aSize, int aValue) + { + return false; + // TODO: This wont work - update for signed ints + // return ((((~0L) >> (32 - aSize)) & aValue) == aValue); + } + + +bool CIntegerTypeIdentifier::ValueInRange(unsigned int aSize, unsigned int aValue) + { + return ((((~0UL) >> (32 - aSize)) & aValue) == aValue); + } + + +bool CIntegerTypeIdentifier::ValueInRange(int aValue) const + { + return CIntegerTypeIdentifier::ValueInRange(iSize << 3, aValue); + } + + +bool CIntegerTypeIdentifier::ValueInRange(unsigned int aValue) const + { + return CIntegerTypeIdentifier::ValueInRange(iSize << 3, aValue); + } + + +void CIntegerTypeIdentifier::Describe(const unsigned char* aData, unsigned int aLength, const void* aOptions, std::ostream& aOutput) const + { +#ifdef _DEBUG + assert (aLength == iSize); +#endif + + const TIntegerIdentifierOptions* options = reinterpret_cast(aOptions); + + if (!options || options->iFormatAsHex) + { + if (iSize == 1) + { + aOutput << "0x" << std::noshowbase << std::setw(2) + << std::setfill('0') << std::nouppercase << std::hex + << (0xff & *reinterpret_cast(aData)); + } + else if (iSize == 2) + { + aOutput << "0x" << std::noshowbase << std::setw(4) + << std::setfill('0') << std::nouppercase << std::hex + << (0xffff & *reinterpret_cast(aData)); + } + else if (iSize == 4) + { + aOutput << "0x" << std::noshowbase << std::setw(8) + << std::setfill('0') << std::nouppercase << std::hex + << *reinterpret_cast(aData); + } + } + else if (iSigned) + { + // Signed and format as decimal + int v; + if (iSize == 1) + { + char n = (char)(*aData); + v = n; + } + else if (iSize == 2) + { + short int n = *reinterpret_cast(aData); + v = n; + } + else if (iSize == 4) + { + v = *reinterpret_cast(aData); + } + aOutput << std::noshowbase << std::dec << v; + } + else + { + // Unsigned and format as decimal + unsigned int v; + if (iSize == 1) + { + unsigned char n = (unsigned char)(*aData); + v = n; + } + else if (iSize == 2) + { + unsigned short int n = *reinterpret_cast(aData); + v = n; + } + else if (iSize == 4) + { + v = *reinterpret_cast(aData); + } + aOutput << std::noshowbase << std::dec << v; + } + } + + +} // namespace Parser +