diff options
Diffstat (limited to 'bitrule')
-rwxr-xr-x | bitrule | 76 |
1 files changed, 76 insertions, 0 deletions
@@ -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") +} |