Redo bin/num so it prints JSON

This commit is contained in:
Eryn Wells 2023-03-22 14:39:07 -07:00
parent 858b9e1b40
commit fabcbec363

97
bin/num
View file

@ -1,59 +1,64 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Eryn Wells <eryn@erynwells.me>
import argparse
import json
import os.path import os.path
import sys import sys
BIN_FMT = 2 FORMATS = {
OCT_FMT = 8 'bin': 2,
DEC_FMT = 10 'oct': 8,
HEX_FMT = 16 'dec': 10,
'hex': 16,
}
def handle_number(n):
def main(): try:
if len(sys.argv) < 2: base = 10
print('Usage: {} <num> [num...]'.format(sys.argv[0])) n = n.lower()
return -1 if n.startswith('0x'):
base = 16
root = os.path.splitext(os.path.basename(sys.argv[0]))[0] if n.startswith('0o'):
base = 8
if root == 'bin': if n.startswith('0b'):
fmts = {BIN_FMT} base = 2
elif root == 'oct': num = int(n, base=base)
fmts = {OCT_FMT} except ValueError:
elif root == 'dec': print('Error: cannot parse string as int: {}'.format(n))
fmts = {DEC_FMT}
elif root == 'hex':
fmts = {HEX_FMT}
else: else:
# All formats return {
fmts = {BIN_FMT, OCT_FMT, DEC_FMT, HEX_FMT} 'bin': str(bin(num)[2:]),
'oct': str(oct(num)[2:]),
'dec': str(num),
'hex': str(hex(num)[2:]),
}
for n in sys.argv[1:]: def parse_args(argv, *a, **kw):
print('---') parser = argparse.ArgumentParser(*a, **kw)
try: parser.add_argument('--ascii', '-a', action='store_true')
base = 10 parser.add_argument('numbers', nargs='+')
n = n.lower() args = parser.parse_args(argv)
if n.startswith('0x'): return args
base = 16
if n.startswith('0o'): def main(argv):
base = 8 args = parse_args(argv[1:], prog=argv[0])
if n.startswith('0b'):
base = 2 output = {}
num = int(n, base=base)
except ValueError: for n in args.numbers:
print('Error: cannot parse string as int: {}'.format(n)) if args.ascii:
for c in n:
output.setdefault(c, handle_number(str(ord(c))))
else: else:
if BIN_FMT in fmts: output.setdefault(n, handle_number(n))
print('bin: {}'.format(bin(num)[2:]))
if OCT_FMT in fmts: json.dump(output, sys.stdout, indent=2)
print('oct: {}'.format(oct(num)[2:])) print('\n')
if DEC_FMT in fmts:
print('int: {}'.format(num))
if HEX_FMT in fmts:
print('hex: {}'.format(hex(num)[2:]))
return 0 return 0
if __name__ == '__main__': if __name__ == '__main__':
sys.exit(main()) import sys
result = main(sys.argv)
sys.exit(0 if not result else result)