X-Git-Url: https://git.draconx.ca/gitweb/dxcommon.git/blobdiff_plain/cd475ab947ddc0338bd54406234f9cbfa5abe2fd..HEAD:/scripts/gen-tree.awk diff --git a/scripts/gen-tree.awk b/scripts/gen-tree.awk index d04378a..1334bf8 100755 --- a/scripts/gen-tree.awk +++ b/scripts/gen-tree.awk @@ -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 { @@ -156,12 +165,12 @@ indent > 0 { level_count[depth]++; } -indent == 0 && tree_identifier { +indent == 0 && tree_identifier != "" { trees[tree_identifier] = format_items(); tree_identifier = ""; } END { - if (tree_identifier) + if (tree_identifier != "") trees[tree_identifier] = format_items() } indent == 0 { tree_identifier = $1 } @@ -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 @@ -216,7 +225,7 @@ function format_items(s, i) depth--; } - for (i = 2; tree_items[i]; i++) { + for (i = 2; tree_items[i] != ""; i++) { level_count[i] += level_count[i-1]; } @@ -225,7 +234,7 @@ function format_items(s, i) delete subtree_depth[i]; } - for (i = 1; tree_items[i]; i++) { + for (i = 1; tree_items[i] != ""; i++) { s = s tree_items[i]; delete tree_items[i]; delete level_count[i]; @@ -241,25 +250,28 @@ function format_items(s, i) # placing them into dst[0] ... dst[n]. # # Returns the number of elements. -function bucketsort(dst, src, buckets, max, count, i, t) +function bucketsort(dst, src, max, count, i, t) { + # Note: ULTRIX 4.5 nawk does not support local array parameters + split("", bucketsort_buckets); + for (t in src) { i = length(src[t]) if (i > max) { max = i } - buckets[i]++ + bucketsort_buckets[i]++ } for (i = max; i > 0; i--) { - if (i in buckets) { - t = buckets[i] - buckets[i] = count + if (i in bucketsort_buckets) { + t = bucketsort_buckets[i] + bucketsort_buckets[i] = count count += t } } for (t in src) { i = length(t = src[t]) - dst[buckets[i]++] = t + dst[bucketsort_buckets[i]++] = t } return count