from ctypes import *

uint_ptr = POINTER(c_uint)
int_ptr = POINTER(c_int)

def _uintify(x, y, z):
    return (c_uint(x), c_uint(y), c_uint(z))

def _allocate_array(t_type, count):
    arr_type = t_type * count

    arr = arr_type()

    ptr = c_void_p()
    ptr = addressof(arr)

    return (arr, ptr)

def _alloc_int_buffer(ptr, count):
    a = _allocate_array(c_int, count)

    ptr = addressof(a[0])

    return 1

_int_functype = CFUNCTYPE(c_int, POINTER(c_int), c_uint)
alloc_int_buffer = _int_functype(_alloc_int_buffer)

def _alloc_uint_buffer(ptr, count):
    a = _allocate_array(c_uint, count)

    ptr = addressof(a[0])

    return 1

_uint_functype = CFUNCTYPE(c_int, POINTER(c_uint), c_uint)
alloc_uint_buffer = _uint_functype(_alloc_uint_buffer)

def _alloc_short_buffer(ptr, count):
    a = _allocate_array(c_short, count)

    ptr = addressof(a[0])

    return 1

_short_functype = CFUNCTYPE(c_int, POINTER(c_short), c_uint)
alloc_short_buffer = _short_functype(_alloc_short_buffer)

def _alloc_ushort_buffer(ptr, count):
    a = _allocate_array(c_ushort, count)

    ptr = addressof(a[0])

    return 1

_ushort_functype = CFUNCTYPE(c_int, POINTER(c_ushort), c_uint)
alloc_ushort_buffer = _ushort_functype(_alloc_ushort_buffer)

def _alloc_byte_buffer(ptr, count):
    a = _allocate_array(c_byte, count)

    ptr = addressof(a[0])

    return 1

_byte_functype = CFUNCTYPE(c_int, POINTER(c_byte), c_uint)
alloc_byte_buffer = _byte_functype(_alloc_byte_buffer)

def _alloc_ubyte_buffer(ptr, count):
    a = _allocate_array(c_ubyte, count)

    ptr = addressof(a[0])

    return 1

_ubyte_functype = CFUNCTYPE(c_int, POINTER(c_ubyte), c_uint)
alloc_ubyte_buffer = _ubyte_functype(_alloc_ubyte_buffer)

def _alloc_char_buffer(ptr, count):
    c = create_string_buffer(count)

    if ptr is None:
        ptr = c_void_p

    ptr = addressof(c)

    return 1

_char_functype = CFUNCTYPE(c_int, POINTER(c_char), c_uint)
alloc_char_buffer = _char_functype(_alloc_char_buffer)