Skip to content

Commit

Permalink
Updated HPMHookGen with a HPMDataCheck generator
Browse files Browse the repository at this point in the history
- 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>
  • Loading branch information
MishimaHaruna committed Feb 3, 2014
1 parent 42b5c04 commit 35e1b99
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 11 deletions.
17 changes: 17 additions & 0 deletions src/common/HPMDataCheck.h
@@ -0,0 +1,17 @@
// 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[] = {
/** PLACEHOLDER - Testing HerculesWS API Bot **/
{ "foo", 0 },
};
unsigned int HPMDataCheckLen = ARRAYLENGTH(HPMDataCheck);

#endif /* _HPM_DATA_CHECK_H_ */
68 changes: 68 additions & 0 deletions 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);
6 changes: 6 additions & 0 deletions tools/HPMHookGen/HPMHookGen.pl
Expand Up @@ -7,6 +7,12 @@
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+$//;
Expand Down
30 changes: 19 additions & 11 deletions 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@
Expand Down Expand Up @@ -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..."
Expand Down

0 comments on commit 35e1b99

Please sign in to comment.