freemyipod r505 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r504‎ | r505 | r506 >
Date:00:45, 2 February 2011
Author:farthen
Status:new
Tags:
Comment:
emcore tools: Implement support for ctype structures and enums
Modified paths:
  • /emcore/trunk/tools/misc.py (modified) (history)

Diff [purge]

Index: emcore/trunk/tools/misc.py
@@ -27,6 +27,8 @@
2828 """
2929
3030 import sys
 31+from ctypes import *
 32+from _ctypes import _SimpleCData
3133 import libemcoredata
3234
3335 class Logger(object):
@@ -97,6 +99,105 @@
98100 self.__dict__ = self
99101
100102
 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+
101202 class Error(Exception):
102203 def __init__(self, value=None):
103204 self.value = value