added win_unicode_console module
[twitter-api-cdsw] / win_unicode_console / buffer.py
diff --git a/win_unicode_console/buffer.py b/win_unicode_console/buffer.py
new file mode 100644 (file)
index 0000000..cd5853c
--- /dev/null
@@ -0,0 +1,51 @@
+
+from ctypes import (byref, POINTER, Structure, pythonapi,
+       c_int, c_char, c_char_p, c_void_p, py_object, c_ssize_t)
+import sys
+
+c_ssize_p = POINTER(c_ssize_t)
+
+PyObject_GetBuffer = pythonapi.PyObject_GetBuffer
+PyBuffer_Release = pythonapi.PyBuffer_Release
+
+
+PyBUF_SIMPLE = 0
+PyBUF_WRITABLE = 1
+
+
+class Py_buffer(Structure):
+       _fields_ = [
+               ("buf", c_void_p),
+               ("obj", py_object),
+               ("len", c_ssize_t),
+               ("itemsize", c_ssize_t),
+               ("readonly", c_int),
+               ("ndim", c_int),
+               ("format", c_char_p),
+               ("shape", c_ssize_p),
+               ("strides", c_ssize_p),
+               ("suboffsets", c_ssize_p),
+               ("internal", c_void_p)
+       ]
+       
+       if sys.version_info[0] < 3:
+               _fields_.insert(-1, ("smalltable", c_ssize_t * 2))
+       
+       @classmethod
+       def get_from(cls, obj, flags=PyBUF_SIMPLE):
+               buf = cls()
+               PyObject_GetBuffer(py_object(obj), byref(buf), flags)
+               return buf
+       
+       def release(self):
+               PyBuffer_Release(byref(self))
+
+
+def get_buffer(obj, writable=False):
+       buf = Py_buffer.get_from(obj, PyBUF_WRITABLE if writable else PyBUF_SIMPLE)
+       try:
+               buffer_type = c_char * buf.len
+               return buffer_type.from_address(buf.buf)
+       finally:
+               buf.release()
+

Benjamin Mako Hill || Want to submit a patch?