#ifndef _VPDECC_H_
#define _VPDECC_H_

#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wunused-parameter"

#include <stdlib.h>

#define VPD_ECC_OK 0
#define VPD_ECC_NOT_ENOUGH_BUFFER 1
#define VPD_ECC_WRONG_ECC_SIZE 2
#define VPD_ECC_WRONG_BUFFER_SIZE 9
#define VPD_ECC_UNCORRECTABLE_DATA 90
#define VPD_ECC_CORRECTABLE_DATA 91

#ifdef __cplusplus
extern "C"
{
#endif

    /* TODO  doxygen !!!!!!!! */

    /******************************************************************************/
    /* vpdecc_create_ecc */
    /*                                                                            */
    /* For a given data block (together with the length of the data block */
    /* this function creates the ECC */
    /*                                                                            */
    /* @param     pData           In-Buffer containing the raw VPD data */
    /*                                            (wont't be changed) */
    /*                                                                            */
    /* @param     vDataLength     In        should contain the length of the
     * Data */
    /*                                      in the buffer given to vData */
    /*                                                                            */
    /* @param     pEcc            Out-Buffer after execution this will be the */
    /*                                      buffer for the calculated Ecc */
    /*                                                                            */
    /* @param     pEccLenght      In/Out    In : size of buffer */
    /*                                      Out: contains the length of the Ecc
     */
    /*                                                                            */
    /* @return Error returncode */
    /******************************************************************************/
    int vpdecc_create_ecc(const unsigned char* data, size_t datalength,
                          unsigned char* ecc, size_t* ecc_buffersize);

    /******************************************************************************/
    /* vpdecc_check_data */
    /*                                                                            */
    /* For a given data block (together with the ecc) */
    /* this function checks the data for validness */
    /*                                                                            */
    /* @param     pData           In-Buffer containing the raw VPD data */
    /*                            Out-Buffer containing the raw VPD data */
    /*                                      No error           : data unchanged
     */
    /*                                      Correctable error  : data corrected
     */
    /*                                      Uncorrectable error: data unchanged
     */
    /*                                                                            */
    /* @param     vDataLength     In        should contain the length of the
     * Data */
    /*                                      in the buffer given to vData */
    /*                                                                            */
    /* @param     pEcc            In-Buffer should contain the Ecc for the data
     */
    /*                                                                            */
    /*                                                                            */
    /* @param     vEccLenght      In        should contain the length of the Ecc
     */
    /*                                                                            */
    /* @return Error returncode */
    /******************************************************************************/
    int vpdecc_check_data(unsigned char* data, size_t data_length,
                          const unsigned char* ecc, size_t ecc_length);

#ifdef __cplusplus
} /* end extern "C" */
#endif

#endif /* endif _VPDECC_H_ */
