Added initial binary decoder.
[coe.git] / coe / data.py
1 class symbol(object):
2     isafe = set("abcdefghijklmnopqrstuvwxyz" +
3                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
4                 "$%^&*_=/.")
5     qsafe = isafe | set("0123456789-+")
6
7     def __eq__(s, o):
8         if not isinstance(o, symbol):
9             return False
10         return (s.name == o.name) and (s.ns == o.ns)
11
12     def __hash__(self):
13         return (hash(self.ns) * 31) + hash(self.name)
14
15     def __lt__(s, o):
16         ns, nm = ("", o) if isinstance(o, str) else (s.ns, s.name)
17         return s.ns < ns or s.name < nm
18     def __gt__(s, o):
19         ns, nm = ("", o) if isinstance(o, str) else (s.ns, s.name)
20         return s.ns > ns or s.name > nm
21
22     @staticmethod
23     def quote(st):
24         ret = ""
25         q = False
26         cset = symbol.isafe
27         for c in st:
28             if c not in cset:
29                 q = True
30                 ret += "\\" + c
31             else:
32                 ret += c
33             cset = symbol.qsafe
34         if q:
35             ret = "|" + ret + "|"
36         return ret
37
38     @staticmethod
39     def get(ns, name):
40         if ns == "":
41             return usymbol(name)
42         return nssymbol(ns, name)
43
44     def __repr__(self):
45         if self.ns == "":
46             return self.quote(self.name)
47         return "%s:%s" % (self.quote(self.ns), self.quote(self.name))
48
49 class usymbol(symbol):
50     ns = ""
51     def __init__(self, name):
52         self.name = name
53
54     def __hash__(self):
55         return hash(self.name)
56     def __eq__(s, o):
57         if isinstance(o, str):
58             return s.name == o
59         return super().__eq__(o)
60
61 class nssymbol(symbol):
62     def __init__(self, ns, name, *args, **kw):
63         super().__init__(*args, **kw)
64         self.name = name
65         self.ns = ns
66
67 class obj(object):
68     def __getitem__(self, key):
69         return self.__dict__[key]
70     def __setitem__(self, key, val):
71         self.__dict__[key] = val
72     def __delitem__(self, key):
73         del self.__dict__[key]