kerneltest/e32utils/analyse/ProcessCfg.cpp
changeset 9 96e5fb8b040d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32utils/analyse/ProcessCfg.cpp	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 <windows.h>
+#include "analyse.h"
+#include "nonxip.h"
+
+
+extern NonXIP gNonXIP;
+
+const char* COMMON_SECT="Common";
+const char* PROFILE_SECT="Profile";
+const char* PARTITION_SECT="Partition";
+const char* FORMAT_SECT="Format";
+const char* NON_XIP_SECT="NonXIP";
+
+std::string Analyse::iRomFile;
+std::string Analyse::iThread;
+std::string Analyse::iDll;
+std::string Analyse::iFunction;
+std::vector<std::string> Analyse::iTraces;
+
+int Analyse::ProcessCfgFile(const char* aCfgFileName)
+	{
+	char buf[1024];
+	char path[MAX_PATH];
+	if (aCfgFileName[0] != '\\' || aCfgFileName[1] != ':')
+		{
+		char ** file_name = 0;
+		if (!GetFullPathNameA(aCfgFileName, sizeof path, path, file_name))
+			return ENoCfgFile;
+		aCfgFileName = path;
+		}
+
+	if (GetFileAttributesA(aCfgFileName) == 0xffffffff) // no ini file
+		return ENoCfgFile;
+	int rc = GetPrivateProfileStringA(COMMON_SECT, "TraceFile", "", buf, sizeof buf, aCfgFileName);
+	if (rc)
+		{
+		iTraces.push_back(buf);
+		sTraces.push_back(iTraces[iTraces.size()-1].c_str());
+		}
+
+	GetPrivateProfileStringA(COMMON_SECT, "Mode", "profile", buf, sizeof buf, aCfgFileName);
+	switch(buf[0])
+		{
+	case 'l': case 'L':
+		sAction = ETrace;
+		break;
+	case 'p': case 'P':
+		sAction = EProfile;
+		break;
+	case 'a': case 'A':
+		sAction = EActivity;
+		break;
+	default:
+		return EErrorCfgFile;
+		}
+
+	rc = GetPrivateProfileStringA(COMMON_SECT, "SymbolFile", "", buf, sizeof buf, aCfgFileName);
+	if (rc) 
+		{
+		iRomFile = buf;
+		sRomFile = iRomFile.c_str();
+		}
+
+	rc = GetPrivateProfileStringA(COMMON_SECT, "Range", "", buf, sizeof buf, aCfgFileName);
+	if (rc) 
+		{
+		sOptions |= ERange;
+		bool plus = false;
+		char * p = strrchr(buf, '+');
+		if (p)
+			plus = true;
+		else
+			p = strrchr(buf, '-');
+		if (!p) return EErrorCfgFile;
+		*p = '\0';
+		sBeginSample = atoi(buf);
+		sEndSample = atoi(++p);
+		if (plus) 
+			sEndSample = sEndSample += sBeginSample;
+		}
+
+	rc = GetPrivateProfileIntA(COMMON_SECT, "IncludeNullThread", 0, aCfgFileName);
+	if (rc) 
+		sOptions|=ENull;
+	
+	rc = GetPrivateProfileStringA(COMMON_SECT, "Cutoff", "", buf, sizeof buf, aCfgFileName);
+	if (rc) 
+		sCutOff = atof(buf);
+
+
+	rc = GetPrivateProfileStringA(PROFILE_SECT, "Thread", "", buf, sizeof buf, aCfgFileName);
+	if (rc) 
+		{
+		iThread = buf;
+		sThread = iThread.c_str();
+		}
+
+	rc = GetPrivateProfileStringA(PROFILE_SECT, "Dll", "", buf, sizeof buf, aCfgFileName);
+	if (rc) 
+		{
+		iDll = buf;
+		sDll = iDll.c_str();
+		}
+
+	rc = GetPrivateProfileStringA(PROFILE_SECT, "Function", "", buf, sizeof buf, aCfgFileName);
+	if (rc) 
+		{
+		iFunction = buf;
+		sFunction = iFunction.c_str();
+		}
+
+	rc = GetPrivateProfileStringA(PROFILE_SECT, "Range", "", buf, sizeof buf, aCfgFileName);
+	if (rc) 
+		{
+		sOptions |= EAddress;
+		bool plus = false;
+		char * p = strrchr(buf, '+');
+		if (p)
+			plus = true;
+		else
+			p = strrchr(buf, '-');
+		if (!p) return EErrorCfgFile;
+		*p = '\0';
+		sBase = strtoul(buf,0,16);
+		sLim = strtoul(++p,0,16);
+		if (plus) 
+			sLim = sLim += sBase;
+		}
+	
+
+	rc = GetPrivateProfileStringA(PARTITION_SECT, "Mode", "", buf, sizeof buf, aCfgFileName);
+	if (rc)
+		{
+		switch(buf[0])
+			{
+		case 'd': case 'D':
+			sPartition = EDll;
+			break;
+		case 'f': case 'F':
+			sPartition = EFunction;
+			break;
+		default:
+			return EErrorCfgFile;
+			}
+		}
+
+	rc = GetPrivateProfileIntA(PARTITION_SECT, "BucketSize", 0, aCfgFileName);
+	if (rc)
+		{
+		sPartition = ESize;
+		sBucketSize = rc;
+		}
+
+	rc = GetPrivateProfileIntA(PARTITION_SECT, "NumberOfBuckets", 0, aCfgFileName);
+	if (rc)
+		{
+		sPartition = EBuckets;
+		sBuckets = rc;
+		}
+
+
+
+	rc = GetPrivateProfileStringA(FORMAT_SECT, "Mode", "", buf, sizeof buf, aCfgFileName);
+	if (rc)
+		{
+		switch(buf[0])
+			{
+		case 'p': case 'P':
+			sFormat = EPercent;
+			break;
+		case 's': case 'S':
+			sFormat = ESamples;
+			break;
+		case 'e': case 'E':
+			sFormat = EExcel;
+			break;
+		default:
+			return EErrorCfgFile;
+			}
+		}
+
+	rc = GetPrivateProfileIntA(FORMAT_SECT, "ZeroValues", 0, aCfgFileName);
+	if (rc)
+		sOptions |= EZeros;
+
+	rc = GetPrivateProfileIntA(FORMAT_SECT, "NoOthers", 0, aCfgFileName);
+	if (rc)
+		sOptions |= ENoOther;
+
+	rc = GetPrivateProfileIntA(FORMAT_SECT, "TotalOnly", 0, aCfgFileName);
+	if (rc)
+		sOptions |= ETotalOnly;
+
+
+	char key[256];
+	for(int i=1;sprintf(key,"ObyFile%d",i),
+		GetPrivateProfileStringA(NON_XIP_SECT, key, "", buf, sizeof buf, aCfgFileName);i++)
+		gNonXIP.AddObyFile(buf);
+
+	for(i=1;sprintf(key,"RofsSymbolFile%d",i),
+		GetPrivateProfileStringA(NON_XIP_SECT, key, "", buf, sizeof buf, aCfgFileName);i++)
+		gNonXIP.AddSymbolFile(buf);
+
+	return EOk;
+	}
+