#include #include c_err_t c_Array_Init(c_Array_t* array, c_size_t length, c_size_t size) { if (!array) return C_ERR_PARAM; array->length = length; array->size = size; if (length>0) { array->array = C_CALLOC(length, size); if (!array->array) { return C_ERR_NOMEM; } }else { array->array = NULL; } return C_ERR_OK; } void c_Array_Destroy(c_Array_t* array) { if (!array) return; C_FREE(array->array); array->size = 0; array->length = 0; } c_Array_t* c_Array_New(c_size_t length, c_size_t size) { c_Array_t* array; C_NEW(array); if (!array) { return NULL; } c_Array_Init(array, length, size); return array; } void c_Array_Delete(c_Array_t** array) { if (!array || !*array) return; C_FREE((*array)->array); C_FREE(*array); } c_size_t c_Array_Size(c_Array_t* array) { if (!array) return 0; return array->size; } c_size_t c_Array_Length(c_Array_t* array) { if (!array) return 0; return array->length; } c_err_t c_Array_Get(c_Array_t* array, c_size_t index, void** data) { if (!array || (index >= array->length) || !data) return C_ERR_PARAM; *data = array->array + index * array->size; return C_ERR_OK; } c_err_t c_Array_Put(c_Array_t* array, c_size_t index, void* value) { if (!array || !value || (index>=array->length)) return C_ERR_PARAM; memcpy(array->array + index * array->size, value, array->size); return C_ERR_OK; } c_err_t c_Array_Resize(c_Array_t* array, c_size_t length) { if (!array) return C_ERR_PARAM; if (length==0) { C_FREE(array->array); }else if (array->length==0) { array->array = C_ALLOC(length*array->size); if (!array->array) { return C_ERR_NOMEM; } }else { array->array = C_REALLOC(array->array, length*array->size); if (!array->array) { return C_ERR_NOMEM; } } array->length = length; return C_ERR_OK; } c_Array_t* c_Array_Copy(c_Array_t* array, c_size_t length) { if (!array || length==0) return NULL; c_Array_t* result; C_NEW(result); if (!result) { return NULL; } c_Array_Init(result, length, array->size); if (result->length >= array->length && array->length > 0) { memcpy(result->array, array->array, array->length * array->size); }else if (array->length > result->length && result->length > 0) { memcpy(result->array, array->array, result->length * array->size); } return result; } c_err_t c_Array_CopyTo(const c_Array_t* array, c_Array_t* copy) { if (!array || !copy) return C_ERR_PARAM; if (copy->length >= array->length && array->length > 0) { memcpy(copy->array, array->array, array->length * array->size); return C_ERR_OK; }else if (array->length > copy->length && copy->length > 0) { memcpy(copy->array, array->array, copy->length * array->size); return C_ERR_OK; } return C_ERR_FAIL; }