diff -r 000000000000 -r 638b9c697799 apicompatanamdw/compatanalysercmd/headeranalyser/src/Utils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/apicompatanamdw/compatanalysercmd/headeranalyser/src/Utils.cpp Tue Jan 12 14:52:39 2010 +0530 @@ -0,0 +1,692 @@ +/* +* Copyright (c) 2006-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 "CmdGlobals.h" +#ifdef __WIN__ +#pragma warning(disable:4786) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "HAException.h" +#include "BBCFileUtils.h" +#include "XMLUtils.h" + +using namespace std; + +// ---------------------------------------------------------------------------- +// itoa +// Convert integer to string +// ---------------------------------------------------------------------------- +// +string itoa(int value, string& str, int radix) +{ + ostringstream ostr; + ostr << value; + str = ostr.str(); + return str; +} + +// ---------------------------------------------------------------------------- +// ltoa +// Convert long integer to string +// ---------------------------------------------------------------------------- +// +string ltoa(long value, string& str, int radix) +{ + ostringstream ostr; + ostr << value; + str = ostr.str(); + return str; +} + + +// ---------------------------------------------------------------------------- +// FindFromList +// Find value from list +// ---------------------------------------------------------------------------- +// +list::iterator FindFromList(const string& aValue, list& aList, bool(*comparator)(const string&, const string&, bool), bool comparatorparam) +{ + list::iterator begin = aList.begin(); + list::iterator end = aList.end(); + bool found = false; + while(begin != end && found == false) + { + if (comparator != 0 && (*comparator)(*begin, aValue, comparatorparam)) + { + found = true; + } else if (comparator == 0 && *begin == aValue) + { + found = true; + } + else + { + begin++; + } + } + + return begin; +} + +// ---------------------------------------------------------------------------- +// FindFromList +// Find value from list +// ---------------------------------------------------------------------------- +// +list >::iterator FindFromList(const string& aValue, list >& aList, bool(*comparator)(const string&, const string&, bool), bool comparatorparam) +{ + list >::iterator begin = aList.begin(); + list >::iterator end = aList.end(); + bool found = false; + while(begin != end && found == false) + { + if (comparator != 0 && (*comparator)(begin->first, aValue, comparatorparam)) + { + found = true; + } else if (comparator == 0 && begin->first == aValue) + { + found = true; + } + else + { + begin++; + } + } + + return begin; +} +// ---------------------------------------------------------------------------- +// FindFromList +// Find value from list +// +// ---------------------------------------------------------------------------- +// +list >::iterator FindFromList(const string& aValue, list >& aList, TValue compareTo, bool(*comparator)(const pair&, const string&, bool), bool comparatorparam,bool comparewholeString) +{ + list >::iterator begin = aList.begin(); + list >::iterator begin1 = aList.begin(); + list >::iterator end = aList.end(); + + bool found = false; + while(comparewholeString == true && begin1 != end && found == false) + {// First check both the file matches or not + if(aValue.compare(begin1->second)== 0 ) + found = true; + // Now compare base file with current file after sperating sub dirs of currrent file each time + else if(compareWholeFileStrings(aValue,begin1->second) == true ) + found = true; + else + begin1++; + + if(found == true) + return begin1; + } + while(begin != end && found == false) + { + if (comparator != 0 && (*comparator)(*begin, aValue, comparatorparam)) + { + found = true; + } else if (comparator == 0 && compareTo == ELeftValue && begin->first == aValue) + { + found = true; + } else if (comparator == 0 && compareTo == ERightValue && begin->second == aValue) + { + found = true; + } + else + { + begin++; + } + } + + return begin; +} + +// ---------------------------------------------------------------------------- +// FindFromList +// Find value from list +// +// ---------------------------------------------------------------------------- +// +list,string> >::iterator FindFromList(const string& aValue, list,string> >& aList, TValue compareTo, bool(*comparator)(const pair&, const string&, bool), bool comparatorparam,bool comparewholeString) +{ + list,string> >::iterator begin = aList.begin(); + list,string> >::iterator begin1 = aList.begin(); + list,string> >::iterator end = aList.end(); + + bool found = false; + while(comparewholeString == true && begin1 != end && found == false) + {// First check both the file matches or not + if(aValue.compare(begin1->first.second)== 0 ) + found = true; + // Now compare base file with current file after sperating sub dirs of currrent file each time + else if(compareWholeFileStrings(aValue,begin1->first.second) == true ) + found = true; + else + begin1++; + + if(found == true) + return begin1; + } + while(begin != end && found == false) + { + if (comparator != 0 && (*comparator)(begin->first, aValue, comparatorparam)) + { + found = true; + } else if (comparator == 0 && compareTo == ELeftValue && begin->first.first == aValue) + { + found = true; + } else if (comparator == 0 && compareTo == ERightValue && begin->first.second == aValue) + { + found = true; + } + else + { + begin++; + } + } + + return begin; +} + +// ---------------------------------------------------------------------------- +// trimWhiteSpace +// Remove any white space from given string +// startpos and endpos are optional parameters, defining the string under consideration +// returns a NULL, if the input is empty or contains only '\t' or '\n' or ' ' +// ---------------------------------------------------------------------------- +// +string trimWhiteSpace(string& aString, string::size_type aStartpos, string::size_type aEndpos) +{ + string ret = aString.substr( aStartpos, aEndpos); + + string::size_type startpos = ret.find_first_not_of(" \t\n\r",aStartpos); + string::size_type endpos = ret.find_last_not_of(" \t\n\r"); + + //if the string is empty, either NULL or only newline character, return a NULL string + if( string::npos == startpos || KEmpty == ret) + return ""; + //else return the substr without whitespace at start and end of given string + else + return ret.substr( startpos, endpos - startpos + 1); +} + + +// ---------------------------------------------------------------------------- +// printToString +// Substitute for printf +// ---------------------------------------------------------------------------- +// +#if 0 +string printToString(string& aControlString, list params) +{ + istringstream input(aControlString); + ostringstream output; + string ret; + char ch; + list::iterator paramlist = params.begin(); + list::iterator paramend = params.end(); + while(input.get(ch)) + { + if (ch == '%') + { + char newch = '\0'; + input.get(newch); + if (newch != '\0') + { + switch(newch) + { + case '%': + output << ch; + break; + case 's': + case 'd': + case 'f': + { + string temp; + if (paramlist == paramend) + { + throw HAException("Syntax error: Not enough parameters for given control string."); + } + temp = *paramlist; + output << temp; + paramlist++; + break; + } + default: + output << ch << newch; + } + } else + { + output << ch; + } + } else + { + output << ch; + } + } + ret = output.str(); + return ret; +} +#endif +// ---------------------------------------------------------------------------- +// getLine +// Get line from input stream +// ---------------------------------------------------------------------------- +// +string getLine(istream& aInput) +{ + string line = KEmpty; + char ch = 0; + while(aInput.get(ch) && ch != '\n') + { + if (line == KEmpty) + { + line = ""; + } + line += ch; + } + if (ch == '\n' && line == KEmpty) + { + line = ""; + } + return line; +} + + +// ---------------------------------------------------------------------------- +// parseCommandlineParameters +// ---------------------------------------------------------------------------- +// +list parseCommandlineParameters(string args) +{ + istringstream input(args); + char ch; + string str; + bool careForSpace = true; + bool strSpace = false; + bool whitespace = true; + list parmlist; + while (input.get(ch)) + { + if (ch == ' ' && careForSpace == true) + { + if (whitespace == false) + { + parmlist.push_back(str); + } + str = ""; + whitespace = false; + careForSpace = false; + }else if (ch == ' ' && strSpace == false) + { + // Do nothing + }else if (ch == '"') + { + if (strSpace == false) + { + careForSpace = false; + strSpace = true; + } else + { + careForSpace = true; + strSpace = false; + } + whitespace = false; + } else if (ch == '\n') + { + throw HAException("Syntax error: Newline not accepted in parameter list."); + } else + { + if (careForSpace == false && strSpace == false) + { + careForSpace = true; + } + str += ch; + whitespace = false; + } + } + if (strSpace == true) + { + throw HAException("Syntax error: End of string before ending quotation mark."); + } + if (str.length() != 0) + { + parmlist.push_back(str); + } + return parmlist; +} + + +// ---------------------------------------------------------------------------- +// isNum +// Return if the given string is number +// ---------------------------------------------------------------------------- +// +bool isNum(string str) +{ + istringstream strnum(str); + char ch; + bool ret = false; + while(strnum.get(ch)) + { + ret = (0 != isdigit(ch)); + if (ret == false) + { + break; + } + } + return ret; +} + +// ---------------------------------------------------------------------------- +// isAlpha +// Return if the given string is alphan +// ---------------------------------------------------------------------------- +// +bool isAlpha(string str) +{ + istringstream strnum(str); + char ch; + bool ret = false; + while(strnum.get(ch)) + { + ret = (0 != isalpha(ch)); + if (ret == false) + { + break; + } + } + return ret; +} + +// ---------------------------------------------------------------------------- +// isAlphaNum +// Return if the given string is alphanumeric +// ---------------------------------------------------------------------------- +// +bool isAlphaNum(string str) +{ + istringstream strnum(str); + char ch; + bool ret = false; + while(strnum.get(ch)) + { + ret = (0 != isalnum(ch)); + if (ret == false) + { + break; + } + } + return ret; +} + +// ---------------------------------------------------------------------------- +// toLowerCaseWin +// Convert given string to lower case +// ---------------------------------------------------------------------------- +// +string toLowerCaseWin(string aString) +{ + string ret; + char* tempvar; + unsigned int len = (unsigned int)aString.length(); + + tempvar = new char[len + 1]; + strcpy(tempvar, aString.c_str()); +#ifdef __WIN__ + TO_LOWER_CASE; +#else + ret=tempvar; +#endif + delete[] tempvar; + return ret; +} + +// ---------------------------------------------------------------------------- +// toLowerCaseW +// Convert given string to lower case +// ---------------------------------------------------------------------------- +// +string toLowerCase(string aString) +{ + string ret; + char* tempvar; + unsigned int len = (unsigned int)aString.length(); + + tempvar = new char[len + 1]; + strcpy(tempvar, aString.c_str()); + + TO_LOWER_CASE; + + delete[] tempvar; + return ret; +} + +// ---------------------------------------------------------------------------- +// toUpperCase +// Convert given string to upper case +// ---------------------------------------------------------------------------- +// +string toUpperCase(string aString) +{ + string ret; + char* tempvar; + unsigned int len = (unsigned int)aString.length(); + + tempvar = new char[len + 1]; + strcpy(tempvar, aString.c_str()); +/* +#ifdef __WIN__ + ret = strupr(tempvar); +#else + for(unsigned int i = 0; i < len; i++) + { + tempvar[i] = std::toupper(tempvar[i]); + } + ret = tempvar; +#endif +*/ + TO_UPPER_CASE; + return ret; +} + +// ---------------------------------------------------------------------------- +// splitString +// Split string +// ---------------------------------------------------------------------------- +// +vector splitString(const string& str, char separator) +{ + vector ret; + string::size_type pos = str.find(separator); + unsigned int lastpos = 0; + while(pos != string::npos) + { + ret.push_back(str.substr(lastpos, pos - lastpos)); + lastpos = (unsigned int)pos + 1; + pos = str.find(separator, lastpos); + } + if (!str.empty()) + { + ret.push_back(str.substr(lastpos, pos)); + } + return ret; +} + + +// ---------------------------------------------------------------------------- +// compareFiles +// ---------------------------------------------------------------------------- +// +bool compareFiles(const string& tocompare, const string& comparestr, bool tryfilename) +{ + bool ret = false; + string tocomp(tocompare); + string compstr(comparestr); + toLower(tocomp); + toLower(compstr); + + if (tocomp.compare(compstr) == 0) + { + ret = true; + } else if (tryfilename == false) + { + // Do nothing + } else + { + if (compstr == BBCFileUtils::StripPath(compstr)) + { + tocomp = BBCFileUtils::StripPath(tocomp); + if (tocomp.compare(compstr) == 0) + { + ret = true; + } + } + } + return ret; +} + +// ---------------------------------------------------------------------------- +// compareFiles +// ---------------------------------------------------------------------------- +// +bool compareFiles(const pair& tocompare, const string& comparestr, bool tryfilename) +{ + bool ret = false; + //string tempvar(tocompare.second); + if (tocompare.second.compare(comparestr) == 0) + { + ret = true; + } else if (tryfilename == false) + { + // Do nothing + } else + { + if (rightmostDirSeparatorIndex(comparestr) == string::npos || rightmostDirSeparatorIndex(comparestr) == 0) + { + string tempcomparestr(BBCFileUtils::StripPath(comparestr)); + string tempvar(BBCFileUtils::StripPath(tocompare.second)); + if (tempvar.compare(tempcomparestr) == 0) + { + ret = true; + } + } + } + return ret; +} + + +// ---------------------------------------------------------------------------- +// rightmostDirSeparatorIndex +// Return the index of the rightmost directory separator +// ---------------------------------------------------------------------------- +// +string::size_type rightmostDirSeparatorIndex(const string& aFilename) +{ + string::size_type idx = aFilename.rfind(DIR_SEPARATOR); + return idx; +} +// ---------------------------------------------------------------------------- +// replaceChar +// Replaces all occurences of the character by another one. +// Example: +// +// string myStr("c:/temp/config.txt"); +// replaceChar(myStr, '/', '\\'); +// std::cout << myStr << std::endl; +// +// Above example will print out the following string: +// c:\temp\config.txt +// ---------------------------------------------------------------------------- +// +void replaceChar(string& str, char replaceFrom, char replaceTo) +{ + if( str.length() > 0 ) + { + string::size_type index = 0; + while( (index = str.find(replaceFrom, index)) != string::npos ) + { + str.replace(index,1,1,replaceTo); + } + } +} + + +// ---------------------------------------------------------------------------- +// removeBase +// Remove base part from a string +// ---------------------------------------------------------------------------- +// +string removeBase(string aString, string aBase) +{ + string::size_type pos = toLowerCaseWin(aString).find(toLowerCaseWin(aBase),0); + if ( pos == string::npos ) + return NULL; + return aString.substr(aBase.length()); +} + +// ---------------------------------------------------------------------------- +// trimLeadingDirSeparator +// Remove any leading directory separators from a string +// ---------------------------------------------------------------------------- +// +string trimLeadingDirSeparator(string aString) +{ + int pos = 0; + while ( aString[pos] == '\\' || aString[pos] == '/' ) + ++pos; + if ( (aString.length() - pos) > 255 ) + return NULL; + return aString.substr(pos); +} +//------------------------------------------------------------------ +//compareWholeFileStrings +// Comare base file with current file after excluding sub dirs each time until string ends +// return true if base string matches with current string anytime after excluding sub dirs.Else false. +//------------------------------------------------------------------ + +bool compareWholeFileStrings(const string& aBasestr,const string& aCurstr) +{ + bool ret = false; + char separator = DIR_SEPARATOR; + unsigned int lastpos = 0; + string tmpStr; + string::size_type pos = aCurstr.find(separator); + while(pos != string::npos && ret == false) + { + tmpStr.clear(); + lastpos = (unsigned int)pos + 1; + pos = aCurstr.find(separator, lastpos); + if(pos!= string::npos) + { + tmpStr.append(aCurstr.substr(pos, string::npos)); + if(tmpStr.compare(aBasestr) == 0) + ret = true; + } + } + return ret; +}