#!/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") }