summaryrefslogtreecommitdiff
path: root/src/vm/h2inc.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/h2inc.pl')
-rw-r--r--src/vm/h2inc.pl62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/vm/h2inc.pl b/src/vm/h2inc.pl
new file mode 100644
index 0000000000..013d400280
--- /dev/null
+++ b/src/vm/h2inc.pl
@@ -0,0 +1,62 @@
+# Licensed to the .NET Foundation under one or more agreements.
+# The .NET Foundation licenses this file to you under the MIT license.
+# See the LICENSE file in the project root for more information.
+
+# C to MASM include file translator
+# This is replacement for the deprecated h2inc tool that used to be part of VS.
+
+use File::Basename;
+
+sub ProcessFile($) {
+ my ($input_file) = @_;
+
+ local *INPUT_FILE;
+ if (!open(INPUT_FILE, $input_file))
+ {
+ print "#error: File can not be opened: $input_file\n";
+ return;
+ }
+
+ print ("// File start: $input_file\n");
+
+ while(<INPUT_FILE>) {
+ # Skip all pragmas
+ if (m/^\s*#\s*pragma/) {
+ next;
+ }
+
+ # Expand includes.
+ if (m/\s*#\s*include\s*\"(.+)\"/) {
+ ProcessFile(dirname($input_file) . "/" . $1);
+ next;
+ }
+
+ # Augment #defines with their MASM equivalent
+ if (m/^\s*#\s*define\s+(\S+)\s+(.*)/) {
+ my $name = $1;
+ my $value = $2;
+
+ # Note that we do not handle multiline constants
+
+ # Strip comments from value
+ $value =~ s/\/\/.*//;
+ $value =~ s/\/\*.*\*\///g;
+
+ # Strip whitespaces from value
+ $value =~ s/\s+$//;
+
+ # ignore #defines with arguments
+ if (!($name =~ m/\(/)) {
+ my $number = 0;
+ $number |= ($value =~ s/\b0x(\w+)\b/0\1h/g); # Convert hex constants
+ $number |= ($value =~ s/(-?\b\d+\b)/\1t/g); # Convert dec constants
+ print $number ? "$name EQU $value\n" : "$name TEXTEQU <$value>\n";
+ }
+ }
+ print;
+ }
+
+ print ("// File end: $input_file\n");
+}
+
+ProcessFile($ARGV[0]);