#ifndef __MSHELL_H
#define __MSHELL_H

#ifdef XVT_OS

#ifdef __cplusplus
extern "C" {
#endif

#if XVT_OS == XVT_OS_NOTUSED

#define ALIGNSIZE               sizeof(double)
#define CALCSIZE(x)     ((((x) + (ALIGNSIZE - 1)) / ALIGNSIZE) * ALIGNSIZE)

#define malloc(a)                       win_malloc((a))
#define realloc(a,b)    win_realloc((a), (b))
#define free(a)                         win_free((a))
#define calloc(a,b)             win_calloc((a), (b))
#define strdup(a)                       win_strdup((a))

  void setmemsize(long);
  char* win_malloc(size_t);
  char* win_realloc(char*, size_t);
  void win_free(char*);
  char* win_calloc(size_t, size_t);
  char* win_strdup(char*);

#else 

  /*
     #define    malloc(a)                       xvt_fmalloc((a))
     #define    realloc(a,b)    xvt_frealloc((a), (b))
     #define    free(a)                         xvt_ffree((a))
     #define    calloc(a,b)             xvt_calloc((a), (b))
     #define    strdup(a)                       xvt_strdup((a))
     #define    setmemsize(a)   

     char *xvt_calloc(size_t, size_t);
     char *xvt_strdup(char*);
     */

#endif

#ifdef __cplusplus
};
#endif

#else

#define size_t  unsigned

#define MEMLIST
#define MEMWHERE

/* interface functions */
unsigned long   memused(void);
void                                    memdisplay(FILE *);                                     

/* interface macros */
#define ALIGNSIZE               sizeof(double)
#define CALCSIZE(x)     ((((x) + (ALIGNSIZE - 1)) / ALIGNSIZE) * ALIGNSIZE)

/* interface functions to access only through macros */
#ifdef MEMWHERE
#ifdef __cplusplus
extern "C" {
#endif
  char  *memalloc(size_t, char *, int);
  char  *memrealloc(char *, size_t, char *, int);
  void  memfree(char *, char *, int);
  char  *memcalloc(size_t, size_t, char *, int);
  char  *memstrdup(char *, char *, int);
#else
  char  *memalloc(size_t);
  char  *memrealloc(char *);
  void  memfree(char *);
  char  *memcalloc(size_t, size_t);
  char  *memstrdup(char *);
#ifdef __cplusplus
};
#endif
#endif

/* Interface macros */
#ifndef __MSHELL__
#ifdef MEMWHERE
#define malloc(a)                       memalloc((a), __FILE__, __LINE__)
#define realloc(a,b)    memrealloc((a), (b),  __FILE__, __LINE__)
#define free(a)                         memfree((a), __FILE__, __LINE__)
#define calloc(a,b)             memcalloc((a), (b),  __FILE__, __LINE__)
#define strdup(a)                       memstrdup((a),  __FILE__, __LINE__)
#else
#define malloc(a)                       memalloc((a))
#define realloc(a,b)    memrealloc((a), (b))
#define free(a)                         memfree((a))
#define calloc(a,b)             memcalloc((a), (b))
#define strdup(a)                       memstrdup((a))
#endif
#endif
#endif /* XVT_OS */
#endif /* __MSHELL_H */
