diff -r 000000000000 -r 7f656887cf89 libraries/ltkutils/src/hexdump.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/ltkutils/src/hexdump.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,115 @@ +// hexdump.cpp +// +// Copyright (c) 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// +#include +#include +#include +#include + +static const TInt KLineSize = 16; +// 00000000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ................ +// So line len is 8 + 3 + (3 * lineSize) + 1 + 1 + lineSize + 2 +static const TInt KTotalLen = 8 + 3 + (3 * KLineSize) + 1 + 1 + KLineSize + 2; + +void HexDumpLine(const TDesC8& aBuf, TDes& lineBuf, TInt aOffset) + { + TBuf ascii; + lineBuf.NumFixedWidthUC(aOffset, EHex, 8); + _LIT(KColon, ": "); + lineBuf.Append(KColon); + for (TInt i = 0; i < KLineSize; i++) + { + if (i < aBuf.Length()) + { + TUint8 ch = aBuf[i]; + lineBuf.AppendNumFixedWidthUC(ch, EHex, 2); + lineBuf.Append(' '); + if (ch < 32 || ch >= 128) ch = '.'; + ascii.Append(ch); + } + else + { + _LIT(KFiller, " "); + lineBuf.Append(KFiller); + } + if (i == 7) lineBuf.Append(' '); // The space between the two groups of 8 + } + lineBuf.Append(' '); + lineBuf.Append(ascii); + lineBuf.Append('\r'); + lineBuf.Append('\n'); + } + +EXPORT_C HBufC* LtkUtils::HexDumpL(const TDesC8& aBuf) + { + TInt numLines = (aBuf.Length() + KLineSize-1) / KLineSize; + HBufC* result = HBufC::NewLC(numLines * KTotalLen); + TPtr resultPtr = result->Des(); + for (TInt i = 0; i < aBuf.Length(); i += KLineSize) + { + TPtrC8 line = aBuf.Mid(i, Min(KLineSize, aBuf.Length()-i)); + TPtr wptr((TUint16*)resultPtr.Ptr() + resultPtr.Length(), KTotalLen); + HexDumpLine(line, wptr, i); + resultPtr.SetLength(resultPtr.Length() + wptr.Length()); // MidTPtr doesn't update length of original + } + CleanupStack::Pop(result); + return result; + } + +EXPORT_C void LtkUtils::HexDumpToOutput(const TDesC8& aBuf, RIoWriteHandle& aHandle) + { + TInt offset = 0; + LtkUtils::HexDumpToOutput(aBuf, aHandle, offset); + } + +EXPORT_C void LtkUtils::HexDumpToOutput(const TDesC8& aBuf, RIoWriteHandle& aHandle, TInt& aOffset) + { + TBuf lineBuf; + const TInt len = aBuf.Length(); + for (TInt i = 0; i < len; i += KLineSize) + { + TPtrC8 line = aBuf.Mid(i, Min(KLineSize, len-i)); + HexDumpLine(line, lineBuf, aOffset+i); + aHandle.Write(lineBuf); + } + aOffset += len; + } + +EXPORT_C void LtkUtils::HexDumpToRDebug(const TDesC8& aBuf) + { + TInt offset = 0; + HexDumpToRDebug(aBuf, offset); + } + +EXPORT_C void LtkUtils::HexDumpToRDebug(const TDesC8& aBuf, TInt& aOffset) + { + TBuf lineBuf; + const TInt len = aBuf.Length(); + for (TInt i = 0; i < len; i += KLineSize) + { + TPtrC8 line = aBuf.Mid(i, Min(KLineSize, len-i)); + HexDumpLine(line, lineBuf, aOffset+i); + RDebug::RawPrint(lineBuf); + } + aOffset += len; + } + +EXPORT_C void LtkUtils::RawPrint(const TDesC8 &aDes) + { + TPtrC8 rem(aDes); + TBuf<256> buf; + while (rem.Length()) + { + buf.Copy(rem.Left(256)); + RDebug::RawPrint(buf); + rem.Set(rem.Mid(buf.Length())); + } + }