sbsv1/abld/e32util/genshimsrc.bat
changeset 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/genshimsrc.bat	Fri Jun 25 17:29:25 2010 +0800
@@ -0,0 +1,207 @@
+@REM Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM
+
+@goto invoke
+
+#!perl
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+use Cwd;
+
+$_ = cwd;
+tr/\//\\/;
+my $Pwd = $_;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+# establish the path to the Perl binaries
+BEGIN {
+	require 5.005_03;				# check user has a version of perl that will cope
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+	$PerlLibPath .= "\\";
+}
+use lib $PerlLibPath;
+
+use Defutl;
+use Genutl;
+
+my %opts = ();
+
+my $result = GetOptions(\%opts,
+			"srcpath:s",
+			"defpath:s",
+			"name:s",
+			"version:s",
+			"alignstack",
+			"help",
+		       );
+
+Usage() if(!$result || $opts{'help'} || @ARGV < 1);
+
+my $srcPath = $opts{"srcpath"} || $Pwd;
+my $defPath = $opts{"defpath"} || $srcPath;
+my $outputName = $opts{"name"} || "shim";
+my %Version;
+if ($opts{version}) {
+	%Version = &Genutl_StringToVersion($opts{version}) or die "Bad version number\n";
+} else {
+	$Version{major} = 0;
+	$Version{minor} = 0;
+}
+
+my $infile = pop @ARGV;
+
+my @DefData;
+eval { &Def_ReadFileL(\@DefData, $infile); } ;
+die $@ if $@;
+
+sub WriteFunction($$$) {
+  my ($ordinal, $branchTarget, $comment) = @_;
+  my $fnName = "export_at_ordinal_$ordinal";
+  if ($branchTarget =~ /^\"(.*)\"$/) {
+	  $branchTarget = $1;
+	}
+  if ($comment =~ /(null)/) {
+    $comment = $branchTarget;
+  }
+
+  print CPP <<FUNCTION_DEFINITION;
+
+EXPORT_C __NAKED__ int $fnName()
+//
+// $comment
+//
+	{
+	asm("B $branchTarget ");
+	}
+
+FUNCTION_DEFINITION
+}
+
+sub WriteFunctionAligned($$$) {
+  my ($ordinal, $branchTarget, $comment) = @_;
+  my $fnName = "export_at_ordinal_$ordinal";
+  if ($branchTarget =~ /^\"(.*)\"$/) {
+	  $branchTarget = $1;
+	}
+  if ($comment =~ /(null)/) {
+    $comment = $branchTarget;
+  }
+
+  print CPP <<FUNCTION_DEFINITION2;
+
+EXPORT_C __NAKED__ int $fnName()
+//
+// $comment
+//
+	{
+	asm("stmfd sp!, {r4,lr} ");
+	asm("mov r4, sp ");
+	asm("bic sp, sp, #4 ");
+	asm("bl $branchTarget ");
+	asm("mov sp, r4 ");
+	asm("ldmfd sp!, {r4,pc} ");
+	}
+
+FUNCTION_DEFINITION2
+}
+
+sub WriteCppHeader($) {
+  my ($filename) = @_;
+  print CPP <<FILE_HEADER;
+//
+// $filename - generated by GENSHIMSRC.BAT
+//
+
+#include <e32def.h>
+#include <e32const.h>
+#include <cpudefs.h>
+
+FILE_HEADER
+}
+
+sub WriteExport($$$) {
+  my ($ordinal, $export, $comment) = @_;
+
+  if ($comment =~ /(null)/) {
+    $comment = $export;
+  }
+  printf DEF "\t${export}=export_at_ordinal_${ordinal}__Fv \@ $ordinal NONAME \; $comment\n";
+}
+
+my $cppFile = "$srcPath\\$outputName\.cia";
+die "ERROR: Couldn't open $cppFile\n" unless open CPP, ">$cppFile";
+my $vstring = &Genutl_VersionToFileAugment(%Version);
+my $defFile = "$defPath\\${outputName}$vstring\.def";
+die "ERROR: Couldn't open $defFile\n" unless open DEF, ">$defFile";
+
+WriteCppHeader(uc "${outputName}.cia");
+printf DEF "EXPORTS\n";
+
+foreach my $defData (@DefData){
+  my $ord = $$defData{Ordinal};
+  if ($ord) {
+	my $name = $$defData{Name};
+	my $comment = $$defData{Comment};
+	if ($opts{alignstack}) {
+		WriteFunctionAligned($ord, $name, $comment);
+	} else {
+		WriteFunction($ord, $name, $comment);
+	}
+	WriteExport($ord, $name, $comment);
+  }
+}
+
+close CPP;
+close DEF;
+
+#####################################################################
+sub Usage
+{
+	print <<EOT;
+
+genshimsrc
+
+	Generate source for a shim DLL and its associated deffile from a supplied deffile
+
+Usage:
+	genshimsrc [options] deffile
+
+Where:
+	[deffile]     The source deffile
+
+Options:
+	--srcpath         the path for the output source file (defaults to CWD)
+	--defpath         the path for the output DEF file (defaults to srcpath)
+	--name            the name to use for the output files (defaults to shim)
+	--version         the version to use for the output DEF file (defaults to 0.0)
+	--alignstack      use shims which align the stack to an 8 byte boundary
+EOT
+	exit 1;
+}
+
+1;
+
+__END__
+
+# Tell emacs that this is a perl script even 'though it has a .bat extension
+# Local Variables:
+# mode:perl
+# tab-width:4
+# End:
+
+:invoke
+@perl -x -S genshimsrc.bat %1 %2 %3 %4 %5 %6 %7 %8 %9