aboutsummaryrefslogtreecommitdiff
path: root/Scripting/Perl/MakeSysTraps.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Scripting/Perl/MakeSysTraps.pl')
-rw-r--r--Scripting/Perl/MakeSysTraps.pl88
1 files changed, 88 insertions, 0 deletions
diff --git a/Scripting/Perl/MakeSysTraps.pl b/Scripting/Perl/MakeSysTraps.pl
new file mode 100644
index 0000000..a70029f
--- /dev/null
+++ b/Scripting/Perl/MakeSysTraps.pl
@@ -0,0 +1,88 @@
+#Usage for #define format is `perl MakeSysTraps.pl -d /path/to/systrap.h'.
+
+use strict;
+
+if (@ARGV == 0)
+{
+ print <<EOF;
+Usage: $0 [-cds] file...
+Generates an annotated list of systraps from the named files.
+ <default> Produces output suitable for the build-prc data file.
+ -s Produces an asm include file.
+ -d Produces a bunch of #defines.
+ -c Produces a list of Perl constants.
+EOF
+ exit;
+}
+
+my ($format, $forConst);
+$forConst = 0;
+
+if ($ARGV[0] eq "-s")
+{
+ shift;
+ $format = "\t.equ %s,%s\n";
+ print <<EOF;
+/* DO NOT EDIT! This file was automatically produced by $0
+ from @ARGV */
+
+ .macro systrap trapname
+ trap #15
+ .word \\trapname
+ .endm
+
+EOF
+ }
+elsif ($ARGV[0] eq "-d")
+{
+ shift;
+ $format = "#define _P_sysTrap%s\t%s\n";
+ print <<EOF;
+/* DO NOT EDIT! This section was automatically produced by $0
+ from @ARGV */
+
+EOF
+}
+elsif ($ARGV[0] eq "-c")
+{
+ shift;
+ $format = "use constant sysTrap%s\t=> %s;\n";
+ $forConst = 1;
+ print <<EOF;
+# DO NOT EDIT! This section was automatically produced by $0
+# from @ARGV
+
+EOF
+}
+else
+{
+ $format = "<%s>\t%s\n";
+ print <<EOF;
+DO NOT EDIT! This file was automatically produced by $0
+from @ARGV
+
+EOF
+}
+
+my $num = 0;
+
+while (<>)
+{
+ s"//.*$""; # eat C++-style comments
+ s"/\*[^/]*\*/""g; # eat simple C-style comments (just in case)
+
+ if (/define\W+sysTrapBase\W+((0[xX][\da-fA-F]+)|(\d+))/)
+ {
+ $num = $1;
+ $num = oct $num if $num =~ /^0/;
+ }
+
+ next unless /=.*sysTrapBase.*,/ .. /}.*SysTrapNumber.*;/;
+
+ printf $format, $1, sprintf("\"%lX\"", $num++) if /sysTrap(\w+)\b/;
+}
+
+if ($forConst != 0)
+{
+ print "\n", "1;", "\n";
+}