about summary refs log tree commit diff stats
path: root/utils.py
blob: f2c2256bf27c694051fe9d16447f51f78e094cc4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sys
import shutil

def print_separator(separator: str = '-', stream=sys.stdout, count: int = 80):
    maxtermsize = count
    termsize = shutil.get_terminal_size((80, 20)).columns
    print(separator * min(termsize, maxtermsize), file=stream)

def check_version(version: str):
    # Script depends on ordered dicts in default dict()
    split = version.split('.')
    major = int(split[0])
    minor = int(split[1])
    if sys.version_info.major < major and sys.version_info.minor < minor:
        raise EnvironmentError("Expected at least Python 3.7")

def to_str(expr):
    """Convert a claripy expression to a nice string representation.

    Actually, the resulting representation is not very nice at all. It mostly
    serves debugging purposes.
    """
    import claripy

    if not issubclass(type(expr), claripy.ast.Base):
        return f'{type(expr)}[{str(expr)}]'

    assert(expr.depth > 0)
    if expr.depth == 1:
        if expr.symbolic:
            name = expr._encoded_name.decode()
            return f'symbol[{name}]'
        else:
            assert(expr.concrete)
            return f'value{expr.length}[{hex(expr.v)}]'

    args = [to_str(child) for child in expr.args]
    return f'expr[{str(expr.op)}({", ".join(args)})]'