--- /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 <string>
+#include <stdio.h>
+#include <stdarg.h>
+#include <iostream>
+#include <sstream>
+#include <locale>
+#include <map>
+#include <vector>
+#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<string>::iterator FindFromList(const string& aValue, list<string>& aList, bool(*comparator)(const string&, const string&, bool), bool comparatorparam)
+{
+ list<string>::iterator begin = aList.begin();
+ list<string>::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<pair<string,string> >::iterator FindFromList(const string& aValue, list<pair<string,string> >& aList, bool(*comparator)(const string&, const string&, bool), bool comparatorparam)
+{
+ list<pair<string,string> >::iterator begin = aList.begin();
+ list<pair<string,string> >::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<pair<string, string> >::iterator FindFromList(const string& aValue, list<pair<string, string> >& aList, TValue compareTo, bool(*comparator)(const pair<string,string>&, const string&, bool), bool comparatorparam,bool comparewholeString)
+{
+ list<pair<string, string> >::iterator begin = aList.begin();
+ list<pair<string, string> >::iterator begin1 = aList.begin();
+ list<pair<string, 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->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<pair<pair<string, string>,string> >::iterator FindFromList(const string& aValue, list<pair<pair<string, string>,string> >& aList, TValue compareTo, bool(*comparator)(const pair<string,string>&, const string&, bool), bool comparatorparam,bool comparewholeString)
+{
+ list<pair<pair<string, string>,string> >::iterator begin = aList.begin();
+ list<pair<pair<string, string>,string> >::iterator begin1 = aList.begin();
+ list<pair<pair<string, string>,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<string> params)
+{
+ istringstream input(aControlString);
+ ostringstream output;
+ string ret;
+ char ch;
+ list<string>::iterator paramlist = params.begin();
+ list<string>::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<string> parseCommandlineParameters(string args)
+{
+ istringstream input(args);
+ char ch;
+ string str;
+ bool careForSpace = true;
+ bool strSpace = false;
+ bool whitespace = true;
+ list<string> 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<string> splitString(const string& str, char separator)
+{
+ vector<string> 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<string, string>& 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:
+// <code>
+// string myStr("c:/temp/config.txt");
+// replaceChar(myStr, '/', '\\');
+// std::cout << myStr << std::endl;
+// </code>
+// 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;
+}