aboutsummaryrefslogtreecommitdiff
path: root/bitrule
diff options
context:
space:
mode:
Diffstat (limited to 'bitrule')
-rwxr-xr-xbitrule76
1 files changed, 76 insertions, 0 deletions
diff --git a/bitrule b/bitrule
new file mode 100755
index 0000000..5724a6f
--- /dev/null
+++ b/bitrule
@@ -0,0 +1,76 @@
+#!/usr/bin/awk -E
+# Copyright 2017 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Usage: bitrule [number_of_characters_to_ignore_at_start
+
+function usage() {
+ print "usage: bitrule [n_chars_to_ignore_at_line_start]" >"/dev/stderr"
+ exiting=1; exit
+}
+
+function repeat(s, n, r, i) {
+ for (i = 0; i < n; ++i)
+ r = r " "
+ return r
+}
+
+BEGIN {
+ ignore_leading = "none"
+
+ if (ARGC > 2)
+ usage()
+ else if (ARGC == 2) {
+ ignore_leading = ARGV[1]
+ delete ARGV[1] # don't treat it as a file
+ if (ignore_leading < 0)
+ usage()
+ }
+}
+
+# Track the maximum length of the lines.
+length($0) > max_length { max_length = length($0) }
+
+# Detect lines beginning in '0b', '0x' or '0o'. These are binary representations
+# of numbers and shouldn't have the rule extend through their prefix.
+/^0[box].*/ { is_prefixed = 1 }
+
+{ print }
+
+END {
+ if (exiting)
+ exit exiting
+
+ top = max_length - 1
+
+ if (ignore_leading != "none") {
+ prefix = repeat(" ", ignore_leading)
+ top -= ignore_leading
+ } else if (is_prefixed) {
+ prefix = " "
+ top -= 2
+ }
+
+ # Print the ruler.
+ printf(prefix)
+ for (i = top; i >= 0; --i)
+ printf(i % 4 ? "'" : "|")
+ printf("\n")
+
+ # Print the numbers.
+ printf("%s%s", prefix, repeat("x", top % 4))
+ for (i = int(top / 4) * 4; i >= 0; i -= 4)
+ printf("%-4d", i)
+ printf("\n")
+}