imgtools/buildrom/tools/features.pm
changeset 590 360bd6b35136
parent 0 044383f39525
--- a/imgtools/buildrom/tools/features.pm	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/buildrom/tools/features.pm	Wed Jun 23 16:56:47 2010 +0800
@@ -1,538 +1,538 @@
-#
-# 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: 
-#
-
-# This package contains routines to create the feature header and iby files.
-package features;
-
-require Exporter;
-@ISA=qw(Exporter);
-@EXPORT=qw(
-	open_Database
-	generate_Headerfile
-	generate_Obeyfile
-	generate_DATfile
-	set_DefaultPath
-	set_VerboseMode
-	set_StrictMode
-);
-
-use strict;
-
-# Include the featureutil module to use API to read from XML file.
-use featuresutil;
-
-# Object of featureparser
-my $xmlDBHandle = undef;
-
-# Mask value for supported feature flag
-use constant BIT_SUPPORTED=>0x00000001;
-
-# Feature dat file name
-use constant DAT_FILE=>"features.dat";
-
-# Feature manager support flag
-use constant FM_FLG=>0x01;
-
-# Feature registry support flag
-use constant FR_FLG=>0x02;
-
-# single dat file generation
-use constant SINGLE_DATFILE=>1;
-
-# none value
-use constant NONE=>-1;
-
-# verbose mode flag
-my $verboseMode = 0;
-
-# strict mode flag
-my $strictMode = 0;
-
-#
-# Open and parse the given xml database
-# @param - xml file name
-#
-sub open_Database
-{
-	my ($xmlDBFile) = join(',',@_);
-	
-	$xmlDBHandle = &featuresutil::parseXMLDatabase($xmlDBFile,FM_FLG,$strictMode,$verboseMode);
-	
-	return 0 if(!$xmlDBHandle);
-	return 1;
-}
-
-#
-# set the default path settings for header and iby files
-#
-sub set_DefaultPath
-{
-	my ($epocroot, $hdrpath, $ibypath, $datpath, $convpath) = @_;
-	
-	$$hdrpath = $epocroot."epoc32/include/";
-	$$ibypath = $epocroot."epoc32/rom/include/";
-	$$datpath = "./"; # current folder
-	$$convpath = "./"; # current folder
-}
-
-#
-# Generate the header file for each featureset
-# @param - destination path for the header file(s)
-#
-sub generate_Headerfile
-{
-	my $featureList=(); 
-	my $featureSetList = ();
-	my $hdrpath = shift;
-	my $aliasfeatureList = ();
-	
-	# Get the list of featuresets exists in the xml database
-	$featureSetList = $xmlDBHandle->getFeatureset();
-	foreach my $featureSet (@$featureSetList) {
-		my @defPresent=();
-		my @defNotPresent=();
-		my @defPresentAlias = ();
-		my @defNotPresentAlias = ();
-		my $tab = "\t";
-		
-		# if the headerfile name is not there then just return
-		if(!defined $featureSet->{hfilename}) {
-			MSG("No header file generated for the featureset $featureSet->{namespace}");
-			next;
-		}
-		
-		# Get the filename
-		my $hfile = $featureSet->{hfilename};
-		
-		# Create directory if it doesn't exists
-		return if(!createDirectory($hdrpath));
-		
-		my $hfileHandle = openFile($hdrpath.$hfile);
-		if(!$hfileHandle) {
-			print "ERROR: Cannot open file $hdrpath$hfile\n";
-			next;
-		}
-		
-		MSG("Creating headerfile $hdrpath$hfile");
-		
-		# Get the name->uid map for the features given in the selected featureset
-		$featureList = $featureSet->{feature_list};
-		# Create two sets of feature name list for the default present and notpresent
-		foreach my $name (keys %$featureList)
-		{
-			if(defaultPresent($featureList->{$name})){
-				push @defPresent, $name;
-			}
-			else {
-				push @defNotPresent, $name;
-			}
-		}
-		#for alias
-		$aliasfeatureList = $featureSet->{alias_feature_list};
-		foreach my $alias_name (keys %$aliasfeatureList)
-		{
-			if(defaultPresent($aliasfeatureList->{$alias_name}))
-			{
-				push @defPresentAlias, $alias_name;
-			}
-			else
-			{
-				push @defNotPresent, $alias_name;
-			}
-		}
-
-		# sort them
-		@defPresent = sort(@defPresent);
-		@defNotPresent = sort(@defNotPresent);
-		
-		# insert the file header attribute value
-		my $comment = $featureSet->{hfileheader};
-		if($comment) {
-			trimString(\$comment);
-			
-			# insert the interfacevisibility and interfacestatus attribute values
-			writeFile($hfileHandle, $comment."\n/**\n".$featureSet->{interfacevisibility}."\n".
-						 $featureSet->{interfacestatus}."\n*/\n");
-		}
-					 
-		if(defined $featureSet->{namespace}) {
-			writeFile($hfileHandle, "namespace ".$featureSet->{namespace}." {\n");
-		}
-		else {
-			$tab = "";
-		}
-		
-		# for each feature list insert an entry in the current namespace
-		writeFile($hfileHandle,$tab."// default present\n") if(@defPresent);
-		foreach my $name (@defPresent) {
-			$comment = $featureSet->{feature}{$featureList->{$name}}{comment};
-			if(defined $comment) {
-				trimString(\$comment);
-				$comment =~ s/\n/\n$tab/mg;
-				chop($comment) if($tab eq "\t");
-				writeFile($hfileHandle, $tab.$comment);
-			}
-			
-			writeFile($hfileHandle,$tab."const TUid K", $featureSet->{feature}{$featureList->{$name}}{name},
-						 sprintf(" = {0x%X};\n", $featureList->{$name}));
-			writeFile($hfileHandle,"\n") if(defined $comment);
-		}
-
-		foreach my $alias_name (@defPresentAlias)
-		{
-			$comment = $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{comment};
-			if(defined $comment)
-			{
-				trimString(\$comment);
-				$comment =~ s/\n/\n$tab/mg;
-				chop($comment) if ($tab eq "\t");
-				writeFile($hfileHandle, $tab.$comment);
-			}
-			writeFile($hfileHandle, $tab."const TUid K", $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{name}, sprintf(" = {0x%X};\n", $aliasfeatureList->{$alias_name}));
-			writeFile($hfileHandle, "\n") if(defined $comment);
-		}
-
-		writeFile($hfileHandle, "\n".$tab."// default not present\n") if(@defNotPresent);
-		foreach my $name (@defNotPresent) {
-			$comment = $featureSet->{feature}{$featureList->{$name}}{comment};
-			if(defined $comment) {
-				trimString(\$comment);
-				$comment =~ s/\n/\n$tab/mg;
-				chop($comment) if($tab eq "\t");
-				writeFile($hfileHandle,$tab.$comment);
-			}
-			
-			writeFile($hfileHandle,$tab."const TUid K", $featureSet->{feature}{$featureList->{$name}}{name},
-						 sprintf(" = {0x%X};\n", $featureList->{$name}));
-			writeFile($hfileHandle,"\n") if(defined $comment);
-		}
-		foreach my $alias_name (@defNotPresentAlias)
-		{
-			$comment = $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{comment};
-			if(defined $comment)
-			{
-				trimString(\$comment);
-				$comment =~ s/\n/\n$tab/mg;
-				chop($comment) if ($tab eq "\t");
-				writeFile($hfileHandle, $tab.$comment);
-			}
-			writeFile($hfileHandle, $tab."const TUid K", $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{name}, sprintf(" = {0x%X};\n", $aliasfeatureList->{$alias_name}));
-			writeFile($hfileHandle, "\n") if(defined $comment);
-		}
-		
-		if(defined $featureSet->{namespace}) {
-			writeFile($hfileHandle,"}\n");
-		}
-		
-		closeFile($hfileHandle);
-	}
-}
-
-#
-# Generate the obey file for each featureset
-# @param - destination path for the iby file(s)
-#
-sub generate_Obeyfile
-{
-	my $featureSet=(); my $feature=(); my $featureList=(); my $featureSetList=();
-	my $aliasfeatureList = ();
-	my $ibypath = shift;
-	
-	# Get the list of featuresets exists in the xml database
-	$featureSetList = $xmlDBHandle->getFeatureset();
-	foreach my $featureSet (@$featureSetList) {
-		# if the obey file name is not there then just return
-		if(!defined $featureSet->{ibyname}) {
-			MSG("No IBY file generated for the featureset $featureSet->{namespace}");
-			next;
-		}
-		
-		# Get the file name
-		my $ibyfile = $featureSet->{ibyname};
-		
-		# Create the directory if it doesn't exists
-		return if(!createDirectory($ibypath));
-		
-		my $ibyfilehandle = openFile($ibypath.$ibyfile);
-		if(!$ibyfilehandle) {
-			print "*ERROR: Cannot open file $ibypath$ibyfile\n";
-			next;
-		}
-		
-		MSG("Creating IBY file $ibypath$ibyfile");
-		
-		$ibyfile =~ s/\./\_/g;
-		$ibyfile = uc($ibyfile);
-		
-		# insert the file header
-		writeFile($ibyfilehandle, "#ifndef\t__",$ibyfile,"__\n#define\t__",$ibyfile,"__\n\n");
-
-		# get the name->uid map of features for the given featureset
-		$featureList = $featureSet->{feature_list};
-		$aliasfeatureList = $featureSet->{alias_feature_list};
-		my %combine_list = (%$featureList, %$aliasfeatureList);
-		foreach my $name (sort keys %combine_list)
-		{
-			my $defblock=(); my $flags=(); my $comment=();
-			
-			my $uid = $xmlDBHandle->getFeatureUID($name,$featureSet->{namespace});
-			
-			# get the featureset attributes
-			$feature = $xmlDBHandle->getFeatureInfo($uid,$featureSet->{namespace});
-			
-			# check to see this feature to be included in iby file
-			next if(!$feature->{infeaturesetiby});
-			# get the feature flags
-			$flags = "SF ".$feature->{statusflags} if(defined $feature->{statusflags});
-			if(defined $feature->{userdata}) {
-				$flags .= " "."UD ".$feature->{userdata};
-			}
-			else {
-				$flags .= " "."UD 0x00000000";
-			}
-
-			# get the comment value
-			if(defined $feature->{comment}) {
-				$comment = $feature->{comment};
-				trimString(\$comment);
-			}
-			
-			if(defined $feature->{includemacro}) { # if the include macro is specified
-				$defblock = "\n#ifdef ".$feature->{includemacro}."\n";
-				$defblock .= $comment;
-				$defblock .= "FEATURE ".$feature->{name}." ".$flags."\n";
-				$defblock .= "#else\nEXCLUDE_FEATURE ".$feature->{name}." ".$flags."\n#endif\n"
-			}
-			elsif(defined $feature->{excludemacro}) { # if the exclude macro is specified
-				$defblock = "\n#ifdef ".$feature->{excludemacro}."\n";
-				$defblock .= "EXCLUDE_FEATURE ".$feature->{name}." ".$flags."\n#else\n";
-				$defblock .= $comment;
-				$defblock .= "FEATURE ".$feature->{name}." ".$flags."\n#endif\n"
-			}
-			else {  # default case
-				# No system wide macro defined for this feature
-				next;
-			}
-			
-			# insert #ifdef block
-			writeFile($ibyfilehandle, $defblock);
-		}
-		
-		writeFile($ibyfilehandle, "\n\n#endif //__",$ibyfile,"__");
-		closeFile($ibyfilehandle);
-	}
-}
-
-#
-# Generate the feature DAT file
-# @param - destination path for the features.DAT file
-#
-sub generate_DATfile
-{
-	my $featureSet=(); my $feature=(); my $featureList=(); my $featureSetList=();
-	my @featList=();
-	my $aliasfeatureList = ();
-	my $aliasfeatlist = ();
-	my %uidtoaliasname = ();
-	my $datpath = shift;
-	
-	# Get the list of featuresets exists in the xml database
-	$featureSetList = $xmlDBHandle->getFeatureset();
-	$aliasfeatlist = $xmlDBHandle->getAliasFeatureList();
-	foreach my $aliasname (keys %$aliasfeatlist)
-	{
-		$uidtoaliasname{$aliasfeatlist->{$aliasname}} = $aliasname;
-	}
-	foreach my $featureSet (@$featureSetList) {
-		# get the name->uid map of features for the given featureset
-		$featureList = $featureSet->{feature_list};
-		foreach my $name (keys %$featureList)
-		{
-			if (exists $uidtoaliasname{$featureList->{$name}})
-			{
-				next;
-			}
-			my $statusflag = 0;
-			my %featinfo = ();
-			
-			$featinfo{feature} = $name;
-			$featinfo{SF} = $xmlDBHandle->getStatusFlag($name, $featureSet->{namespace});
-			$featinfo{UD} = $xmlDBHandle->getUserData($name, $featureSet->{namespace});
-			$statusflag = &featureparser::ConvertHexToDecimal($featinfo{SF});
-			if($statusflag & BIT_SUPPORTED) {
-				$featinfo{include} = 1;
-			}
-			else {
-				$featinfo{include} = 0;
-			}
-			
-			push @featList, {%featinfo};
-		}
-		$aliasfeatureList = $featureSet->{alias_feature_list};
-		foreach my $alias_name (keys %$aliasfeatureList)
-		{
-			my $statusflag = 0;
-			my %featinfo = ();
-			
-			$featinfo{feature} = $alias_name;
-			$featinfo{SF} = $xmlDBHandle->getStatusFlag($alias_name, $featureSet->{namespace});
-			$featinfo{UD} = $xmlDBHandle->getUserData($alias_name, $featureSet->{namespace});
-			$statusflag = &featureparser::ConvertHexToDecimal($featinfo{SF});
-			if($statusflag & BIT_SUPPORTED) {
-				$featinfo{include} = 1;
-			}
-			else {
-				$featinfo{include} = 0;
-			}
-			push @featList, {%featinfo};
-		}
-
-
-	}
-	
-	if(@featList) {
-		# Create the directory if doesn't exists
-		return if(!createDirectory($datpath));
-		
-		# Create features.dat file
-		&featuresutil::createFeatureFile(NONE,NONE,$datpath.DAT_FILE,\@featList,FM_FLG,SINGLE_DATFILE);
-	}
-}
-
-#
-# Converts the feature registry object to feature manager xml
-# @param - destination path for the output file
-# @param - input file list as an array
-#
-sub convert_FeatRegToFeatMgr
-{
-	&featuresutil::convert_FeatRegToFeatMgr($strictMode,$verboseMode,@_);
-}
-
-#
-# Enable verbose mode
-# 
-sub set_VerboseMode
-{
-	$verboseMode = 1;
-}
-
-#
-# Enable strict mode
-# 
-sub set_StrictMode
-{
-	$strictMode = 1;
-}
-
-# --Utility Functions
-
-#
-# Check whether the given feature uid is present in default include list
-# @param - feature uid value
-#
-sub defaultPresent
-{
-	my ($uid) = shift;
-	
-	my $defaultRanges = $xmlDBHandle->defaultRangeList();
-	
-	foreach my $range (@$defaultRanges)
-	{
-		if ( (lc($range->{"support"}) eq "include") and ($range->{"min"} <= $uid) and ($range->{"max"} >= $uid) ) {
-			return 1;
-		}
-	}
-	return 0;
-}
-
-#
-# Trim the given string for trailing whitespaces
-# @param - string to be trimmed
-#
-sub trimString
-{
-	my $str = shift;
-	
-	$$str =~ s/^[ \t]+//mg;
-	$$str =~ s/^\n//mg;
-	
-	$$str .= "\n" if($$str !~ /\n$/m);
-}
-
-#
-# Verbose mode output routine
-# @param - Message to be displayed
-#
-sub MSG 
-{
-	print "**".$_[0]."...\n" if($verboseMode);
-}
-
-#
-# Open a text file in write mode
-# @param - name of the file to open
-#
-sub openFile
-{
-	my $file = shift;
-	
-	open(FILEP,">$file") or (return 0);
-	
-	return *FILEP;
-}
-
-#
-# Writes string to the file stream
-# @param filehandle - reference to the file handle
-# @param data - array of string to be written
-#
-sub writeFile
-{
-	my ($filehandle, @data) = @_;
-	
-	printf $filehandle "%s",$_ foreach (@data);
-}
-
-#
-# Closes the file stream
-# @param filehanlde - referece to the file handle
-#
-sub closeFile
-{
-	my $filehandle = shift;
-	
-	close $filehandle;
-}
-
-#
-# Check the existance of the directory and create one if it doesn't exist
-# @param dir - directory name
-#
-sub createDirectory
-{
-	my $dir = shift;
-	
-	if(!(-e $dir)) {
-		if(!mkdir($dir)) {
-			print "ERROR: Failed to create $dir folder\n";
-			return 0;
-		}
-	}
-	return 1;
-}
-
-1;
+#
+# 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: 
+#
+
+# This package contains routines to create the feature header and iby files.
+package features;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	open_Database
+	generate_Headerfile
+	generate_Obeyfile
+	generate_DATfile
+	set_DefaultPath
+	set_VerboseMode
+	set_StrictMode
+);
+
+use strict;
+
+# Include the featureutil module to use API to read from XML file.
+use featuresutil;
+
+# Object of featureparser
+my $xmlDBHandle = undef;
+
+# Mask value for supported feature flag
+use constant BIT_SUPPORTED=>0x00000001;
+
+# Feature dat file name
+use constant DAT_FILE=>"features.dat";
+
+# Feature manager support flag
+use constant FM_FLG=>0x01;
+
+# Feature registry support flag
+use constant FR_FLG=>0x02;
+
+# single dat file generation
+use constant SINGLE_DATFILE=>1;
+
+# none value
+use constant NONE=>-1;
+
+# verbose mode flag
+my $verboseMode = 0;
+
+# strict mode flag
+my $strictMode = 0;
+
+#
+# Open and parse the given xml database
+# @param - xml file name
+#
+sub open_Database
+{
+	my ($xmlDBFile) = join(',',@_);
+	
+	$xmlDBHandle = &featuresutil::parseXMLDatabase($xmlDBFile,FM_FLG,$strictMode,$verboseMode);
+	
+	return 0 if(!$xmlDBHandle);
+	return 1;
+}
+
+#
+# set the default path settings for header and iby files
+#
+sub set_DefaultPath
+{
+	my ($epocroot, $hdrpath, $ibypath, $datpath, $convpath) = @_;
+	
+	$$hdrpath = $epocroot."epoc32/include/";
+	$$ibypath = $epocroot."epoc32/rom/include/";
+	$$datpath = "./"; # current folder
+	$$convpath = "./"; # current folder
+}
+
+#
+# Generate the header file for each featureset
+# @param - destination path for the header file(s)
+#
+sub generate_Headerfile
+{
+	my $featureList=(); 
+	my $featureSetList = ();
+	my $hdrpath = shift;
+	my $aliasfeatureList = ();
+	
+	# Get the list of featuresets exists in the xml database
+	$featureSetList = $xmlDBHandle->getFeatureset();
+	foreach my $featureSet (@$featureSetList) {
+		my @defPresent=();
+		my @defNotPresent=();
+		my @defPresentAlias = ();
+		my @defNotPresentAlias = ();
+		my $tab = "\t";
+		
+		# if the headerfile name is not there then just return
+		if(!defined $featureSet->{hfilename}) {
+			MSG("No header file generated for the featureset $featureSet->{namespace}");
+			next;
+		}
+		
+		# Get the filename
+		my $hfile = $featureSet->{hfilename};
+		
+		# Create directory if it doesn't exists
+		return if(!createDirectory($hdrpath));
+		
+		my $hfileHandle = openFile($hdrpath.$hfile);
+		if(!$hfileHandle) {
+			print "ERROR: Cannot open file $hdrpath$hfile\n";
+			next;
+		}
+		
+		MSG("Creating headerfile $hdrpath$hfile");
+		
+		# Get the name->uid map for the features given in the selected featureset
+		$featureList = $featureSet->{feature_list};
+		# Create two sets of feature name list for the default present and notpresent
+		foreach my $name (keys %$featureList)
+		{
+			if(defaultPresent($featureList->{$name})){
+				push @defPresent, $name;
+			}
+			else {
+				push @defNotPresent, $name;
+			}
+		}
+		#for alias
+		$aliasfeatureList = $featureSet->{alias_feature_list};
+		foreach my $alias_name (keys %$aliasfeatureList)
+		{
+			if(defaultPresent($aliasfeatureList->{$alias_name}))
+			{
+				push @defPresentAlias, $alias_name;
+			}
+			else
+			{
+				push @defNotPresent, $alias_name;
+			}
+		}
+
+		# sort them
+		@defPresent = sort(@defPresent);
+		@defNotPresent = sort(@defNotPresent);
+		
+		# insert the file header attribute value
+		my $comment = $featureSet->{hfileheader};
+		if($comment) {
+			trimString(\$comment);
+			
+			# insert the interfacevisibility and interfacestatus attribute values
+			writeFile($hfileHandle, $comment."\n/**\n".$featureSet->{interfacevisibility}."\n".
+						 $featureSet->{interfacestatus}."\n*/\n");
+		}
+					 
+		if(defined $featureSet->{namespace}) {
+			writeFile($hfileHandle, "namespace ".$featureSet->{namespace}." {\n");
+		}
+		else {
+			$tab = "";
+		}
+		
+		# for each feature list insert an entry in the current namespace
+		writeFile($hfileHandle,$tab."// default present\n") if(@defPresent);
+		foreach my $name (@defPresent) {
+			$comment = $featureSet->{feature}{$featureList->{$name}}{comment};
+			if(defined $comment) {
+				trimString(\$comment);
+				$comment =~ s/\n/\n$tab/mg;
+				chop($comment) if($tab eq "\t");
+				writeFile($hfileHandle, $tab.$comment);
+			}
+			
+			writeFile($hfileHandle,$tab."const TUid K", $featureSet->{feature}{$featureList->{$name}}{name},
+						 sprintf(" = {0x%X};\n", $featureList->{$name}));
+			writeFile($hfileHandle,"\n") if(defined $comment);
+		}
+
+		foreach my $alias_name (@defPresentAlias)
+		{
+			$comment = $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{comment};
+			if(defined $comment)
+			{
+				trimString(\$comment);
+				$comment =~ s/\n/\n$tab/mg;
+				chop($comment) if ($tab eq "\t");
+				writeFile($hfileHandle, $tab.$comment);
+			}
+			writeFile($hfileHandle, $tab."const TUid K", $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{name}, sprintf(" = {0x%X};\n", $aliasfeatureList->{$alias_name}));
+			writeFile($hfileHandle, "\n") if(defined $comment);
+		}
+
+		writeFile($hfileHandle, "\n".$tab."// default not present\n") if(@defNotPresent);
+		foreach my $name (@defNotPresent) {
+			$comment = $featureSet->{feature}{$featureList->{$name}}{comment};
+			if(defined $comment) {
+				trimString(\$comment);
+				$comment =~ s/\n/\n$tab/mg;
+				chop($comment) if($tab eq "\t");
+				writeFile($hfileHandle,$tab.$comment);
+			}
+			
+			writeFile($hfileHandle,$tab."const TUid K", $featureSet->{feature}{$featureList->{$name}}{name},
+						 sprintf(" = {0x%X};\n", $featureList->{$name}));
+			writeFile($hfileHandle,"\n") if(defined $comment);
+		}
+		foreach my $alias_name (@defNotPresentAlias)
+		{
+			$comment = $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{comment};
+			if(defined $comment)
+			{
+				trimString(\$comment);
+				$comment =~ s/\n/\n$tab/mg;
+				chop($comment) if ($tab eq "\t");
+				writeFile($hfileHandle, $tab.$comment);
+			}
+			writeFile($hfileHandle, $tab."const TUid K", $featureSet->{alias_feature}{$aliasfeatureList->{$alias_name}}{name}, sprintf(" = {0x%X};\n", $aliasfeatureList->{$alias_name}));
+			writeFile($hfileHandle, "\n") if(defined $comment);
+		}
+		
+		if(defined $featureSet->{namespace}) {
+			writeFile($hfileHandle,"}\n");
+		}
+		
+		closeFile($hfileHandle);
+	}
+}
+
+#
+# Generate the obey file for each featureset
+# @param - destination path for the iby file(s)
+#
+sub generate_Obeyfile
+{
+	my $featureSet=(); my $feature=(); my $featureList=(); my $featureSetList=();
+	my $aliasfeatureList = ();
+	my $ibypath = shift;
+	
+	# Get the list of featuresets exists in the xml database
+	$featureSetList = $xmlDBHandle->getFeatureset();
+	foreach my $featureSet (@$featureSetList) {
+		# if the obey file name is not there then just return
+		if(!defined $featureSet->{ibyname}) {
+			MSG("No IBY file generated for the featureset $featureSet->{namespace}");
+			next;
+		}
+		
+		# Get the file name
+		my $ibyfile = $featureSet->{ibyname};
+		
+		# Create the directory if it doesn't exists
+		return if(!createDirectory($ibypath));
+		
+		my $ibyfilehandle = openFile($ibypath.$ibyfile);
+		if(!$ibyfilehandle) {
+			print "*ERROR: Cannot open file $ibypath$ibyfile\n";
+			next;
+		}
+		
+		MSG("Creating IBY file $ibypath$ibyfile");
+		
+		$ibyfile =~ s/\./\_/g;
+		$ibyfile = uc($ibyfile);
+		
+		# insert the file header
+		writeFile($ibyfilehandle, "#ifndef\t__",$ibyfile,"__\n#define\t__",$ibyfile,"__\n\n");
+
+		# get the name->uid map of features for the given featureset
+		$featureList = $featureSet->{feature_list};
+		$aliasfeatureList = $featureSet->{alias_feature_list};
+		my %combine_list = (%$featureList, %$aliasfeatureList);
+		foreach my $name (sort keys %combine_list)
+		{
+			my $defblock=(); my $flags=(); my $comment=();
+			
+			my $uid = $xmlDBHandle->getFeatureUID($name,$featureSet->{namespace});
+			
+			# get the featureset attributes
+			$feature = $xmlDBHandle->getFeatureInfo($uid,$featureSet->{namespace});
+			
+			# check to see this feature to be included in iby file
+			next if(!$feature->{infeaturesetiby});
+			# get the feature flags
+			$flags = "SF ".$feature->{statusflags} if(defined $feature->{statusflags});
+			if(defined $feature->{userdata}) {
+				$flags .= " "."UD ".$feature->{userdata};
+			}
+			else {
+				$flags .= " "."UD 0x00000000";
+			}
+
+			# get the comment value
+			if(defined $feature->{comment}) {
+				$comment = $feature->{comment};
+				trimString(\$comment);
+			}
+			
+			if(defined $feature->{includemacro}) { # if the include macro is specified
+				$defblock = "\n#ifdef ".$feature->{includemacro}."\n";
+				$defblock .= $comment;
+				$defblock .= "FEATURE ".$feature->{name}." ".$flags."\n";
+				$defblock .= "#else\nEXCLUDE_FEATURE ".$feature->{name}." ".$flags."\n#endif\n"
+			}
+			elsif(defined $feature->{excludemacro}) { # if the exclude macro is specified
+				$defblock = "\n#ifdef ".$feature->{excludemacro}."\n";
+				$defblock .= "EXCLUDE_FEATURE ".$feature->{name}." ".$flags."\n#else\n";
+				$defblock .= $comment;
+				$defblock .= "FEATURE ".$feature->{name}." ".$flags."\n#endif\n"
+			}
+			else {  # default case
+				# No system wide macro defined for this feature
+				next;
+			}
+			
+			# insert #ifdef block
+			writeFile($ibyfilehandle, $defblock);
+		}
+		
+		writeFile($ibyfilehandle, "\n\n#endif //__",$ibyfile,"__\n");
+		closeFile($ibyfilehandle);
+	}
+}
+
+#
+# Generate the feature DAT file
+# @param - destination path for the features.DAT file
+#
+sub generate_DATfile
+{
+	my $featureSet=(); my $feature=(); my $featureList=(); my $featureSetList=();
+	my @featList=();
+	my $aliasfeatureList = ();
+	my $aliasfeatlist = ();
+	my %uidtoaliasname = ();
+	my $datpath = shift;
+	
+	# Get the list of featuresets exists in the xml database
+	$featureSetList = $xmlDBHandle->getFeatureset();
+	$aliasfeatlist = $xmlDBHandle->getAliasFeatureList();
+	foreach my $aliasname (keys %$aliasfeatlist)
+	{
+		$uidtoaliasname{$aliasfeatlist->{$aliasname}} = $aliasname;
+	}
+	foreach my $featureSet (@$featureSetList) {
+		# get the name->uid map of features for the given featureset
+		$featureList = $featureSet->{feature_list};
+		foreach my $name (keys %$featureList)
+		{
+			if (exists $uidtoaliasname{$featureList->{$name}})
+			{
+				next;
+			}
+			my $statusflag = 0;
+			my %featinfo = ();
+			
+			$featinfo{feature} = $name;
+			$featinfo{SF} = $xmlDBHandle->getStatusFlag($name, $featureSet->{namespace});
+			$featinfo{UD} = $xmlDBHandle->getUserData($name, $featureSet->{namespace});
+			$statusflag = &featureparser::ConvertHexToDecimal($featinfo{SF});
+			if($statusflag & BIT_SUPPORTED) {
+				$featinfo{include} = 1;
+			}
+			else {
+				$featinfo{include} = 0;
+			}
+			
+			push @featList, {%featinfo};
+		}
+		$aliasfeatureList = $featureSet->{alias_feature_list};
+		foreach my $alias_name (keys %$aliasfeatureList)
+		{
+			my $statusflag = 0;
+			my %featinfo = ();
+			
+			$featinfo{feature} = $alias_name;
+			$featinfo{SF} = $xmlDBHandle->getStatusFlag($alias_name, $featureSet->{namespace});
+			$featinfo{UD} = $xmlDBHandle->getUserData($alias_name, $featureSet->{namespace});
+			$statusflag = &featureparser::ConvertHexToDecimal($featinfo{SF});
+			if($statusflag & BIT_SUPPORTED) {
+				$featinfo{include} = 1;
+			}
+			else {
+				$featinfo{include} = 0;
+			}
+			push @featList, {%featinfo};
+		}
+
+
+	}
+	
+	if(@featList) {
+		# Create the directory if doesn't exists
+		return if(!createDirectory($datpath));
+		
+		# Create features.dat file
+		&featuresutil::createFeatureFile(NONE,NONE,$datpath.DAT_FILE,\@featList,FM_FLG,SINGLE_DATFILE);
+	}
+}
+
+#
+# Converts the feature registry object to feature manager xml
+# @param - destination path for the output file
+# @param - input file list as an array
+#
+sub convert_FeatRegToFeatMgr
+{
+	&featuresutil::convert_FeatRegToFeatMgr($strictMode,$verboseMode,@_);
+}
+
+#
+# Enable verbose mode
+# 
+sub set_VerboseMode
+{
+	$verboseMode = 1;
+}
+
+#
+# Enable strict mode
+# 
+sub set_StrictMode
+{
+	$strictMode = 1;
+}
+
+# --Utility Functions
+
+#
+# Check whether the given feature uid is present in default include list
+# @param - feature uid value
+#
+sub defaultPresent
+{
+	my ($uid) = shift;
+	
+	my $defaultRanges = $xmlDBHandle->defaultRangeList();
+	
+	foreach my $range (@$defaultRanges)
+	{
+		if ( (lc($range->{"support"}) eq "include") and ($range->{"min"} <= $uid) and ($range->{"max"} >= $uid) ) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+#
+# Trim the given string for trailing whitespaces
+# @param - string to be trimmed
+#
+sub trimString
+{
+	my $str = shift;
+	
+	$$str =~ s/^[ \t]+//mg;
+	$$str =~ s/^\n//mg;
+	
+	$$str .= "\n" if($$str !~ /\n$/m);
+}
+
+#
+# Verbose mode output routine
+# @param - Message to be displayed
+#
+sub MSG 
+{
+	print "**".$_[0]."...\n" if($verboseMode);
+}
+
+#
+# Open a text file in write mode
+# @param - name of the file to open
+#
+sub openFile
+{
+	my $file = shift;
+	
+	open(FILEP,">$file") or (return 0);
+	
+	return *FILEP;
+}
+
+#
+# Writes string to the file stream
+# @param filehandle - reference to the file handle
+# @param data - array of string to be written
+#
+sub writeFile
+{
+	my ($filehandle, @data) = @_;
+	
+	printf $filehandle "%s",$_ foreach (@data);
+}
+
+#
+# Closes the file stream
+# @param filehanlde - referece to the file handle
+#
+sub closeFile
+{
+	my $filehandle = shift;
+	
+	close $filehandle;
+}
+
+#
+# Check the existance of the directory and create one if it doesn't exist
+# @param dir - directory name
+#
+sub createDirectory
+{
+	my $dir = shift;
+	
+	if(!(-e $dir)) {
+		if(!mkdir($dir)) {
+			print "ERROR: Failed to create $dir folder\n";
+			return 0;
+		}
+	}
+	return 1;
+}
+
+1;