summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/opsymbols.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/opsymbols.pl')
-rwxr-xr-xBuild/source/utils/asymptote/opsymbols.pl50
1 files changed, 50 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/opsymbols.pl b/Build/source/utils/asymptote/opsymbols.pl
new file mode 100755
index 00000000000..06491ad1c69
--- /dev/null
+++ b/Build/source/utils/asymptote/opsymbols.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/env perl
+#####
+# opsymbols.pl
+# Andy Hammerlindl 2010/06/01
+#
+# Extract mapping such as '+' --> SYM_PLUS from camp.l
+#####
+
+open(header, ">opsymbols.h") ||
+ die("Couldn't open opsymbols.h for writing");
+
+print header <<END;
+/*****
+ * This file is automatically generated by opsymbols.pl
+ * Changes will be overwritten.
+ *****/
+
+// If the OPSYMBOL macro is not defined for a specific purpose, define it with
+// the default purpose of using SYM_PLUS etc. as external pre-translated
+// symbols.
+
+#ifndef OPSYMBOL
+#define OPSYMBOL(str, name) extern sym::symbol name
+#endif
+
+END
+
+sub add {
+ print header "OPSYMBOL(\"".$_[0]."\", " . $_[1] . ");\n";
+}
+
+open(lexer, "camp.l") ||
+ die("Couldn't open camp.l");
+
+while (<lexer>) {
+ if (m/^"(\S+)"\s*{\s*DEFSYMBOL\((\w+)\);/) {
+ add($1, $2);
+ }
+ if (m/^(\w+)\s*{\s*DEFSYMBOL\((\w+)\);/) {
+ add($1, $2);
+ }
+ if (m/^\s*EXTRASYMBOL\(\s*(\w+)\s*,\s*(\w+)\s*\)/) {
+ add($1, $2);
+ }
+}
+
+print header <<END
+
+/* This file is automatically generated. */
+END