/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing#kwsys for details.  */
#ifndef @KWSYS_NAMESPACE@_MD5_h
#define @KWSYS_NAMESPACE@_MD5_h

#include <@KWSYS_NAMESPACE@/Configure.h>

/* Redefine all public interface symbol names to be in the proper
   namespace.  These macros are used internally to kwsys only, and are
   not visible to user code.  Use kwsysHeaderDump.pl to reproduce
   these macros after making changes to the interface.  */
#if !defined(KWSYS_NAMESPACE)
#  define kwsys_ns(x) @KWSYS_NAMESPACE@##x
#  define kwsysEXPORT @KWSYS_NAMESPACE@_EXPORT
#endif
#if !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#  define kwsysMD5 kwsys_ns(MD5)
#  define kwsysMD5_s kwsys_ns(MD5_s)
#  define kwsysMD5_New kwsys_ns(MD5_New)
#  define kwsysMD5_Delete kwsys_ns(MD5_Delete)
#  define kwsysMD5_Initialize kwsys_ns(MD5_Initialize)
#  define kwsysMD5_Append kwsys_ns(MD5_Append)
#  define kwsysMD5_Finalize kwsys_ns(MD5_Finalize)
#  define kwsysMD5_FinalizeHex kwsys_ns(MD5_FinalizeHex)
#  define kwsysMD5_DigestToHex kwsys_ns(MD5_DigestToHex)
#endif

#if defined(__cplusplus)
extern "C" {
#endif

/**
 * MD5 state data structure.
 */
typedef struct kwsysMD5_s kwsysMD5;

/**
 * Create a new MD5 instance.  The returned instance is not initialized.
 */
kwsysEXPORT kwsysMD5* kwsysMD5_New(void);

/**
 * Delete an old MD5 instance.
 */
kwsysEXPORT void kwsysMD5_Delete(kwsysMD5* md5);

/**
 * Initialize a new MD5 digest.
 */
kwsysEXPORT void kwsysMD5_Initialize(kwsysMD5* md5);

/**
 * Append data to an MD5 digest.  If the given length is negative,
 * data will be read up to but not including a terminating null.
 */
kwsysEXPORT void kwsysMD5_Append(kwsysMD5* md5, unsigned char const* data,
                                 int length);

/**
 * Finalize a MD5 digest and get the 16-byte hash value.
 */
kwsysEXPORT void kwsysMD5_Finalize(kwsysMD5* md5, unsigned char digest[16]);

/**
 * Finalize a MD5 digest and get the 32-bit hexadecimal representation.
 */
kwsysEXPORT void kwsysMD5_FinalizeHex(kwsysMD5* md5, char buffer[32]);

/**
 * Convert a MD5 digest 16-byte value to a 32-byte hexadecimal representation.
 */
kwsysEXPORT void kwsysMD5_DigestToHex(unsigned char const digest[16],
                                      char buffer[32]);

#if defined(__cplusplus)
} /* extern "C" */
#endif

/* If we are building a kwsys .c or .cxx file, let it use these macros.
   Otherwise, undefine them to keep the namespace clean.  */
#if !defined(KWSYS_NAMESPACE)
#  undef kwsys_ns
#  undef kwsysEXPORT
#  if !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#    undef kwsysMD5
#    undef kwsysMD5_s
#    undef kwsysMD5_New
#    undef kwsysMD5_Delete
#    undef kwsysMD5_Initialize
#    undef kwsysMD5_Append
#    undef kwsysMD5_Finalize
#    undef kwsysMD5_FinalizeHex
#    undef kwsysMD5_DigestToHex
#  endif
#endif

#endif
