/*     
      MEMORY MANAGER . Magma 1.0 . 1996 . Sylvain HUET

         definitions
*/
// Modifications history
//
//$ FA(27/03/2001): Add #ifndef-#endif for conditional include
//$ FA(19/04/2001): Added error #definitions
//$ FA(19/04/2001): Added console message mask #definitions
//$ FA(02/05/2001): Promote to shared C/C++ header file
//$ FA(06/06/2001): Add conditional definition of Mmachine struct


#ifndef MMEMORY_H
#define MMEMORY_H

#ifdef __cplusplus
extern "C" {
#endif

#define SizeWord 4
#define SizeHeader 3

#define NIL -1

/* masque pour MMmalloc : tableau d'objets ou buffer quelconque */
#define TYPETAB 1
#define TYPEBUF 0

#ifndef SCOL_MMACHINE_DEFINED
struct Mmachine
{
  int *tape;     /* pointeur vers la bande       */
  int sizetape;  /* taille de la bande (en mots) */
  int pp;        /* pointeur de pile             */
  int maxpp;     /* valeur max de pp             */
  int topheap;   /* sommet du tas                */
  int sigGC;     /* distance declenchant le GC   */
  int h;         /* position header courant      */
  int err;
  int *top;		/* top of tape */
};
typedef struct Mmachine *mmachine;
#define SCOL_MMACHINE_DEFINED
#endif

// Error constants
#define MERREND         1
#define MERROK          0
#define MERRMEM        -1
#define MERRTYP        (merrlog(__LINE__,__FILE__,-2))
#define MERRRET        -3
#define MERRNUL        -4
#define MERRNF         -5
#define MERRLINK       -6
#define MERRFULL       -7
#define MERRUNKNOWN    -8
#define MERRTOOLARGE   -9
#define MERREP        -10
#define MERRFILE      -11
#define MERRCLOSE     -12

int merrlog(int line, char *file, int ret);

// Console message mask constants
#define MSKFOO     1
#define MSKRUNTIME 2
#define MSKWARNING 4
#define MSKTRACE   8
#define MSKDEBUG   16



/*
   Initialisation d'une machine : la taille de la bande est donnee en mots
        retourne -1 si erreur, 0 si succes.
*/
int MMinimachine(mmachine m, int size);

/*
   Garbage Collector d'une machine
*/
int MMgc(mmachine m);

/*
   Empilement d'un nouvel objet
        retourne -1 si erreur, 0 si succes.
*/
int MMpush(mmachine m, int val);

/*
   Empilement d'un nouvel objet sans GC : a utiliser avec precaution
        retourne 0
*/
int MMpushNoGC(mmachine m, int val);

/*
   Depile un objet
*/
int MMpull(mmachine m);

/* Lit la valeur du pointeur de pile */
int MMgetPP(mmachine m);

/* Ecrit la valeur du pointeur de pile */
void MMsetPP(mmachine m,int i);

/*
   Lit un etage de la pile, sans le depiler
*/
int MMget(mmachine m,int i);

/*
   Ecrit un etage de la pile, sans le depiler
*/
void MMset(mmachine m,int i,int v);

/*
   Lit une variable globale
*/
int MMgetglobal(mmachine m,int i);

/*
   Ecrit une variable globale
*/
void MMsetglobal(mmachine m,int i,int v);

/*
   Lit un champ de la pile, a partir d'une base donee
*/
int MMgetbase(mmachine m,int b,int i);

/*
   Ecrit un champ de la pile, a partir d'une base donnee
*/
void MMsetbase(mmachine m,int b,int i,int v);

/*
   Lit un champ d'un bloc TAB
*/
int MMfetch(mmachine m,int s,int i);

/*
   Ecrit un champ d'un bloc TAB
*/
void MMstore(mmachine m,int s,int i,int v);

/*
   Recupere un pointeur vers le debut d'un bloc BUF
*/
int* MMstart(mmachine m,int s);

/*
   Donne la taille en "int" d'un bloc BUF ou TAB
*/
int MMsize(mmachine m,int s);

/*
   Donne le type d'un bloc BUF ou TAB -> TYPEBUF ou TYPETAB
*/
int MMtype(mmachine m,int s);

/*
   Recupere un pointeur vers le debut d'une chaine de caracteres
*/
char* MMstartstr(mmachine m,int s);

/*
   Recupere la taille d'une chaine de caracteres
*/
int MMsizestr(mmachine m,int s);

/*
   Regle la taille d'une chaine de caracteres
*/
void MMsetsizestr(mmachine m,int s,int size);

/*
   Fonctions de transfert Objet <-> Int ou Pointer
*/
int ITOO(int i);
int PTOO(int p);
int OTOI(int i);
int OTOP(int p);

/*
   Alloue un bloc dans le tas : la taille est donnee en mots
    le bloc est initialise selon type
    retourne -1 si echec, sinon retourne le pointeur
*/
int MMmalloc(mmachine m, int size, int type);

/*
   Idem Malloc, avec mise a zero du bloc
    retourne -1 si echec, sinon retourne le pointeur
*/
int MMmallocCLR(mmachine m, int size, int type);

/*
   Creation d'un fichier core (retourne 0 si succes)
*/
int MMcore(mmachine m);


extern char MMbuf[1024];
void MMechostr(int i,char *format, ...);

#ifdef __cplusplus
}
#endif

#endif // mmemory.h










