Redo bin/num so it prints JSON
This commit is contained in:
		
							parent
							
								
									858b9e1b40
								
							
						
					
					
						commit
						fabcbec363
					
				
					 1 changed files with 51 additions and 46 deletions
				
			
		
							
								
								
									
										97
									
								
								bin/num
									
										
									
									
									
								
							
							
						
						
									
										97
									
								
								bin/num
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,59 +1,64 @@
 | 
			
		|||
#!/usr/bin/env python3
 | 
			
		||||
# Eryn Wells <eryn@erynwells.me>
 | 
			
		||||
 | 
			
		||||
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> [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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue