sbsv1/abld/genutil/prepfile.pm
changeset 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/prepfile.pm	Fri Jun 25 17:29:25 2010 +0800
@@ -0,0 +1,172 @@
+# Copyright (c) 1997-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:
+# module for preprocessing makmake-style project files
+# 
+#
+
+
+package Prepfile;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Prepfile_SetVerbose Prepfile_SetUpperCase Prepfile_ProcessL Prepfile_SetCmdOptions
+);
+
+
+use Checkgcc;
+use Pathutl;
+use Preprocessor;
+
+my %Mode=(
+	Verbose=>0,
+	UpperCase=>0,
+        CmdOptions=>''
+);
+
+sub Prepfile_SetVerbose () {
+	$Mode{Verbose}=1;
+}
+
+sub Prepfile_SetUpperCase () {
+	$Mode{UpperCase}=1;
+}
+
+sub Prepfile_SetCmdOptions ($) {
+        $Mode{CmdOptions} = shift;
+        $Mode{CmdOptions} .= ' ' if $Mode{CmdOptions};
+}
+
+sub Prepfile_ProcessL ($$;$@) {
+# use the C++ preprocessor to process a file.  The function fills the data structure specified
+# by the first argument, an array reference, according to the contents of the second argument -
+# a filehandle.  Any other arguments are assumed to be MACROS and are defined for preprocessing.
+
+	my ($ArrayRef,$FILE,$VariantHRHFile,@Macros)=@_;
+	die "\nERROR: Project File \"$FILE\" not found\n" unless -e $FILE;
+
+	my $exe = &PreprocessorToUseExe();
+ 	my $cpp = "$exe.EXE $Mode{CmdOptions}-undef -nostdinc -+ ";
+	my @CppCall;
+ 	push @CppCall, $cpp;
+
+	push @CppCall, join '',	"-I ",&Path_PrefixWithDriveAndQuote("$ENV{EPOCROOT}epoc32\\include"),
+							" -I .",
+							" -I ",&Path_PrefixWithDriveAndQuote(&Path_Split('Path',$FILE));
+
+	my $Macro;
+	# add CL macros to the CPP call for preprocessing of the file
+	foreach $Macro (@Macros) {
+		$Macro=uc $Macro;					 # add the underscores so we can tell what has been
+		push @CppCall, "-D $Macro=_____$Macro"; # expanded and remove the space CPP puts in most of the time
+	}
+	#if a variant file is used
+	if(defined($VariantHRHFile)){
+        my $variantFilePath = Path_Split('Path',$VariantHRHFile);
+	chop( $variantFilePath );
+        push @CppCall, " -I " . &Path_PrefixWithDriveAndQuote($variantFilePath) . " -include " . &Path_PrefixWithDriveAndQuote($VariantHRHFile); 
+	}
+	# all macros made upper case and suppress user-expansion of macros for nefarious purposes
+
+	push @CppCall, &Path_PrefixWithDriveAndQuote($FILE);
+	if ($Mode{'Verbose'}) {
+		print "@CppCall\n";
+	}
+	my $CPPPIPE;
+	open CPPPIPE,"@CppCall |" or die "ERROR: Can't invoke CPP.EXE\n";
+
+	# read the processed output
+	#--------------------------
+
+	my $LineNum=0;
+	my $FileName;
+	while (<CPPPIPE>) {
+
+		# skip blank lines
+		if (/^\s*$/o) {
+			$LineNum++;
+			next;
+		}
+
+		my @Tmp=();
+
+	    # Process the file information lines that cpp inserts.
+		# (note that we don't currently do anything with the
+		# number cpp sometimes puts out after the filename -
+		# it's something to do with inclusion nesting levels)
+		if (/^# (\d+) "(.*)"( \d+)?/o) {
+			$LineNum = scalar $1;
+			my $CurFile=$2;
+			$CurFile=~s-\\\\-\\-go;
+			$CurFile=~s-\\\/-\\-go;
+			$CurFile=~s-\/\\-\\-go;
+			$CurFile=~s-\/\/-\\-go;
+			$CurFile=~s-\/-\\-go;
+			$CurFile=~s-(.:)--go;
+
+			$CurFile=&Path_AbsToWork($CurFile);
+			@Tmp=('#', $CurFile);
+			push @{$ArrayRef}, [ @Tmp ];
+			next;
+		}
+
+		# Process file data
+		push @Tmp, $LineNum;
+		# get rid of the space that cpp puts in most of the time after macro expansion (CPP help doesn't say exactly when!)
+		# don't upper case everything until you've done this.
+		
+		foreach $Macro (@Macros) {
+			s/\/ _____$Macro /\/$Macro/g;
+			s/_____$Macro /$Macro/g;
+			s/_____$Macro/$Macro/g;
+		}
+		if(/^macro/i)
+		{
+			#Parse and Store the mmp file statement by retaining double quotes
+			while (/("([^\t\n\r\f]+)"|([^ \t\n\r\f]+))/go) {
+			        my $Flag = $2 ? $2 : $3;
+				if($Flag =~ m/\\\"/) { 
+					$Flag =~ s/\"\\/\\/g;
+					$Flag =~ s/\""/\"/g;
+				}
+				push @Tmp, $Flag;
+			}
+		}
+		else
+		{
+			#Parse and Store the mmp file statement by removing double quotes
+			while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go) {
+				push @Tmp, $2 ? $2 : $3;
+			}
+		}
+		push @{$ArrayRef}, [ @Tmp ];
+		$LineNum++;
+	}		
+
+	if ($Mode{UpperCase}) {
+#		upper-case all the data
+		my $Line;
+		my $Item;
+		foreach $Line (@{$ArrayRef}) {
+			foreach $Item (@$Line) {
+				$Item=uc $Item;
+			}
+		}
+	}
+	close CPPPIPE or die $! ? "ERROR: Error closing $exe.exe pipe ($!)\n\t@CppCall\n"
+ 				: "ERROR: $exe.exe returned non-zero exit status ($?)\n\t@CppCall\n";
+}
+
+1;