Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / pp.py
1 from enum import Enum
2
3 class PrettyPrintable:
4     def __init__(self) -> None:
5         pass
6
7     def print_simple(self, pp, *args):
8         raise NotImplementedError()
9     
10     def print_abstract(self, pp, *args):
11         raise NotImplementedError()
12     
13     def print_detailed(self, pp, *args):
14         raise NotImplementedError()
15     
16 class PrintMode(Enum):
17     Simple = 0
18     Detailed = 1
19     Abstract = 2
20
21 class TypeConverter(Enum):
22     Identity = lambda v: v
23     CString = lambda v: v.string()
24
25 class MyPrettyPrinter:
26     INDENT = 3
27     def __init__(self, level = 0, prefix='') -> None:
28         self.__level = level
29         self.__padding = " " * MyPrettyPrinter.INDENT * level
30         self.__prefix = prefix
31
32     def set_prefix(self, prefix):
33         self.__prefix = prefix
34         return self
35     
36     def clear_prefix(self):
37         self.__prefix = ''
38         return self
39
40     def next_level(self, indent_inc = 1):
41         return MyPrettyPrinter(indent_inc + self.__level, self.__prefix)
42     
43     def print(self, *vals, indent=0, mode=PrintMode.Simple):
44         val = '' if len(vals) == 0 else vals[0]
45         if isinstance(val, PrettyPrintable):
46             pp = self
47             if indent > 0:
48                 pp = self.next_level(indent)
49             [ val.print_simple, 
50               val.print_detailed, 
51               val.print_abstract ][mode.value](pp)
52         else:
53             new_id = " " * indent
54             print(f"{self.__padding}{new_id}", f"{self.__prefix}{val}", *vals[1:])
55         
56         return self
57
58     def printf(self, fmt, *args, indent=0):
59         assert isinstance(fmt, str)
60         self.print(fmt%args, indent=indent)
61         return self
62     
63     def printfa(self, fmt, *args, indent=0):
64         assert isinstance(fmt, str)
65         self.print(fmt.format(*args), indent=indent)
66         return self
67
68
69     def print_field(self, obj, field, fmt=None, val=None, cast=TypeConverter.Identity):
70         val = obj[field] if val is None else val
71         val = cast(val)
72
73         if fmt is None:
74             self.printf("%s: %s", field, val)
75         else:
76             self.printf("%s: %s", field, fmt%(val))
77         return self