/*     
      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 _SCOL_MMEMORY_H_
#define _SCOL_MMEMORY_H_

#include <scolPrerequisites.h>
#include <scolMachine.h>

#ifdef __cplusplus
extern "C"
{
#endif
#include <scolErrorCodes.h>
#include <scolConstants.h>

/*
   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
