field_t * field_create(fieldtype_t type, const char * key, const void * value) { field_t * field; if (!(field = malloc(sizeof(field_t)))) goto ERR_MALLOC; field->key = key; field->type = type; if (value) { switch (type) { case TYPE_STRING: if (!(field->value.string = strdup((const char *) value))) goto ERR_DUP_VALUE; break; case TYPE_GENERATOR: if (!(field->value.generator = generator_dup((const generator_t *) value))) goto ERR_DUP_VALUE; break; #ifdef USE_BITS case TYPE_BITS: fprintf(stderr, "field_create: invalid field type (TYPE_BITS): use field_create_bits instead.\n"); assert(false); break; #endif default: // Copy size bytes in value in the union. memcpy(&field->value, value, field_get_type_size(type)); break; } } return field; ERR_DUP_VALUE: free(field); ERR_MALLOC: return NULL; }
field_t * field_create(fieldtype_t type, const char * key, const void * value) { field_t * field; if (!(field = malloc(sizeof(field_t)))) goto ERR_MALLOC; field->key = key; field->type = type; if (value) { switch (type) { case TYPE_STRING: if (!(field->value.string = strdup((const char *) value))) goto ERR_DUP_VALUE; break; case TYPE_GENERATOR: if (!(field->value.generator = generator_dup((const generator_t *) value))) goto ERR_DUP_VALUE; break; default: // Copy size bytes in value in the union. memcpy(&field->value, value, field_get_type_size(type)); break; } } return field; ERR_DUP_VALUE: free(field); ERR_MALLOC: return NULL; }