/*!\file gfstdlib.h
 *
 * \brief Fonctions et fonctionnalités standards. (ASTDLIB (amsi)
 * renommée GFSTDLIB (grafeet) le 29/04/13)
 *
 * \author Farès BELHADJ amsi@grafeet.fr (ou amsi@ai.univ-paris8.fr)
 * \date April 04, 2008
 */
#ifndef _GFSTDLIB_H
#define _GFSTDLIB_H

#if !defined(_MSC_VER) && !defined(__cdecl)
    /* Define __cdecl for non-Microsoft compilers. */
#   define __cdecl
#   define __declspec(type)
#endif
#ifndef _CRTIMP
#   ifdef _NTSDK
       /* Definition compatible with NT SDK */
#      define _CRTIMP
#   else
       /* Current definition */
#      ifdef _DLL
#         define _CRTIMP __declspec(dllimport)
#      else
#         define _CRTIMP
#      endif
#   endif
#endif

#ifndef DLLSPEC
#   define DLLSPEC dllimport
#else
#   undef DLLSPEC
#   define DLLSPEC dllexport
#endif

#if defined(_WIN32)
#  ifndef _CRT_SECURE_NO_WARNINGS
#    define _CRT_SECURE_NO_WARNINGS
#  endif
#  ifndef _CRT_NONSTDC_NO_DEPRECATE
#    define _CRT_NONSTDC_NO_DEPRECATE
#  endif
#  ifndef inline
#    define inline __inline
#  endif
#  ifndef __func__
#    define __func__ "FUNC"
#  endif
#  ifndef snprintf
#    define snprintf sprintf_s
#  endif
#endif

#if defined(_WIN32)
#  ifndef ALL_IN_ONE
#    define GFSTDLIBAPI extern __declspec(DLLSPEC)
#    define GFSTDLIBAPIENTRY __cdecl
#  else
#  define GFSTDLIBAPI
#  define GFSTDLIBAPIENTRY
#  endif
#  define strcasecmp( s1, s2 ) strcmpi( s1, s2 )
#  define strncasecmp( s1, s2, n ) strnicmp( s1, s2, n )
#  ifndef _CRT_NONSTDC_NO_DEPRECATE
#    define _CRT_NONSTDC_NO_DEPRECATE
#  endif
#  ifndef _CRT_SECURE_NO_WARNINGS
#    define _CRT_SECURE_NO_WARNINGS
#  endif
#else
#  define __stdcall
#  define __cdecl
#  define GFSTDLIBAPI extern
#  define GFSTDLIBAPIENTRY
#endif


#define SAME_P2D(p1, p2) (((int)(p1).x == (int)(p2).x) && ((int)(p1).y == (int)(p2).y))
#ifdef MIN
#  undef MIN
#endif
#ifdef MIN3
#  undef MIN3
#endif
#ifdef MIN4
#  undef MIN4
#endif
#ifdef MAX
#  undef MAX
#endif
#ifdef MAX3
#  undef MAX3
#endif
#ifdef MAX4
#  undef MAX4
#endif
#ifdef SIGNE
#  undef SIGNE
#endif
#ifdef SIGN
#  undef SIGN
#endif
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN3(a, b, c) ( ((a) < (b)) ? (((a) < (c)) ? (a) : (c)) : (((b) < (c)) ? (b) : (c)) )
#define MAX3(a, b, c) ( ((a) > (b)) ? (((a) > (c)) ? (a) : (c)) : (((b) > (c)) ? (b) : (c)) )
#define MIN4(a, b, c, d) ((a) < (b)) ? \
            (((a) < (c) ? ((a) < (d) ? (a) : (d)) : ((c) < (d) ? (c) : (d)))) :\
            (((b) < (c) ? ((b) < (d) ? (b) : (d)) : ((c) < (d) ? (c) : (d))))
#define MAX4(a, b, c, d) ((a) > (b)) ? \
            (((a) > (c) ? ((a) > (d) ? (a) : (d)) : ((c) > (d) ? (c) : (d)))) :\
            (((b) > (c) ? ((b) > (d) ? (b) : (d)) : ((c) > (d) ? (c) : (d))))
#define SIGNE(i) ((i) > 0 ? 1 : -1)
#define  SIGN(i) ((i) > 0 ? 1 : -1)

#if (DEBUG_LEVEL > 0)
#  define DEBUG fprintf
#else
#  define DEBUG if(0) fprintf
#endif

#define false 0
#define true  1

/* #define CAPTURE_FREQ 5000 */

#ifndef CAPTURE_FREQ
#define SET_ELEV(d, x, y, elv) do { (d)->data[y][x].e = (elv); } while(0)
#else
#define SET_ELEV(d, x, y, elv) do { static int cmp = 0; (d)->data[y][x].e = (elv); if(++cmp == CAPTURE_FREQ) { demCaptureProcess((d), "captures"); cmp = 0; } } while(0)
#endif 

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(_WIN32)
typedef int boolean;
#endif

GFSTDLIBAPI int    GFSTDLIBAPIENTRY log2i(long int v);
GFSTDLIBAPI double GFSTDLIBAPIENTRY u_rand(void);
GFSTDLIBAPI double GFSTDLIBAPIENTRY su_rand(void);
GFSTDLIBAPI double GFSTDLIBAPIENTRY g_rand(void);
GFSTDLIBAPI void   GFSTDLIBAPIENTRY initTime0(void);
GFSTDLIBAPI double GFSTDLIBAPIENTRY getElapsedTime(void);
GFSTDLIBAPI void   GFSTDLIBAPIENTRY initTime(void);
GFSTDLIBAPI double GFSTDLIBAPIENTRY getTime(void);
GFSTDLIBAPI double GFSTDLIBAPIENTRY getFps(void);
GFSTDLIBAPI int    GFSTDLIBAPIENTRY mv(const char * src, const char * dst);
GFSTDLIBAPI char * GFSTDLIBAPIENTRY pathOf(const char * path);
GFSTDLIBAPI char * GFSTDLIBAPIENTRY filenameOf(const char * path);

#ifdef __cplusplus
}
#endif

#endif
