From fabcbec3634cb11e6e2149ad865eea5b30d8cab1 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Wed, 22 Mar 2023 14:39:07 -0700 Subject: [PATCH] Redo bin/num so it prints JSON --- bin/num | 97 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 46 deletions(-) diff --git a/bin/num b/bin/num index 7f1fbb4..daac33f 100755 --- a/bin/num +++ b/bin/num @@ -1,59 +1,64 @@ #!/usr/bin/env python3 +# Eryn Wells +import argparse +import json import os.path import sys -BIN_FMT = 2 -OCT_FMT = 8 -DEC_FMT = 10 -HEX_FMT = 16 +FORMATS = { + 'bin': 2, + 'oct': 8, + 'dec': 10, + 'hex': 16, +} - -def main(): - if len(sys.argv) < 2: - print('Usage: {} [num...]'.format(sys.argv[0])) - return -1 - - root = os.path.splitext(os.path.basename(sys.argv[0]))[0] - - if root == 'bin': - fmts = {BIN_FMT} - elif root == 'oct': - fmts = {OCT_FMT} - elif root == 'dec': - fmts = {DEC_FMT} - elif root == 'hex': - fmts = {HEX_FMT} +def handle_number(n): + try: + base = 10 + n = n.lower() + if n.startswith('0x'): + base = 16 + if n.startswith('0o'): + base = 8 + if n.startswith('0b'): + base = 2 + num = int(n, base=base) + except ValueError: + print('Error: cannot parse string as int: {}'.format(n)) else: - # All formats - fmts = {BIN_FMT, OCT_FMT, DEC_FMT, HEX_FMT} + return { + 'bin': str(bin(num)[2:]), + 'oct': str(oct(num)[2:]), + 'dec': str(num), + 'hex': str(hex(num)[2:]), + } - for n in sys.argv[1:]: - print('---') - try: - base = 10 - n = n.lower() - if n.startswith('0x'): - base = 16 - if n.startswith('0o'): - base = 8 - if n.startswith('0b'): - base = 2 - num = int(n, base=base) - except ValueError: - print('Error: cannot parse string as int: {}'.format(n)) +def parse_args(argv, *a, **kw): + parser = argparse.ArgumentParser(*a, **kw) + parser.add_argument('--ascii', '-a', action='store_true') + parser.add_argument('numbers', nargs='+') + args = parser.parse_args(argv) + return args + +def main(argv): + args = parse_args(argv[1:], prog=argv[0]) + + output = {} + + for n in args.numbers: + if args.ascii: + for c in n: + output.setdefault(c, handle_number(str(ord(c)))) else: - if BIN_FMT in fmts: - print('bin: {}'.format(bin(num)[2:])) - if OCT_FMT in fmts: - print('oct: {}'.format(oct(num)[2:])) - if DEC_FMT in fmts: - print('int: {}'.format(num)) - if HEX_FMT in fmts: - print('hex: {}'.format(hex(num)[2:])) + output.setdefault(n, handle_number(n)) + + json.dump(output, sys.stdout, indent=2) + print('\n') return 0 - if __name__ == '__main__': - sys.exit(main()) + import sys + result = main(sys.argv) + sys.exit(0 if not result else result)