old_contents: """utils fonctions non windows-related"""
  import ctypes
  
  
  def fixedpropety(f):
      cache_name = "_" + f.__name__
  
      def prop(self):
          try:
              return getattr(self, cache_name)
          except AttributeError:
              setattr(self, cache_name, f(self))
              return getattr(self, cache_name)
      return property(prop, doc=f.__doc__)
  
  
  def swallow_ctypes_copy(ctypes_object):
      new_copy = type(ctypes_object)()
      ctypes.memmove(ctypes.byref(new_copy), ctypes.byref(ctypes_object), ctypes.sizeof(new_copy))
      return new_copy
  
  
  # type replacement based on name
  def transform_ctypes_fields(struct, replacement):
      return [(name, replacement.get(name, type)) for name, type in struct._fields_]
new_contents: """utils fonctions non windows-related"""
  import ctypes
  import _ctypes
  
  
  def fixedpropety(f):
      cache_name = "_" + f.__name__
  
      def prop(self):
          try:
              return getattr(self, cache_name)
          except AttributeError:
              setattr(self, cache_name, f(self))
              return getattr(self, cache_name)
      return property(prop, doc=f.__doc__)
  
  
  def swallow_ctypes_copy(ctypes_object):
      new_copy = type(ctypes_object)()
      ctypes.memmove(ctypes.byref(new_copy), ctypes.byref(ctypes_object), ctypes.sizeof(new_copy))
      return new_copy
  
  
  # type replacement based on name
  def transform_ctypes_fields(struct, replacement):
      return [(name, replacement.get(name, type)) for name, type in struct._fields_]
  
  
  def print_ctypes_struct(struct, name="", ident=0, hexa=False):
      if isinstance(struct, _ctypes._Pointer):
          if ctypes.cast(struct, ctypes.c_void_p).value is None:
              print("{0} -> NULL".format(name))
              return
          return print_ctypes_struct(struct[0], name + "<deref>", hexa=hexa)
  
      if not hasattr(struct, "_fields_"):
          value = struct
          if hasattr(struct, "value"):
              value = struct.value
  
          if isinstance(value, basestring):
              value = repr(value)
          if hexa:
              try:
                  print("{0} -> {1}".format(name, hex(value)))
                  return
              except TypeError:
                  pass
          print("{0} -> {1}".format(name, value))
          return
  
      for fname, ftype in struct._fields_:
          value = getattr(struct, fname)
          print_ctypes_struct(value, "{0}.{1}".format(name, fname), hexa=hexa)
subject: Add ctypes struct pprinter