int add_string_additional_data(idmef_alert_t *alert, const char *meaning, const char *ptr){
    int ret;
    prelude_string_t *str;
    idmef_additional_data_t *ad;
    idmef_data_t *data;

    ret = idmef_alert_new_additional_data(alert, &ad, IDMEF_LIST_APPEND);
    if ( ret < 0 )
        return ret;

    idmef_additional_data_set_type(ad, IDMEF_ADDITIONAL_DATA_TYPE_STRING);

    idmef_additional_data_new_data(ad, &data);

    ret = idmef_data_set_char_string_ref(data, ptr);
    if ( ret < 0)
        return ret;


    ret = idmef_additional_data_new_meaning(ad, &str);
    if ( ret < 0)
        return ret;

    ret = prelude_string_set_ref(str, meaning);
    if ( ret < 0 )
        return ret;

    return 0;
}
int idmef_additional_data_new_ptr_nodup_fast(idmef_additional_data_t **nd,
                                             idmef_additional_data_type_t type,
                                             void *ptr, size_t len)
{
        int ret;
        idmef_data_type_t dtype;

        ret = check_type(type, ptr, len);
        if ( ret < 0 )
                return ret;

        ret = idmef_additional_data_new(nd);
        if ( ret < 0 )
                return ret;

        idmef_additional_data_set_type(*nd, type);
        dtype = idmef_additional_data_type_to_data_type(type);

        ret = idmef_data_set_ptr_nodup_fast(idmef_additional_data_get_data(*nd), dtype, ptr, len);
        if ( ret < 0 ) {
                idmef_additional_data_destroy(*nd);
                return ret;
        }

        return ret;
}
/*
 * also copy the content of the embedded data
 */
int idmef_additional_data_copy_dup(idmef_additional_data_t *src, idmef_additional_data_t *dst)
{
        int ret;

        ret = requiem_string_copy_dup(idmef_additional_data_get_meaning(src), idmef_additional_data_get_meaning(dst));
        if ( ret < 0 )
                return ret;

        idmef_additional_data_set_type(dst, idmef_additional_data_get_type(src));

        return idmef_data_copy_dup(idmef_additional_data_get_data(src), idmef_additional_data_get_data(dst));
}
int idmef_additional_data_set_ptr_nodup_fast(idmef_additional_data_t *data,
                                             idmef_additional_data_type_t type, void *ptr, size_t len)
{
        int ret;

        ret = check_type(type, ptr, len);
        if ( ret < 0 )
                return ret;

        idmef_additional_data_set_type(data, type);

        return idmef_data_set_ptr_nodup_fast(idmef_additional_data_get_data(data),
                                             idmef_additional_data_type_to_data_type(type), ptr, len);
}