]> git.draconx.ca Git - dxcommon.git/blobdiff - scripts/gen-tree.awk
Rework backslash substitutions in awk scripts.
[dxcommon.git] / scripts / gen-tree.awk
index d04378a81ff9161d3bc0605ed79ce1e1bec1162f..55a7d5c4e6bebe3bc02bdbfa867f43702907c0e7 100755 (executable)
@@ -5,9 +5,11 @@
 # Generate one or more C array initializers to encode simple tree structures
 # in a compact format.
 #
-# Each nonempty line of the input file is either an option specification
-# or # a tree specification.  An option specification (described later)
-# begins with an @ character.  Other lines specify tree nodes.
+# Each nonempty line of the input file is either a comment, an option
+# specification or a tree specification.  Each line is distinguished by
+# its first character.  A # character introduces a comment, an @ character
+# introduces an option specification (described later), and all other
+# nonempty lines are tree nodes.
 #
 # The first field of a tree specification must be a valid C identifier,
 # optionally followed by a comma.  The identifiers used on non-leaf nodes
@@ -91,6 +93,10 @@ END {
 }
 
 BEGIN {
+  # Check if "\\\\" in substitutions gives just one backslash.
+  bs = "x"; sub(/x/, "\\\\", bs);
+  bs = (length(bs) == 1 ? "\\\\" : "\\");
+
   opts["strtab"] = 1;
 
   depth = max_depth = 0;
@@ -102,6 +108,10 @@ BEGIN {
   indent_stack[0] = 0;
 }
 
+# Comments
+NF == 0 { next }
+$0 ~ /^#/ { next }
+
 # Options
 sub(/^@/, "", $0) {
   if (NF == 1) {
@@ -118,7 +128,6 @@ sub(/^@/, "", $0) {
   next
 }
 
-NF == 0 { next }
 { indent = index($0, $1) - 1 }
 
 indent > 0 {
@@ -182,7 +191,7 @@ END {
       }
     }
 
-    gsub(/\1/, "\"\n\t\"\\0\" \"", entry_strtab);
+    gsub("\1", "\"\n\t\"" bs "0\" \"", entry_strtab);
     sub(/^"/, "", entry_strtab);
     sub(/\n[^\n]*$/, ";", entry_strtab);
     print "\nstatic const char tree_strtab[] =" entry_strtab