/*     
      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

#include "scolPrerequisites.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 */
  //$BLG - v5.22: Add
  int lckdGC;			// Locked GC flag
};
typedef struct Mmachine *mmachine;
#define SCOL_MMACHINE_DEFINED
#endif

//$BLG - v5.22: Add (Documented messages)
// Error constants
#define MERREND         1
#define MERROK          0
#define MERRMEM        -1																		// Out of memory
#define MERRTYP        (merrlog(__LINE__,__FILE__,-2))			// Syntax error
#define MERRRET        -3																		// Return error (wrong bytecode)
#define MERRNUL        -4																		// Division by zero
#define MERRNF         -5																		// File or function not found
#define MERRLINK       -6																		// Link error
#define MERRFULL       -7																		// Server full ? (never used in code)
#define MERRUNKNOWN    -8																		// Unknown
#define MERRTOOLARGE   -9																		// Index too large
#define MERREP        -10																		// Empty prototype
#define MERRFILE      -11																		// Cannot write file
#define MERRCLOSE     -12																		// Closed machine
//$BLG - v5.22: Add
#define MERRCHNLDWN   -13																		// Channel down

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
