summaryrefslogtreecommitdiff
path: root/tools/HPMHookGen
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2014-02-03 18:27:19 +0100
committerHaru <haru@dotalux.com>2014-02-03 18:27:19 +0100
commit35e1b99c2d1ecab5fa67b2033c87a90512b5d9aa (patch)
treed4c6744cdd5c79d79a3b14765f289c8d2a58fb10 /tools/HPMHookGen
parent42b5c048e3d97be93c71f81f84ff37c502f96163 (diff)
downloadhercules-35e1b99c2d1ecab5fa67b2033c87a90512b5d9aa.tar.gz
hercules-35e1b99c2d1ecab5fa67b2033c87a90512b5d9aa.tar.bz2
hercules-35e1b99c2d1ecab5fa67b2033c87a90512b5d9aa.tar.xz
hercules-35e1b99c2d1ecab5fa67b2033c87a90512b5d9aa.zip
Updated HPMHookGen with a HPMDataCheck generator
- It will be used by an upcoming commit by Ind. - Added dummy HPMDataCheck.h, to test the API bot's capability to re-generate it. - Improved XML parser performance. Signed-off-by: Haru <haru@dotalux.com>
Diffstat (limited to 'tools/HPMHookGen')
-rw-r--r--tools/HPMHookGen/HPMDataCheckGen.pl68
-rwxr-xr-xtools/HPMHookGen/HPMHookGen.pl6
-rw-r--r--tools/HPMHookGen/Makefile.in30
3 files changed, 93 insertions, 11 deletions
diff --git a/tools/HPMHookGen/HPMDataCheckGen.pl b/tools/HPMHookGen/HPMDataCheckGen.pl
new file mode 100644
index 000000000..1d4ed21b0
--- /dev/null
+++ b/tools/HPMHookGen/HPMDataCheckGen.pl
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+
+# Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+# See the LICENSE file
+
+use strict;
+use warnings;
+use XML::Simple;
+
+# XML Parser hint (some are faster than others)
+#local $ENV{XML_SIMPLE_PREFERRED_PARSER} = ''; # 0m14.181s
+local $ENV{XML_SIMPLE_PREFERRED_PARSER} = 'XML::Parser'; # 0m4.256s
+#local $ENV{XML_SIMPLE_PREFERRED_PARSER} = 'XML::SAX::Expat'; # 0m14.186s
+#local $ENV{XML_SIMPLE_PREFERRED_PARSER} = 'XML::LibXML::SAX'; # 0m7.055s
+
+my @files = grep { -f } grep { /[^h]\.xml/ } glob 'doxyoutput/xml/struct*.xml';
+my %out;
+
+foreach my $file (@files) {
+ my $xml = new XML::Simple;
+ my $data = $xml->XMLin($file);
+ next unless $data->{compounddef}->{includes}; # means its a struct from a .c file, plugins cant access those so we don't care.
+ next if $data->{compounddef}->{compoundname} =~ /::/; # its a duplicate with a :: name e.g. struct script_state {<...>} ay;
+ my @filepath = split(/[\/\\]/, $data->{compounddef}->{location}->{file});
+ my $foldername = uc($filepath[-2]);
+ my $filename = uc($filepath[-1]); $filename =~ s/-/_/g; $filename =~ s/\.[^.]*$//;
+ my $name = "_${foldername}_${filename}_H_";
+ push @{ $out{$name} }, $data->{compounddef}->{compoundname};
+}
+
+my $fname = '../../src/common/HPMDataCheck.h';
+open(FH, '>', $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.
+#ifndef _HPM_DATA_CHECK_H_
+#define _HPM_DATA_CHECK_H_
+
+
+const struct s_HPMDataCheck HPMDataCheck[] = {
+EOF
+
+foreach my $key (sort keys %out) {
+ print FH <<"EOF";
+ #ifdef $key
+EOF
+ foreach my $entry (@{ $out{$key} }) {
+ print FH <<"EOF"
+ { "$entry", sizeof(struct $entry) },
+EOF
+ }
+ print FH <<"EOF"
+ #else
+ #define $key
+ #endif // $key
+EOF
+}
+print FH <<"EOF";
+};
+unsigned int HPMDataCheckLen = ARRAYLENGTH(HPMDataCheck);
+
+#endif /* _HPM_DATA_CHECK_H_ */
+EOF
+close(FH);
diff --git a/tools/HPMHookGen/HPMHookGen.pl b/tools/HPMHookGen/HPMHookGen.pl
index eef490e29..b035687e2 100755
--- a/tools/HPMHookGen/HPMHookGen.pl
+++ b/tools/HPMHookGen/HPMHookGen.pl
@@ -7,6 +7,12 @@ use strict;
use warnings;
use XML::Simple;
+# XML Parser hint (some are faster than others)
+#local $ENV{XML_SIMPLE_PREFERRED_PARSER} = ''; # 0m7.138s
+local $ENV{XML_SIMPLE_PREFERRED_PARSER} = 'XML::Parser'; # 0m2.674s
+#local $ENV{XML_SIMPLE_PREFERRED_PARSER} = 'XML::SAX::Expat'; # 0m7.026s
+#local $ENV{XML_SIMPLE_PREFERRED_PARSER} = 'XML::LibXML::SAX'; # 0m4.152s
+
sub trim($) {
my $s = $_[0];
$s =~ s/^\s+//; $s =~ s/\s+$//;
diff --git a/tools/HPMHookGen/Makefile.in b/tools/HPMHookGen/Makefile.in
index c89228c7a..eb9cad8ff 100644
--- a/tools/HPMHookGen/Makefile.in
+++ b/tools/HPMHookGen/Makefile.in
@@ -1,18 +1,24 @@
@SET_MAKE@
-COMMON_C = $(wildcard ../../src/common/*.c)
-COMMON_H = $(wildcard ../../src/common/*.h)
-MAP_C = $(wildcard ../../src/map/*.c)
-MAP_H = $(wildcard ../../src/map/*.h)
-CHAR_C = $(wildcard ../../src/char/*.c)
-CHAR_H = $(wildcard ../../src/char/*.h)
-LOGIN_C = $(wildcard ../../src/login/*.c)
-LOGIN_H = $(wildcard ../../src/login/*.h)
+COMMON_D = ../../src/common
+MAP_D = ../../src/map
+CHAR_D = ../../src/char
+LOGIN_D = ../../src/login
+PLUGIN_D = ../../src/plugins
+COMMON_C = $(wildcard $(COMMON_D)/*.c)
+COMMON_H = $(filter-out $(COMMON_D)/HPMDataCheck.%,$(wildcard $(COMMON_D)/*.h))
+MAP_C = $(wildcard $(MAP_D)/*.c)
+MAP_H = $(wildcard $(MAP_D)/*.h)
+CHAR_C = $(wildcard $(CHAR_D)/*.c)
+CHAR_H = $(wildcard $(CHAR_D)/*.h)
+LOGIN_C = $(wildcard $(LOGIN_D)/*.c)
+LOGIN_H = $(wildcard $(LOGIN_D)/*.h)
ALL_C = $(COMMON_C) $(MAP_C) $(CHAR_C) $(LOGIN_C)
ALL_H = $(COMMON_H) $(MAP_H) $(CHAR_H) $(LOGIN_H)
-HOOK_INC = $(addprefix ../../src/plugins/HPMHooking., \
- $(addsuffix .inc, HookingPoints sources GetSymbol HPMHooksCore Hooks))
+HOOK_INC = $(addprefix $(PLUGIN_D)/HPMHooking., \
+ $(addsuffix .inc, HookingPoints sources GetSymbol HPMHooksCore Hooks)) \
+ $(COMMON_D)/HPMDataCheck.h
HAVE_DOXYGEN=@HAVE_DOXYGEN@
HAVE_PERL=@HAVE_PERL@
@@ -49,8 +55,10 @@ hooks: $(HOOK_INC)
$(HOOK_INC): generate
generate: doxyoutput
- @echo " Regenerating hook definitions..."
+ @echo " Regenerating HPM Hook definitions..."
@perl HPMHookGen.pl
+ @echo " Regenerating HPM Data Check definitions..."
+ @perl HPMDataCheckGen.pl
doxyoutput: $(ALL_C) $(ALL_H) doxygen.conf
@echo " Extracting functions information..."