#!/bin/perl -w
# 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 "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:
# Generates the egl_stubs.h header file and the eglswitchu.def
# file from the libeglu def file.
#
#
use strict;
my $COPYRIGHT = "" .
"// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n" .
"// All rights reserved.\n" .
"// This component and the accompanying materials are made available\n" .
"// under the terms of the License \"Eclipse Public License v1.0\"\n" .
"// which accompanies this distribution, and is available\n" .
"// at the URL \"http://www.eclipse.org/legal/epl-v10.html\".\n" .
"//\n" .
"// Initial Contributors:\n" .
"// Nokia Corporation - initial contribution.\n" .
"//\n" .
"// Contributors:\n" .
"//\n" .
"// Description:\n";
my $EGL_DEF;
my $EGLSWITCH_HEADER = "egl_stubs.h";
my $EGLSWITCH_DEF = "../BWINS/eglswitchu.def";
my $SOURCE_DEF_SIZE = 0;
&main();
exit(0);
sub main() {
if (@ARGV == 0) {
printf "Usage: generate_stubs.pl <EGL DEF file>\n";
printf "e.g. generate_stubs.pl /epoc32/include/def/win32/libegl14u.def\n";
return 0;
}
$EGL_DEF = $ARGV[0];
my $maxOrdinal = 1;
open DEF, $EGL_DEF or
die "Cannot open $EGL_DEF\n";
my ($dev, $ino, $mode, $nlink, $uid, $gid,
$rdev, $size, $atime, $mtime, $ctime,
$blksize, $blocks)
= stat($EGL_DEF);
# the file size could be checked by the switcher build to verify that the stub is up to date.
$SOURCE_DEF_SIZE= $size;
open HEADER_OUT, ">${EGLSWITCH_HEADER}" or
die "Cannot create $EGLSWITCH_HEADER\n";
open DEF_OUT, ">${EGLSWITCH_DEF}" or
die "Cannot create $EGLSWITCH_DEF\n";
&printHeaderStart(\*HEADER_OUT);
&printDefStart(\*DEF_OUT);
while (<DEF>) {
chomp;
if (/@/) {
if (s/.*;/;/) {
&printDefEntry(\*DEF_OUT, $maxOrdinal, $_);
&printHeaderEntry(\*HEADER_OUT,$maxOrdinal,$_);
} else {
&printDefEntry(\*DEF_OUT, $maxOrdinal, "");
&printHeaderEntry(\*HEADER_OUT,$maxOrdinal, "(noname)");
}
$maxOrdinal++;
}
}
&printHeaderEnd(\*HEADER_OUT,$maxOrdinal);
&printDefEnd(\*DEF_OUT);
close DEF;
close HEADER_OUT;
close DEF_OUT;
}
sub printDefStart(\$) {
my ($fh) = @_;
print $fh "EXPORTS\n";
}
sub printDefEntry(\$\$\$) {
my ($fh, $ordinal, $comment) = @_;
print $fh "\tcall_vector_${ordinal} @ ${ordinal} NONAME $comment\n";
}
sub printDefEnd(\$) {
my ($fh) = @_;
print $fh "\n";
}
sub printHeaderStart(\$) {
my ($fh) = @_;
print $fh "$COPYRIGHT\n".
"// Generated from \"$EGL_DEF\" file size: $SOURCE_DEF_SIZE\n" .
"\n" .
"extern \"C\" {\n" .
"void common_dispatch();\n" .
"\n";
}
sub printHeaderEntry(\$\$\$) {
my ($fh, $ordinal, $comment) = @_;
print $fh "__declspec(dllexport)\n" .
"__declspec(naked)\n" .
"void call_vector_${ordinal} ()\n" .
"\t{\n" .
"\t// ${comment}\n" .
"\t_asm mov eax, $ordinal\n" .
"\t_asm jmp common_dispatch\n" .
"\t}\n\n";
}
sub printHeaderEnd(\$\$) {
my ($fh, $maxOrdinal) = @_;
print $fh "}\n" .
"#define MAX_ORDINAL $maxOrdinal\n\n";
}