summaryrefslogtreecommitdiff
path: root/tools/HPMHookGen/HPMDataCheckGen.pl
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/HPMDataCheckGen.pl
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/HPMDataCheckGen.pl')
-rw-r--r--tools/HPMHookGen/HPMDataCheckGen.pl68
1 files changed, 68 insertions, 0 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);