summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/HPMHookGen/HPMDataCheckGen.pl25
-rwxr-xr-xtools/HPMHookGen/HPMHookGen.pl202
-rwxr-xr-xtools/validateinterfaces.py246
3 files changed, 371 insertions, 102 deletions
diff --git a/tools/HPMHookGen/HPMDataCheckGen.pl b/tools/HPMHookGen/HPMDataCheckGen.pl
index 7ec1ba7e4..06b58127a 100644
--- a/tools/HPMHookGen/HPMDataCheckGen.pl
+++ b/tools/HPMHookGen/HPMDataCheckGen.pl
@@ -13,19 +13,29 @@ 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 $HPMDataCheckAPIVer = 1;
+
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 $data = $xml->XMLin($file, ForceArray => 1);
+ my $filekey = (keys %{ $data->{compounddef} })[0];
+ next unless $data->{compounddef}->{$filekey}->{includes}; # means its a struct from a .c file, plugins cant access those so we don't care.
+ next if $data->{compounddef}->{$filekey}->{compoundname}->[0] =~ /::/; # its a duplicate with a :: name e.g. struct script_state {<...>} ay;
+ my @filepath = split(/[\/\\]/, $data->{compounddef}->{$filekey}->{location}->[0]->{file});
my $foldername = uc($filepath[-2]);
my $filename = uc($filepath[-1]); $filename =~ s/-/_/g; $filename =~ s/\.[^.]*$//;
+ my $plugintypes = 'SERVER_TYPE_UNKNOWN';
+ $plugintypes = 'SERVER_TYPE_ALL' if $foldername eq 'COMMON';
+ $plugintypes = "SERVER_TYPE_${foldername}" if $foldername =~ /^(LOGIN|CHAR|MAP)/;
+ my $symboldata = {
+ name => $data->{compounddef}->{$filekey}->{compoundname}->[0],
+ type => $plugintypes,
+ };
my $name = "${foldername}_${filename}_H";
- push @{ $out{$name} }, $data->{compounddef}->{compoundname};
+ push @{ $out{$name} }, $symboldata;
}
my $fname = '../../src/common/HPMDataCheck.h';
@@ -49,8 +59,10 @@ foreach my $key (sort keys %out) {
#ifdef $key
EOF
foreach my $entry (@{ $out{$key} }) {
+ my $entryname = $$entry{name};
+ my $entrytype = $$entry{type};
print FH <<"EOF"
- { "$entry", sizeof(struct $entry) },
+ { "$entryname", sizeof(struct $entryname), $entrytype },
EOF
}
print FH <<"EOF"
@@ -62,6 +74,7 @@ EOF
print FH <<"EOF";
};
HPExport unsigned int HPMDataCheckLen = ARRAYLENGTH(HPMDataCheck);
+HPExport int HPMDataCheckVer = $HPMDataCheckAPIVer;
#endif /* HPM_DATA_CHECK_H */
EOF
diff --git a/tools/HPMHookGen/HPMHookGen.pl b/tools/HPMHookGen/HPMHookGen.pl
index 3e2a11e5d..c11293d93 100755
--- a/tools/HPMHookGen/HPMHookGen.pl
+++ b/tools/HPMHookGen/HPMHookGen.pl
@@ -250,16 +250,22 @@ sub parse($$) {
my %key2original;
my @files = grep { -f } glob 'doxyoutput/xml/*interface*.xml';
my %ifs;
-my @keys;
+my %keys = (
+ login => [ ],
+ char => [ ],
+ map => [ ],
+);
foreach my $file (@files) { # Loop through the xml files
my $xml = new XML::Simple;
- my $data = $xml->XMLin($file);
+ my $data = $xml->XMLin($file, ForceArray => 1);
- my $loc = $data->{compounddef}->{location};
- next unless $loc->{file} =~ /src\/map\//; # We only handle mapserver for the time being
+ my $filekey = (keys %{ $data->{compounddef} })[0];
+ my $loc = $data->{compounddef}->{$filekey}->{location}->[0];
+ next unless $loc->{file} =~ /src\/(map|char|login)\//;
+ my $servertype = $1;
- my $key = $data->{compounddef}->{compoundname};
+ my $key = $data->{compounddef}->{$filekey}->{compoundname}->[0];
my $original = $key;
# Some known interfaces with different names
@@ -267,6 +273,8 @@ foreach my $file (@files) { # Loop through the xml files
$key = "bg";
} elsif ($key =~ /guild_storage/) {
$key = "gstorage";
+ } elsif ($key =~ /inter_homunculus/) { # to avoid replace to homun
+ $key = "inter_homunculus";
} elsif ($key =~ /homunculus/) {
$key = "homun";
} elsif ($key =~ /irc_bot/) {
@@ -275,23 +283,23 @@ foreach my $file (@files) { # Loop through the xml files
$key = "logs";
} elsif ($key =~ /pc_groups_interface/) {
$key = "pcg";
+ } elsif ($key =~ /char_interface/) {
+ $key = "chr";
} else {
$key =~ s/_interface//;
}
- foreach my $v ($data->{compounddef}->{sectiondef}) { # Loop through the sections
+ foreach my $v ($data->{compounddef}->{$filekey}->{sectiondef}->[0]) { # Loop through the sections
my $memberdef = $v->{memberdef};
- foreach my $fk (sort { # Sort the members in declaration order according to what the xml says
- my $astart = $memberdef->{$a}->{location}->{bodystart} || $memberdef->{$a}->{location}->{line};
- my $bstart = $memberdef->{$b}->{location}->{bodystart} || $memberdef->{$b}->{location}->{line};
+ foreach my $f (sort { # Sort the members in declaration order according to what the xml says
+ my $astart = $a->{location}->[0]->{bodystart} || $a->{location}->[0]->{line};
+ my $bstart = $b->{location}->[0]->{bodystart} || $b->{location}->[0]->{line};
$astart <=> $bstart
- } keys %$memberdef) { # Loop through the members
- my $f = $memberdef->{$fk};
-
- my $t = $f->{argsstring};
+ } @$memberdef) { # Loop through the members
+ my $t = $f->{argsstring}->[0];
next unless ref $t ne 'HASH' and $t =~ /^[^\[]/; # If it's not a string, or if it starts with an array subscript, we can skip it
- my $if = parse($t, $f->{definition});
+ my $if = parse($t, $f->{definition}->[0]);
next unless scalar keys %$if; # If it returns an empty hash reference, an error must've occurred
# Skip variadic functions, we only allow hooks on their arglist equivalents.
@@ -370,25 +378,27 @@ foreach my $file (@files) { # Loop through the xml files
push(@{ $ifs{$key} }, $if);
}
}
- push(@keys, $key) if $key2original{$key};
+ push(@{ $keys{$servertype} }, $key) if $key2original{$key};
}
-# Some interfaces use different names
-my %exportsymbols = map {
- $_ => &{ sub ($) {
- return 'battlegrounds' if $_ =~ /^bg$/;
- return 'pc_groups' if $_ =~ /^pcg$/;
- return $_;
- }}($_);
-} @keys;
-
-my ($maxlen, $idx) = (0, 0);
-my $fname;
-$fname = "../../src/plugins/HPMHooking/HPMHooking.HookingPoints.inc";
-open(FH, ">", $fname)
- or die "cannot open > $fname: $!";
-
-print FH <<"EOF";
+foreach my $servertype (keys %keys) {
+ my $keysref = $keys{$servertype};
+ # 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 $_;
+ }}($_);
+ } @$keysref;
+
+ my ($maxlen, $idx) = (0, 0);
+ my $fname;
+ $fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.HookingPoints.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
//
@@ -398,30 +408,30 @@ print FH <<"EOF";
struct HookingPointData HookingPoints[] = {
EOF
-foreach my $key (@keys) {
- print FH "/* ".$key." */\n";
- foreach my $if (@{ $ifs{$key} }) {
+ foreach my $key (@$keysref) {
+ print FH "/* ".$key." */\n";
+ foreach my $if (@{ $ifs{$key} }) {
- print FH <<"EOF";
+ print FH <<"EOF";
{ HP_POP($key\->$if->{name}, $if->{hname}) },
EOF
- $idx += 2;
- $maxlen = length($key."->".$if->{name}) if( length($key."->".$if->{name}) > $maxlen )
+ $idx += 2;
+ $maxlen = length($key."->".$if->{name}) if( length($key."->".$if->{name}) > $maxlen )
+ }
}
-}
-print FH <<"EOF";
+ print FH <<"EOF";
};
int HookingPointsLenMax = $maxlen;
EOF
-close FH;
+ close FH;
-$fname = "../../src/plugins/HPMHooking/HPMHooking.sources.inc";
-open(FH, ">", $fname)
- or die "cannot open > $fname: $!";
+ $fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.sources.inc";
+ open(FH, ">", $fname)
+ or die "cannot open > $fname: $!";
-print FH <<"EOF";
+ print FH <<"EOF";
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
//
@@ -429,19 +439,19 @@ print FH <<"EOF";
// as it will get overwritten.
EOF
-foreach my $key (@keys) {
+ foreach my $key (@$keysref) {
- print FH <<"EOF";
+ print FH <<"EOF";
memcpy(&HPMHooks.source.$key, $key, sizeof(struct $key2original{$key}));
EOF
-}
-close FH;
+ }
+ close FH;
-$fname = "../../src/plugins/HPMHooking/HPMHooking.GetSymbol.inc";
-open(FH, ">", $fname)
- or die "cannot open > $fname: $!";
+ $fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.GetSymbol.inc";
+ open(FH, ">", $fname)
+ or die "cannot open > $fname: $!";
-print FH <<"EOF";
+ print FH <<"EOF";
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
//
@@ -449,19 +459,19 @@ print FH <<"EOF";
// as it will get overwritten.
EOF
-foreach my $key (@keys) {
+ foreach my $key (@$keysref) {
- print FH <<"EOF";
+ print FH <<"EOF";
if( !($key = GET_SYMBOL("$exportsymbols{$key}") ) ) return false;
EOF
-}
-close FH;
+ }
+ close FH;
-$fname = "../../src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc";
-open(FH, ">", $fname)
- or die "cannot open > $fname: $!";
+ $fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.HPMHooksCore.inc";
+ open(FH, ">", $fname)
+ or die "cannot open > $fname: $!";
-print FH <<"EOF";
+ print FH <<"EOF";
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
//
@@ -471,53 +481,53 @@ print FH <<"EOF";
struct {
EOF
-foreach my $key (@keys) {
- foreach my $if (@{ $ifs{$key} }) {
+ foreach my $key (@$keysref) {
+ foreach my $if (@{ $ifs{$key} }) {
- print FH <<"EOF";
+ print FH <<"EOF";
struct HPMHookPoint *$if->{hname}_pre;
struct HPMHookPoint *$if->{hname}_post;
EOF
+ }
}
-}
-print FH <<"EOF";
+ print FH <<"EOF";
} list;
struct {
EOF
-foreach my $key (@keys) {
- foreach my $if (@{ $ifs{$key} }) {
+ foreach my $key (@$keysref) {
+ foreach my $if (@{ $ifs{$key} }) {
- print FH <<"EOF";
+ print FH <<"EOF";
int $if->{hname}_pre;
int $if->{hname}_post;
EOF
+ }
}
-}
-print FH <<"EOF";
+ print FH <<"EOF";
} count;
struct {
EOF
-foreach my $key (@keys) {
+ foreach my $key (@$keysref) {
- print FH <<"EOF";
+ print FH <<"EOF";
struct $key2original{$key} $key;
EOF
-}
+ }
-print FH <<"EOF";
+ print FH <<"EOF";
} source;
EOF
-close FH;
+ close FH;
-$fname = "../../src/plugins/HPMHooking/HPMHooking.Hooks.inc";
-open(FH, ">", $fname)
- or die "cannot open > $fname: $!";
+ $fname = "../../src/plugins/HPMHooking/HPMHooking_${servertype}.Hooks.inc";
+ open(FH, ">", $fname)
+ or die "cannot open > $fname: $!";
-print FH <<"EOF";
+ print FH <<"EOF";
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
//
@@ -525,27 +535,27 @@ print FH <<"EOF";
// as it will get overwritten.
EOF
-foreach my $key (@keys) {
+ foreach my $key (@$keysref) {
- print FH <<"EOF";
+ print FH <<"EOF";
/* $key */
EOF
- foreach my $if (@{ $ifs{$key} }) {
- my ($initialization, $beforeblock3, $beforeblock2, $afterblock3, $afterblock2, $retval) = ('', '', '', '', '', '');
+ foreach my $if (@{ $ifs{$key} }) {
+ my ($initialization, $beforeblock3, $beforeblock2, $afterblock3, $afterblock2, $retval) = ('', '', '', '', '', '');
- unless ($if->{type} eq 'void') {
- $initialization = "\n\t$if->{type} retVal___$if->{typeinit};";
- $initialization .= "\n\tmemset(&retVal___, '\\0', sizeof($if->{type}));" if $if->{memset};
- }
+ unless ($if->{type} eq 'void') {
+ $initialization = "\n\t$if->{type} retVal___$if->{typeinit};";
+ $initialization .= "\n\tmemset(&retVal___, '\\0', sizeof($if->{type}));" if $if->{memset};
+ }
- $beforeblock3 .= "\n\t\t\t$_" foreach (@{ $if->{before} });
- $afterblock3 .= "\n\t\t\t$_" foreach (@{ $if->{after} });
- $beforeblock2 .= "\n\t\t$_" foreach (@{ $if->{before} });
- $afterblock2 .= "\n\t\t$_" foreach (@{ $if->{after} });
- $retval = ' retVal___' unless $if->{type} eq 'void';
+ $beforeblock3 .= "\n\t\t\t$_" foreach (@{ $if->{before} });
+ $afterblock3 .= "\n\t\t\t$_" foreach (@{ $if->{after} });
+ $beforeblock2 .= "\n\t\t$_" foreach (@{ $if->{before} });
+ $afterblock2 .= "\n\t\t$_" foreach (@{ $if->{after} });
+ $retval = ' retVal___' unless $if->{type} eq 'void';
- print FH <<"EOF";
+ print FH <<"EOF";
$if->{handlerdef} {$if->{notes}
int hIndex = 0;${initialization}
if( HPMHooks.count.$if->{hname}_pre ) {
@@ -573,8 +583,8 @@ $if->{handlerdef} {$if->{notes}
return$retval;
}
EOF
+ }
}
-}
-
-close FH;
+ close FH;
+}
diff --git a/tools/validateinterfaces.py b/tools/validateinterfaces.py
new file mode 100755
index 000000000..87ff46a85
--- /dev/null
+++ b/tools/validateinterfaces.py
@@ -0,0 +1,246 @@
+#! /usr/bin/env python
+# -*- coding: utf8 -*-
+#
+# Copyright (C) 2014 Andrei Karas (4144)
+
+import os
+import re
+import sys
+from sets import Set
+
+interfaceRe = re.compile("struct (?P<name1>[a-z_]+)_interface (?P<name2>[a-z_]+)_s;")
+
+class Tracker:
+ pass
+
+def searchDefault(r, ifname):
+ defaultStr = "void {0}_defaults(void)".format(ifname);
+ for line in r:
+ if line.find(defaultStr) == 0:
+ return True
+ return False
+
+def searchStructStart(r, ifname):
+ for line in r:
+ if line.find("struct {0}_interface".format(ifname)) == 0:
+ return True
+ return False
+
+def readCFile(tracker, cFile):
+ methods = Set()
+ shortIfName = ""
+ with open(cFile, "r") as r:
+ for line in r:
+# print "cline1: " + line
+ m = interfaceRe.search(line)
+ if m != None and m.group("name1") == m.group("name2"):
+ # found C file with interface
+ ifname = m.group("name1")
+ if searchDefault(r, ifname) == False:
+ return (None, shortIfName, methods)
+ lineRe = re.compile("(?P<ifname>[a-z_]+)->(?P<method>[\w_]+)[ ][=][ ](?P<fullmethod>[^;]+);")
+ for line in r:
+# print "cline2: " + line
+ test = line.strip()
+ if len(test) > 2 and test[0:2] == "//":
+ continue
+ if len(line) > 0 and line[0] == "}":
+ break
+ m = lineRe.search(line)
+ if m != None:
+ tmp = m.group("ifname")
+ if len(tmp) < 2 or tmp[0] != ifname[0]:
+ continue
+ if shortIfName == "":
+ shortIfName = m.group("ifname")
+# print "{2}: add {0}, from: {1}".format(m.group("method"), line, ifname)
+ methods.add(m.group("method"))
+ tracker.interfaces.add(ifname);
+ tracker.fullmethods.add(m.group("fullmethod"));
+ return (ifname, shortIfName, methods)
+ return (None, shortIfName, methods)
+
+def readHFile(tracker, hFile, ifname):
+ methods = Set()
+ with open(hFile, "r") as r:
+ if searchStructStart(r, ifname) == False:
+ return methods
+ lineRe = re.compile("[(][*](?P<method>[^)]+)[)]".format(ifname))
+ for line in r:
+# print "hline: " + line
+ test = line.strip()
+ if len(test) > 2 and test[0:2] == "//":
+ continue
+ if len(line) > 0 and line[0] == "}":
+ break
+ m = lineRe.search(line)
+ if m != None:
+# print "{2}: add {0}, from: {1}".format(m.group("method"), line, ifname)
+ methods.add(m.group("method"))
+ tracker.fullmethods.add(ifname + "_" + m.group("method"))
+ return methods
+
+def checkIfFile(tracker, cFile, hFile):
+ data = readCFile(tracker, cFile)
+ cMethods = data[2]
+ ifname = data[0]
+ shortIfName = data[1]
+ if len(cMethods) > 0:
+ hMethods = readHFile(tracker, hFile, ifname)
+ for method in hMethods:
+ tracker.arr[ifname + "_" + method] = list()
+ tracker.methods.add(ifname + "_" + method)
+ if method not in cMethods:
+ print "Missing initialisation in file {0}: {1}".format(cFile, method)
+ tracker.retCode = 1
+# for method in cMethods:
+# if method not in hMethods:
+# print "Extra method in file {0}: {1}".format(cFile, method)
+
+def processIfDir(tracker, srcDir):
+ files = os.listdir(srcDir)
+ for file1 in files:
+ if file1[0] == '.' or file1 == "..":
+ continue
+ cPath = os.path.abspath(srcDir + os.path.sep + file1)
+ if not os.path.isfile(cPath):
+ processIfDir(tracker, cPath)
+ else:
+ if file1[-2:] == ".c":
+ file2 = file1[:-2] + ".h"
+ hPath = srcDir + os.path.sep + file2;
+ if os.path.exists(hPath) and os.path.isfile(hPath):
+ checkIfFile(tracker, cPath, hPath)
+
+
+def checkChr(ch):
+ if (ch >= "a" and ch <= "z") or ch == "_" or (ch >= "0" and ch <= "9" or ch == "\"" or ch == ">"):
+ return True
+ return False
+
+def checkFile(tracker, cFile):
+# print "Checking: " + cFile
+ with open(cFile, "r") as r:
+ for line in r:
+ parts = re.findall(r'[\w_]+', line)
+ for part in parts:
+ if part in tracker.methods:
+ idx = line.find(part)
+ if idx > 0:
+ if idx + len(part) >= len(line):
+ continue
+ if checkChr(line[idx + len(part)]):
+ continue
+ if checkChr(line[idx - 1]):
+ continue
+ if line[0:3] == " * ":
+ continue;
+ if line[-1] == "\n":
+ line = line[:-1]
+ text = line.strip()
+ if text[0:2] == "/*" or text[0:2] == "//":
+ continue
+ idx2 = line.find("//")
+ if idx2 > 0 and idx2 < idx:
+ continue
+ tracker.arr[part].append(line)
+
+def processDir(tracker, srcDir):
+ files = os.listdir(srcDir)
+ for file1 in files:
+ if file1[0] == '.' or file1 == "..":
+ continue
+ cPath = os.path.abspath(srcDir + os.path.sep + file1)
+ if not os.path.isfile(cPath):
+ processDir(tracker, cPath)
+ elif file1[-2:] == ".c" or file1[-2:] == ".h":
+# elif file1[-2:] == ".c":
+ checkFile(tracker, cPath)
+
+def reportMethods(tracker):
+ print "\n"
+ for method in tracker.methods:
+ if len(tracker.arr[method]) > 2:
+ print method
+ for t in tracker.arr[method]:
+ print t
+ print "\n"
+
+
+def checkLostFile(tracker, cFile):
+# print "Checking: " + cFile
+ methodRe = re.compile("^([\w0-9* _]*)([ ]|[*])(?P<ifname>[a-z_]+)_(?P<method>[\w_]+)(|[ ])[(]")
+ with open(cFile, "r") as r:
+ for line in r:
+ if line.find("(") < 1 or len(line) < 3 or line[0] == "\t" or line[0] == " " or line.find("_defaults") > 0:
+ continue
+ m = methodRe.search(line)
+ if m != None:
+ name = "{0}_{1}".format(m.group("ifname"), m.group("method"))
+ if name[:name.find("_")] not in tracker.interfaces and m.group("ifname") not in tracker.interfaces:
+ continue
+ if name not in tracker.fullmethods:
+# print "src : " + line
+ print name
+
+def processLostDir(tracker, srcDir):
+ files = os.listdir(srcDir)
+ for file1 in files:
+ if file1[0] == '.' or file1 == "..":
+ continue
+ cPath = os.path.abspath(srcDir + os.path.sep + file1)
+ if not os.path.isfile(cPath):
+ processLostDir(tracker, cPath)
+ elif file1[-2:] == ".c":
+ checkLostFile(tracker, cPath)
+
+def runIf():
+ processIfDir(tracker, "../src/char");
+ processIfDir(tracker, "../src/map");
+ processIfDir(tracker, "../src/login");
+ processIfDir(tracker, "../src/common");
+
+def runLost():
+ processLostDir(tracker, "../src/char");
+ processLostDir(tracker, "../src/map");
+ processLostDir(tracker, "../src/login");
+ processLostDir(tracker, "../src/common");
+
+def runLong():
+ processDir(tracker, "../src/char");
+ processDir(tracker, "../src/map");
+ processDir(tracker, "../src/login");
+ processDir(tracker, "../src/common");
+ reportMethods(tracker)
+
+tracker = Tracker()
+tracker.arr = dict()
+tracker.methods = Set()
+tracker.fullmethods = Set()
+tracker.interfaces = Set()
+tracker.retCode = 0
+
+if len(sys.argv) > 1:
+ cmd = sys.argv[1]
+else:
+ cmd = "default"
+
+if cmd == "silent":
+ runIf()
+elif cmd == "init":
+ print "Checking interfaces initialisation"
+ runIf()
+elif cmd == "lost":
+ print "Checking not added functions to interfaces"
+ runLost();
+elif cmd == "long":
+ print "Checking interfaces usage"
+ runLong();
+else:
+ print "Checking interfaces initialisation"
+ runIf()
+ print "Checking not added functions to interfaces"
+ runLost();
+ print "Checking interfaces usage"
+ runLong();
+exit(tracker.retCode)