| Index: emcore/trunk/tools/misc.py |
| — | — | @@ -27,6 +27,8 @@ |
| 28 | 28 | """
|
| 29 | 29 |
|
| 30 | 30 | import sys
|
| | 31 | +from ctypes import *
|
| | 32 | +from _ctypes import _SimpleCData
|
| 31 | 33 | import libemcoredata
|
| 32 | 34 |
|
| 33 | 35 | class Logger(object):
|
| — | — | @@ -97,6 +99,105 @@ |
| 98 | 100 | self.__dict__ = self
|
| 99 | 101 |
|
| 100 | 102 |
|
| | 103 | +class c_enum(_SimpleCData):
|
| | 104 | + """
|
| | 105 | + Resembles the enum datatype from C with an 8 bit size.
|
| | 106 | + Returns the associated string of a value with c_enum[i]
|
| | 107 | + Returns the current value of the associated value as c_enum.__repr__()
|
| | 108 | + Comparison operators work with strings and values at the same time.
|
| | 109 | +
|
| | 110 | + ATTENTION: You can not really see if this is initialized or not.
|
| | 111 | + If it is uninitialized it will return the first entry of the enum.
|
| | 112 | + While this may be circumvented by changing the default value to
|
| | 113 | + something else this will not work if the enum is placed inside a
|
| | 114 | + ctypes structure as the __init__() method will not be called then.
|
| | 115 | + """
|
| | 116 | + _type_ = c_uint8._type_
|
| | 117 | +
|
| | 118 | + def __init__(self, value = 0):
|
| | 119 | + if type(value) == str:
|
| | 120 | + value = getattr(self, value)
|
| | 121 | + _SimpleCData.__init__(self, value)
|
| | 122 | + self[value]
|
| | 123 | +
|
| | 124 | + def __getattr__(self, name):
|
| | 125 | + if name == "value":
|
| | 126 | + return self.value
|
| | 127 | + for key, value in enumerate(self._fields_):
|
| | 128 | + if value == name:
|
| | 129 | + return key
|
| | 130 | +
|
| | 131 | + def __getitem__(self, lookupkey):
|
| | 132 | + for key, value in enumerate(self._fields_):
|
| | 133 | + if key == lookupkey:
|
| | 134 | + return value
|
| | 135 | + raise IndexError("Value %d not in range of possible enum values for %s!" % (lookupkey, self.__class__.__name__))
|
| | 136 | +
|
| | 137 | + def __str__(self):
|
| | 138 | + return self[self.value]
|
| | 139 | +
|
| | 140 | + def __repr__(self):
|
| | 141 | + return self.__str__()
|
| | 142 | +
|
| | 143 | + def __eq__(self, other):
|
| | 144 | + if type(other) == str:
|
| | 145 | + try: return getattr(self, other) == self.value
|
| | 146 | + except AttributeError: return False
|
| | 147 | + else:
|
| | 148 | + return self.value == other
|
| | 149 | +
|
| | 150 | + def __lt__(self, other):
|
| | 151 | + if type(other) == str:
|
| | 152 | + try: return self.value < getattr(self, other)
|
| | 153 | + except AttributeError: return False
|
| | 154 | + else:
|
| | 155 | + return self.value < other
|
| | 156 | +
|
| | 157 | + def __gt__(self, other):
|
| | 158 | + if type(other) == str:
|
| | 159 | + try: return self.value > getattr(self, other)
|
| | 160 | + except AttributeError: return False
|
| | 161 | + else:
|
| | 162 | + return self.value > other
|
| | 163 | +
|
| | 164 | + def __le__(self, other):
|
| | 165 | + if self.value == other or self.value < other:
|
| | 166 | + return True
|
| | 167 | + return False
|
| | 168 | +
|
| | 169 | + def __ge__(self, other):
|
| | 170 | + if self.value == other or self.value > other:
|
| | 171 | + return True
|
| | 172 | + return False
|
| | 173 | +
|
| | 174 | + def __ne__(self, other):
|
| | 175 | + if self.value == other:
|
| | 176 | + return False
|
| | 177 | + return True
|
| | 178 | +
|
| | 179 | +
|
| | 180 | +class ExtendedCStruct(LittleEndianStructure):
|
| | 181 | + """
|
| | 182 | + This is a subclass of the LittleEndianStructure.
|
| | 183 | + It implements functions to easily convert
|
| | 184 | + structures to/from strings and Bunches.
|
| | 185 | + """
|
| | 186 | + def _from_bunch(self, bunch):
|
| | 187 | + for field, _ in self._fields_:
|
| | 188 | + if field in bunch:
|
| | 189 | + setattr(self, field, getattr(bunch, field))
|
| | 190 | +
|
| | 191 | + def _to_bunch(self):
|
| | 192 | + return Bunch(**{field: getattr(self, field) for field, _ in self._fields_})
|
| | 193 | +
|
| | 194 | + def _from_string(self, string):
|
| | 195 | + memmove(addressof(self), string, sizeof(self))
|
| | 196 | +
|
| | 197 | + def _to_string(self):
|
| | 198 | + return string_at(addressof(self), sizeof(self))
|
| | 199 | +
|
| | 200 | +
|
| | 201 | +
|
| 101 | 202 | class Error(Exception):
|
| 102 | 203 | def __init__(self, value=None):
|
| 103 | 204 | self.value = value
|