in src/umocktypes.c [106:188]
int umocktypes_register_type(const char* type, UMOCKTYPE_STRINGIFY_FUNC stringify_func, UMOCKTYPE_ARE_EQUAL_FUNC are_equal_func, UMOCKTYPE_COPY_FUNC copy_func, UMOCKTYPE_FREE_FUNC free_func)
{
int result;
if ((type == NULL) ||
(stringify_func == NULL) ||
(are_equal_func == NULL) ||
(copy_func == NULL) ||
(free_func == NULL))
{
/* Codes_SRS_UMOCKTYPES_01_009: [ If any of the arguments is NULL, umocktypes_register_type shall fail and return a non-zero value. ]*/
UMOCK_LOG("Invalid arguments when registering umock_c type: type = %p, stringify_func = %p, are_equal_func = %p, copy_func = %p, free_func = %p.\r\n",
type, stringify_func, are_equal_func, copy_func, free_func);
result = __LINE__;
}
/* Codes_SRS_UMOCKTYPES_01_050: [ If umocktypes_register_type is called when the module is not initialized, umocktypes_register_type shall fail and return a non zero value. ]*/
else if (umocktypes_state != UMOCKTYPES_STATE_INITIALIZED)
{
UMOCK_LOG("Could not register type, umock_c not initialized.\r\n");
result = __LINE__;
}
else
{
/* Codes_SRS_UMOCKTYPES_01_034: [ Before registering, the type string shall be normalized by calling umocktypename_normalize. ]*/
char* normalized_type = umocktypename_normalize(type);
if (normalized_type == NULL)
{
/* Codes_SRS_UMOCKTYPES_01_045: [ If normalizing the typename fails, umocktypes_register_type shall fail and return a non-zero value. ]*/
UMOCK_LOG("Normalizing type %s failed.\r\n", type);
result = __LINE__;
}
else
{
UMOCK_VALUE_TYPE_HANDLERS* type_handler = get_value_type_handlers(normalized_type);
if (type_handler != NULL)
{
umockalloc_free(normalized_type);
if ((stringify_func != type_handler->stringify_func) ||
(are_equal_func != type_handler->are_equal_func) ||
(copy_func != type_handler->copy_func) ||
(free_func != type_handler->free_func))
{
/* Codes_SRS_UMOCKTYPES_01_011: [ If the type has already been registered but at least one of the function pointers is different, umocktypes_register_type shall fail and return a non-zero value. ]*/
UMOCK_LOG("Could not register type, type %s already registered with different handlers.\r\n", type);
result = __LINE__;
}
else
{
/* Codes_SRS_UMOCKTYPES_01_010: [ If the type has already been registered with the same function pointers then umocktypes_register_type shall succeed and return 0. ]*/
result = 0;
}
}
else
{
UMOCK_VALUE_TYPE_HANDLERS* new_type_handlers = (UMOCK_VALUE_TYPE_HANDLERS*)umockalloc_realloc(type_handlers, sizeof(UMOCK_VALUE_TYPE_HANDLERS) * (type_handler_count + 1));
if (new_type_handlers == NULL)
{
/* Codes_SRS_UMOCKTYPES_01_012: [ If an error occurs allocating memory for the newly registered type, umocktypes_register_type shall fail and return a non-zero value. ]*/
umockalloc_free(normalized_type);
UMOCK_LOG("Could not register type, failed allocating memory for types.\r\n");
result = __LINE__;
}
else
{
/* Codes_SRS_UMOCKTYPES_01_007: [ umocktypes_register_type shall register an interface made out of the stringify, are equal, copy and free functions for the type identified by the argument type. ] */
type_handlers = new_type_handlers;
type_handlers[type_handler_count].type = normalized_type;
type_handlers[type_handler_count].stringify_func = stringify_func;
type_handlers[type_handler_count].copy_func = copy_func;
type_handlers[type_handler_count].free_func = free_func;
type_handlers[type_handler_count].are_equal_func = are_equal_func;
type_handler_count++;
/* Codes_SRS_UMOCKTYPES_01_008: [ On success umocktypes_register_type shall return 0. ]*/
result = 0;
}
}
}
}
return result;
}