summaryrefslogtreecommitdiff
path: root/tools/HPMHookGen
diff options
context:
space:
mode:
Diffstat (limited to 'tools/HPMHookGen')
-rw-r--r--tools/HPMHookGen/HPMDataCheckGen.pl3
-rwxr-xr-xtools/HPMHookGen/HPMHookGen.pl91
-rw-r--r--tools/HPMHookGen/doxygen.conf2
3 files changed, 69 insertions, 27 deletions
diff --git a/tools/HPMHookGen/HPMDataCheckGen.pl b/tools/HPMHookGen/HPMDataCheckGen.pl
index 0e5f628cd..791d6cf6b 100644
--- a/tools/HPMHookGen/HPMDataCheckGen.pl
+++ b/tools/HPMHookGen/HPMDataCheckGen.pl
@@ -51,6 +51,9 @@ print FH <<"EOF";
#ifndef HPM_DATA_CHECK_H
#define HPM_DATA_CHECK_H
+#if !defined(HERCULES_CORE) && !defined(HPMHOOKGEN)
+#include "common/HPMSymbols.inc.h"
+#endif // ! HERCULES_CORE && ! HPMHOOKGEN
HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
EOF
diff --git a/tools/HPMHookGen/HPMHookGen.pl b/tools/HPMHookGen/HPMHookGen.pl
index 0b1df8388..d1b96efb3 100755
--- a/tools/HPMHookGen/HPMHookGen.pl
+++ b/tools/HPMHookGen/HPMHookGen.pl
@@ -264,8 +264,9 @@ my %keys = (
login => [ ],
char => [ ],
map => [ ],
- common => [ ],
+ all => [ ],
);
+my %fileguards = ( );
foreach my $file (@files) { # Loop through the xml files
my $xml = new XML::Simple;
@@ -279,22 +280,28 @@ foreach my $file (@files) { # Loop through the xml files
my $key = $data->{compounddef}->{$filekey}->{compoundname}->[0];
my $original = $key;
my @servertypes = ();
+ my $servermask = 'SERVER_TYPE_NONE';
if ($servertype ne "common") {
push @servertypes, $1;
+ $servermask = 'SERVER_TYPE_' . uc($1);
} elsif ($key eq "mapindex_interface") {
push @servertypes, ("map", "char"); # Currently not used by the login server
+ $servermask = 'SERVER_TYPE_MAP|SERVER_TYPE_CHAR';
} else {
push @servertypes, ("map", "char", "login");
+ $servermask = 'SERVER_TYPE_ALL';
}
+ my @filepath = split(/[\/\\]/, $loc->{file});
+ my $foldername = uc($filepath[-2]);
+ my $filename = uc($filepath[-1]); $filename =~ s/-/_/g; $filename =~ s/\.[^.]*$//;
+ my $guardname = "${foldername}_${filename}_H";
# Some known interfaces with different names
if ($key =~ /battleground/) {
$key = "bg";
} elsif ($key =~ /guild_storage/) {
$key = "gstorage";
- } elsif ($key =~ /inter_homunculus/) { # to avoid replace to homun
- $key = "inter_homunculus";
- } elsif ($key =~ /homunculus/) {
+ } elsif ($key eq "homunculus_interface") {
$key = "homun";
} elsif ($key eq "irc_bot_interface") {
$key = "ircbot";
@@ -416,6 +423,11 @@ foreach my $file (@files) { # Loop through the xml files
foreach $servertype (@servertypes) {
push(@{ $keys{$servertype} }, $key) if $key2original{$key};
}
+ push(@{ $keys{all} }, $key) if $key2original{$key};
+ $fileguards{$key} = {
+ guard => $guardname,
+ type => $servermask,
+ };
}
foreach my $servertype (keys %keys) {
@@ -423,14 +435,61 @@ foreach my $servertype (keys %keys) {
# Some interfaces use different names
my %exportsymbols = map {
$_ => &{ sub ($) {
- return 'battlegrounds' if $servertype eq 'map' and $_ =~ /^bg$/;
- return 'pc_groups' if $servertype eq 'map' and $_ =~ /^pcg$/;
+ return 'battlegrounds' if $_ =~ /^bg$/;
+ return 'pc_groups' if $_ =~ /^pcg$/;
return $_;
}}($_);
} @$keysref;
my ($maxlen, $idx) = (0, 0);
my $fname;
+
+ if ($servertype eq 'all') {
+ $fname = "../../src/common/HPMSymbols.inc.h";
+ open(FH, ">", $fname)
+ or die "cannot open > $fname: $!";
+
+ print FH <<"EOF";
+// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+// See the LICENSE file
+//
+// NOTE: This file was auto-generated and should never be manually edited,
+// as it will get overwritten.
+
+#if !defined(HERCULES_CORE)
+EOF
+
+ foreach my $key (@$keysref) {
+ print FH <<"EOF";
+#ifdef $fileguards{$key}->{guard} /* $key */
+struct $key2original{$key} *$key;
+#endif // $fileguards{$key}->{guard}
+EOF
+ }
+
+ print FH <<"EOF";
+#endif // ! HERCULES_CORE
+
+HPExport const char *HPM_shared_symbols(int server_type)
+{
+EOF
+
+ foreach my $key (@$keysref) {
+ print FH <<"EOF";
+#ifdef $fileguards{$key}->{guard} /* $key */
+if ((server_type&($fileguards{$key}->{type})) && !HPM_SYMBOL("$exportsymbols{$key}", $key)) return "$exportsymbols{$key}";
+#endif // $fileguards{$key}->{guard}
+EOF
+ }
+
+ print FH <<"EOF";
+ return NULL;
+}
+EOF
+ close FH;
+ next;
+ }
+
$fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.HookingPoints.inc";
open(FH, ">", $fname)
or die "cannot open > $fname: $!";
@@ -484,26 +543,6 @@ EOF
}
close FH;
- $fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.GetSymbol.inc";
- open(FH, ">", $fname)
- or die "cannot open > $fname: $!";
-
- print FH <<"EOF";
-// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
-// See the LICENSE file
-//
-// NOTE: This file was auto-generated and should never be manually edited,
-// as it will get overwritten.
-
-EOF
- foreach my $key (@$keysref) {
-
- print FH <<"EOF";
-if( !($key = GET_SYMBOL("$exportsymbols{$key}") ) ) return "$exportsymbols{$key}";
-EOF
- }
- close FH;
-
$fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.HPMHooksCore.inc";
open(FH, ">", $fname)
or die "cannot open > $fname: $!";
diff --git a/tools/HPMHookGen/doxygen.conf b/tools/HPMHookGen/doxygen.conf
index 3a848abe4..66c1d6158 100644
--- a/tools/HPMHookGen/doxygen.conf
+++ b/tools/HPMHookGen/doxygen.conf
@@ -178,7 +178,7 @@ EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
-PREDEFINED = __attribute__(x)=
+PREDEFINED = __attribute__(x)= HPMHOOKGEN
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = NO
TAGFILES =