#ifndef H_ED_SYSALLOC_20030409083326
#define H_ED_SYSALLOC_20030409083326

#ifdef __cplusplus
extern "C"
{
#endif

/* ---------------------------------------------------------------------
   (c) ED 1999-2008
   Projet       : CLIB
   Fonction     : Interface pour redefinitions de malloc / calloc / free.
   Module       : SYSALLOC
   Fichier      : SYSALLOC.H
   Creation     : 10-10-1999
   Modification : 27-08-2008
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Journal

   1.22 du 27-08-2008 Dans sys_free() : traitements avant free() véritable.
   .                  Ajout de sys_mem_sver() et sys_mem_sid()
   .                  Mise au point compteur d'allocation
   1.21 du 06-04-2008 Mise au point du mode SYS_MEMCHK=0
   1.20 du 05-04-2008 Suppression eMEM
   1.19 du 25-02-2008 ajoute macro strdup()
   1.18 du 29-04-2005 'line' devient int au lieu de size_t
   1.17 du 08-12-2003 sys_init(), sys_trace() et sys_counters() deviennent
   .                  sys_mem_*()
   1.16 du 11-07-2003 Ajout de sys_counters()
   .                  deplace sys_time() et sys_clock() dans sys.h/c
   .                  Prise en compte du compilateur DIAB
   1.15 du 16-05-2003 Mise au point realloc() et free()
   1.14 du 04-04-2003 Ajoute FREE()
   1.13 du 11-12-2002 Ajoute un #include <alloc.h> preventif
   1.12 du 08-12-2002 Ajoute macro realloc(). Mise au point realloc()
   1.11 du 11-10-2002 Ajoute macro SYS_INIT()
   1.10 du 13-07-2002 LCLint
   1.9 du 24-04-2002 Dans la trace, ajout du nombre de bytes liberes
   1.8 du 03-09-2001 Ajout de la macro SYS_MEMCHK
   1.7 du 17-01-2001 Ajoute un parametre "cfg" a sys_mem_init()
   1.6 du 02-08-2000 deplace le _ a la fin pour etre conforme a l'ISO
   1.5 du 12-04-2000 Ajout de sys_clock() et sys_time()
   1.4 du 17-01-2000 remplace 'fred' par 'freed'
   1.3 du 08-12-1999 Suppression de MEM_VOL
   1.2 du 23-11-1999 Matching en TR. Optimisation
   1.1 du 19-11-1999 Ajout d'un traceur
   1.0 du 10-10-1999 Version operationelle
   0.0 du 10-10-1999 Creation
   --------------------------------------------------------------------- */
/* protection contre les clashes avec les <alloc.h> declares apres */
#ifdef __BORLANDC__
#include <alloc.h>
#endif
#include <stdlib.h>

/* macros ============================================================== */

#define SYS_MEMCHK 1            /* 0=stdlib | 1=sysalloc */

/* au cas ou strdup() soit deja une macro, j'aurais le dernier mot... */
#include <string.h>
#if SYS_MEMCHK
#include "ed/inc/str.h"
#define strdup(s) STR_dup(s)
#endif


#define SYS_INIT(trace, sts) \
   sys_mem_init (trace, sizeof trace, TRACE_##sts, NULL)


/* constants =========================================================== */

   typedef enum
   {
      TRACE_OFF,
      TRACE_ON,
      TRACE_NB
   }
   eTRACE;

/* types =============================================================== */
/* structures ========================================================== */
/* entry points ======================================================== */

/* ---------------------------------------------------------------------
   sys_malloc()
   ---------------------------------------------------------------------
   Demander un bloc de donnees
   ---------------------------------------------------------------------
   E : taille en octets
   S : adresse ou NULL
   --------------------------------------------------------------------- */
   void *sys_malloc (size_t const len
                     ,char const *const szFile
                     ,int const line);
#define sys_malloc_x(size) \
        sys_malloc (size, __FILE__, __LINE__)

/* ---------------------------------------------------------------------
   sys_calloc()
   ---------------------------------------------------------------------
   Demander un bloc de donnees
   ---------------------------------------------------------------------
   E : taille en octets
   S : adresse ou NULL
   --------------------------------------------------------------------- */
   void *sys_calloc (size_t const len
                     ,size_t const nb
                     ,char const *const szFile
                     ,int const line);
#define sys_calloc_x(size, nb) \
        sys_calloc (size, nb, __FILE__, __LINE__)

/* ---------------------------------------------------------------------
   sys_realloc()
   ---------------------------------------------------------------------
   Demander un bloc de donnees
   ---------------------------------------------------------------------
   E : ancien bloc
   E : taille en octets
   S : adresse ou NULL
   --------------------------------------------------------------------- */
   void *sys_realloc (void *const pOld
                      ,size_t const len
                      ,char const *const szFile
                      ,int const line);
#define sys_realloc_x(p_, size_) \
        sys_realloc (p_, size_, __FILE__, __LINE__)

/* ---------------------------------------------------------------------
   sys_free()
   ---------------------------------------------------------------------
   Role :
   ---------------------------------------------------------------------
   E : adresse
   S :
   --------------------------------------------------------------------- */
   void sys_free (void *const p
                  ,char const *const szFile
                  ,int const line);
#define sys_free_x(p_) \
        sys_free (p_, __FILE__, __LINE__)

/* ---------------------------------------------------------------------
   sys_mem_init()
   ---------------------------------------------------------------------
   Role :
   ---------------------------------------------------------------------
   E : adresse du buffer
   E : longueur du buffer en byte
   E : Flag de trace
   E : Config eventuelle
   S :
   --------------------------------------------------------------------- */
   void sys_mem_init (void *buf, size_t len, eTRACE trace, void const *pCfg);

/* ---------------------------------------------------------------------
   sys_mem_trace()
   ---------------------------------------------------------------------
   Role : Lister le journal des allocations memoire
   index | adresse | taille | action | memoire restante apres l'action
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
   void sys_mem_trace (void);

/* ---------------------------------------------------------------------
   sys_mem_counters()
   ---------------------------------------------------------------------
   Role : Lister les compteurs d'allocation.

   count.malloc   : 99999 (including count.calloc: 99999)
   count.free     : 99999
   count.allocated:
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
   void sys_mem_counters (void);

/* ---------------------------------------------------------------------
   sys_mem_sver()
   ---------------------------------------------------------------------
   Role : retourner la chaine de caracteres 'version'
   ---------------------------------------------------------------------
   E :
   S : adresse de la chaine litterale 'version'
   --------------------------------------------------------------------- */
   char const *sys_mem_sver (void);

/* ---------------------------------------------------------------------
   sys_mem_sid()
   ---------------------------------------------------------------------
   Role : retourner la chaine de caracteres 'identification'
   ---------------------------------------------------------------------
   E :
   S : adresse de la chaine litterale 'identification'
   --------------------------------------------------------------------- */
   char const *sys_mem_sid (void);

#if !SYS_MEMCHK
#undef sys_mem_init
#define sys_mem_init(a,b,c,d)

#undef sys_mem_trace
#define sys_mem_trace()

#undef sys_malloc
#define sys_malloc(a,b,c) malloc(a)

#undef sys_calloc
#define sys_calloc(a,b,c,d) calloc(a, b)

#undef sys_realloc
#define sys_realloc(a, b) realloc(a, b)

#undef sys_free
#define sys_free(a) free (a)

#include <stdlib.h>
#else
#ifdef DBG_SYSALLOC             /* to be defined externally */
#define malloc(a) sys_malloc_x(a)
#define calloc(a, b) sys_calloc_x(a, b)
#define realloc(a, b) sys_realloc_x(a, b)
#define free(a) sys_free_x (a)
#endif
#endif

#define FREE(p) (free((void *)(p)),(p)=NULL)

/* File generated by 'NEW.EXE' Ver 1.19 (c) ED 1998-99 */


#ifdef __cplusplus
}
#endif

#endif                          /* H_ED_SYSALLOC_20030409083326 */

/* Guards added by GUARD (c) ED 2000-2003 Feb 14 2003 Ver. 1.5 */
