e32tools/elf2e32/source/h_utl.cpp
changeset 0 044383f39525
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/elf2e32/source/h_utl.cpp	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,260 @@
+// Copyright (c) 2005-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:
+// Implementation of the e32 image version for e32 image dump for the elf2e32 tool
+// @internalComponent
+// @released
+// 
+//
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "h_utl.h"
+
+/**
+Function to check bracketed hex i.e '{', '}'
+
+@internalComponent
+@released
+
+@param aTemp
+@param aBrackets
+@param aDigits
+@param aValue
+
+@return True if the value passed in is a bracketed hex.
+*/
+TBool IsBracketedHex(const char* aTemp, const char* aBrackets, TInt aDigits, TUint32& aValue)
+{
+	if (aTemp[0]!=aBrackets[0] || aTemp[1+aDigits]!=aBrackets[1])
+		return 0;
+	TInt i;
+	TUint32 x = 0;
+	for (i=1; i<=aDigits; ++i)
+	{
+		TInt c = aTemp[i];
+		if (c>='a' && c<='z') c-=32;
+		if (c<'0' || (c>'9' && c<'A') || c>'F')
+			return 0;
+		c-='0';
+		if (c>9)
+			c-=7;
+		x = (x<<4) | (TUint32)c;
+	}
+	aValue = x;
+	
+	return 1;
+}
+
+/**
+Function to check the decimal version
+
+@internalComponent
+@released
+
+@param aBegin
+Beginning of the version information
+@param aTemp
+@param aValue
+Holds the hexadecimal value
+@return the checked value.
+*/
+TInt CheckForDecimalVersion(const char* aBegin, const char* aTemp, TUint32& aValue)
+{
+	aValue = 0;
+	if (aTemp <= aBegin || *aTemp != '}')
+		return 0;
+	TUint32 v[2] = {0,0};
+	TUint32 m = 1;
+	TInt pos = 0;
+	const char* s0 = aTemp + 1;
+	for (--aTemp; aTemp >= aBegin; --aTemp)
+	{
+		int c = *aTemp;
+		if (c >= '0' && c <= '9')
+		{
+			v[pos] += m * (c - '0');
+			if (v[pos] >= 65536u)
+				return 0;
+			m *= 10;
+		}
+		else if (c == '.')
+		{
+			m = 1;
+			if (++pos >= 2)
+				return 0;
+		}
+		else if (c == '{')
+			break;
+		else
+			return 0;
+	}
+	if (aTemp < aBegin)
+		return 0;
+	
+	aValue = (v[1] << 16) | v[0];
+	
+	return s0 - aTemp;
+}
+
+/**
+Function to Parse a filename and convert decimal version number to hex
+
+@internalComponent
+@released
+
+@param aName
+Filename to be parsed
+
+@return the converted name wherein the decimal number is converted to hex.
+*/
+char* NormaliseFileName(const char* aName)
+{
+	TFileNameInfo f(aName, 0);
+	TInt nl = f.iBaseLength;
+	TInt el = f.iTotalLength - f.iExtPos;
+	TInt tl = nl + el;
+	if (f.iFlags & EVerPresent)
+		tl += 10;
+	char* t = new char[tl + 1];
+	if (t)
+	{
+		memcpy(t, aName, nl);
+		if (f.iFlags & EVerPresent)
+			sprintf(t + nl, "{%08x}%s", (TInt)f.iModuleVersion, aName + f.iExtPos);
+		else if (el)
+			memcpy(t + nl, aName + f.iExtPos, el);
+		t[tl] = 0;
+	}
+	
+	return t;
+}
+
+/**
+Constructor for Class TFileNameInfo
+
+@internalComponent
+@released
+
+@param aFileName
+Filename to be parsed
+@param aLookForUid
+*/
+TFileNameInfo::TFileNameInfo(const char* aFileName, TBool aLookForUid)
+{
+	iFileName = aFileName;
+	TInt l = strlen(aFileName);
+	iTotalLength = l;
+	TInt remain = l;
+	iFlags = 0;
+	iUid3 = 0;
+	iModuleVersion = 0;
+	iBaseLength = l;
+	iExtPos = l;
+	const char* s = iFileName + l;
+	for (; s>=iFileName && *s!='.' && *s!='}' && (!aLookForUid || *s!=']'); --s)
+	{
+	}
+	
+	if (s<iFileName)
+		return;
+	if (*s == '.')
+	{
+		iExtPos = s - iFileName;
+		if (iExtPos == 0)
+		{
+			iBaseLength = 0;
+			return;
+		}
+		remain = iExtPos;
+		--s;
+	}
+	else if (s != iFileName + l)
+		return;
+	
+	if (aLookForUid && remain>=10 && IsBracketedHex(s-9, "[]", 8, iUid3))
+	{
+		iFlags |= EUidPresent;
+		remain -= 10;
+		s -= 10;
+	}
+	
+	if (remain>=10 && IsBracketedHex(s-9, "{}", 8, iModuleVersion))
+	{
+		iFlags |= EVerPresent;
+		remain -= 10;
+		s -= 10;
+	}
+	else
+	{
+		TInt n = CheckForDecimalVersion(iFileName, s, iModuleVersion);
+		if (n>0)
+		{
+			iFlags |= EVerPresent;
+			remain -= n;
+			s -= n;
+		}
+	}
+	iBaseLength = remain;
+}
+
+/*-------------------------------------------------------------------------
+String comparison on Linux seems to be a little half-baked.
+-------------------------------------------------------------------------*/
+#ifdef __LINUX__
+
+int stricmp(const char *a, const char *b)
+	{
+	unsigned char ca,cb;
+
+	do {
+		ca = *a++;
+		cb = *b++;
+		ca = tolower(ca);
+		cb = tolower(cb);
+	}
+	while((ca == cb) && (ca));
+	return (int) ca-cb;
+	}
+
+int strnicmp(const char *a, const char *b, int n)
+	{
+	unsigned char ca,cb;
+	int i = 0;
+
+	do {
+		if (++i > n) return 0;
+		ca = *a++;
+		cb = *b++;
+		ca = tolower(ca);
+		cb = tolower(cb);
+	}
+	while((ca == cb) && (ca));
+	return (int) ca-cb;
+	}
+
+char* strupr(char *a)
+	{
+		char *ret = a;
+
+		while (*a)
+			{
+			*a = toupper(*a);
+			a++;
+			}
+
+		return ret;
+	}
+
+
+#endif