fix: stop using "magic" numbers in string operations for the copyannofile2log feature
fix: When using the copylogfromannofile workaround, extract the build ID and build duration and add to the log as these are useful for analysis. The log should now be identical to the stdout file.
fix: Remove extra blank lines from output in copylogfromannofile mode.
/*
* 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 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:
* Hash class for imgcheck tool. All the executable names of ROM/ROFS
* are stored into this hash table. After gathering the dependencies
* for those executables, dependencies existence is checked very
* efficiently using this table.
*
*/
/**
@file
@internalComponent
@released
*/
#include "common.h"
#include "hash.h"
/**
Constructor, intializes the table size
@internalComponent
@released
@param aSize - Hash table size (Number of dissimilar data can stored)
*/
HashTable::HashTable(int aSize)
:iSize(aSize)
{
}
/**
Destructor
@internalComponent
@released
*/
HashTable::~HashTable()
{
}
/**
Function responsible to return the Hash value for the received string.
@internalComponent
@released
@param aString - String on which Hash value calcualtion to be done
*/
int HashTable::Hash(String aString)
{
unsigned int hashVal = 0;
int length = aString.length();
/* we start our hash out at 0 */
/* for each character, we multiply the old hash by 31 and add the current
* character. Remember that shifting a number left is equivalent to
* multiplying it by 2 raised to the number of places shifted. So we
* are in effect multiplying hashval by 32 and then subtracting hashval.
* Why do we do this? Because shifting and subtraction are much more
* efficient operations than multiplication.
*/
for(int strIter = 0; strIter < length ; strIter++)
{
hashVal = aString[strIter] + (hashVal << 5) - hashVal;
}
/* we then return the hash value mod the hashtable size so that it will
* fit into the necessary range
*/
return hashVal % iSize;
}
/**
Function returns ture or false based on the String availability in Hash
@internalComponent
@released
@param aString - String which needs to be searched
*/
bool HashTable::IsAvailable(String aString)
{
unsigned int hashVal = Hash(aString);
if (iTable[hashVal].size() > 0)
{
StringList nameList = iTable[hashVal];
StringList::iterator listIter = nameList.begin();
while(listIter != nameList.end())
{
if ((*listIter) == aString)
{
return true;
}
++listIter;
}
}
return false;
}
/**
Function responsible to insert a single string into Hash table
@internalComponent
@released
@param aString - String which needs to be inserted
*/
void HashTable::Insert(String aString)
{
unsigned int hashVal = Hash(aString);
if(!IsAvailable(aString)) //Is exists
{
iTable[hashVal].push_back(aString);
}
}
/**
Function responsible to insert list of strings into Hash table
@internalComponent
@released
@param aString - String which needs to be inserted
*/
void HashTable::InsertStringList(StringList& aList)
{
StringList::iterator beginIter = aList.begin();
StringList::iterator endIter = aList.end();
while(beginIter != endIter)
{
Insert((*beginIter));
++beginIter;
}
}
/**
Function to delete an entry from Hash
@internalComponent
@released
@param aString - String which needs to be deleted
*/
void HashTable::Delete(String aString)
{
unsigned int hashVal = Hash(aString);
if(iTable[hashVal].size() > 0)
{
StringList list = iTable[hashVal];
StringList::iterator beginIter = list.begin();
StringList::iterator endIter = list.end();
while(beginIter != endIter)
{
if((*beginIter) == aString)
{
list.erase(beginIter);
iTable[hashVal] = list;
return;
}
++beginIter;
}
}
}