From 35e1b99c2d1ecab5fa67b2033c87a90512b5d9aa Mon Sep 17 00:00:00 2001 From: Haru Date: Mon, 3 Feb 2014 18:27:19 +0100 Subject: 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 --- tools/HPMHookGen/HPMDataCheckGen.pl | 68 +++++++++++++++++++++++++++++++++++++ tools/HPMHookGen/HPMHookGen.pl | 6 ++++ tools/HPMHookGen/Makefile.in | 30 ++++++++++------ 3 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 tools/HPMHookGen/HPMDataCheckGen.pl (limited to 'tools') 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..." -- cgit v1.2.3-70-g09d2