/*
 *
 *  Copyright (C) 1994-2017, OFFIS e.V.
 *  All rights reserved.  See COPYRIGHT file for details.
 *
 *  This software and supporting documentation were developed by
 *
 *    OFFIS e.V.
 *    R&D Division Health
 *    Escherweg 2
 *    D-26121 Oldenburg, Germany
 *
 *
 *  Module:  ofstd
 *
 *  Author:  Andreas Barth
 *
 *  Purpose: common defines for configuration
 *
 */

#ifndef OFDEFINE_H
#define OFDEFINE_H

#include "dcmtk/config/osconfig.h"    /* make sure OS specific configuration is included first */
#include "dcmtk/ofstd/ofcast.h"
#include "dcmtk/ofstd/ofexport.h"

#define INCLUDE_CSTRING
#include "dcmtk/ofstd/ofstdinc.h"


#ifdef ofstd_EXPORTS
#define DCMTK_OFSTD_EXPORT DCMTK_DECL_EXPORT
#else
#define DCMTK_OFSTD_EXPORT DCMTK_DECL_IMPORT
#endif


#ifdef HAVE_BZERO
#ifndef HAVE_PROTOTYPE_BZERO
BEGIN_EXTERN_C
extern void bzero(char* s, int len);
END_EXTERN_C
#endif
#endif


/* memzero */
#ifdef HAVE_MEMSET
#  undef memzero
#  define memzero(d, n) memset((d), 0, (n))
#  define HAVE_MEMZERO /* This makes using this easier */
#else
#  ifdef HAVE_BZERO
#    undef memzero
// some platforms, e.g. OSF1, require the first parameter to be char *.
#    define memzero(d, n) bzero(OFstatic_cast(char *, d), (n))
#    define HAVE_MEMZERO /* This makes using this easier */
#  endif
#endif

/* memcpy */
#ifndef HAVE_MEMCPY
#  ifdef HAVE_BCOPY
#    undef memcpy
#    define memcpy(d, s, n) bcopy((s), (d), (n))
#    define HAVE_MEMCPY /* This makes using this easier */
#  endif
#endif

/* memmove */
#ifndef HAVE_MEMMOVE
#  ifdef HAVE_BCOPY
#    undef memmove
#    define memmove(d, s, n) bcopy ((s), (d), (n))
#    define HAVE_MEMMOVE /* This makes using this easier */
#  endif
#endif

/* memcmp */
#ifndef HAVE_MEMCMP
#  ifdef HAVE_BCMP
#    undef memcmp
#    define memcmp(d, s, n) bcmp((s), (d), (n))
#    define HAVE_MEMCMP /* This makes using this easier */
#  endif
#endif

/* strchr, strrchr */
#ifndef HAVE_STRCHR
#  ifdef HAVE_INDEX
#    undef strchr
#    define strchr index
#    undef strrchr
#    define strrchr rindex
#    define HAVE_STRCHR  /* This makes using this easier */
#    define HAVE_STRRCHR /* This makes using this easier */
#  endif
#endif

/* define OFconstexpr to 'constexpr' or '' if not supported */
#ifdef HAVE_CXX11
#define OFconstexpr constexpr
#else // C++11
#define OFconstexpr
#endif // NOT C++11

#endif
