/*     
      LABEL LIST MANAGER . Magma 1.0 . 1996 . Sylvain HUET

         gestion de listes de labels pour la compilation
	 
	 definitions.
*/
//
// Modification history:
//$ FA(19/06/2001): Debugger integration. Add OFFPKID entry
//$ FA(19/06/2001): Debugger integration. Add new OFFVxxx entries
//$ FA(27/10/2001): Add initial environment optimisation functions
//$ FA(12/11/2001): Runtime information for VARs and packages is include
//    if RELEASE_DEVELOPER is defined
//

#include "debug.h"

/* definition d'une liste de label */
#define SIZELISTB 3
#define OFFLBNAME 0
#define OFFLBNUM  1
#define OFFLBNEXT 2

/* definition d'un bloc variable globale */
#if defined(RELEASE_DEVELOPER)
#  define SIZEVAR  8
#else
#  define SIZEVAR  6
#endif
#define OFFVNAME   0
#define OFFVVAL    1
#define OFFVTYP    2
#define OFFVSTYP   3
#define OFFVNEXT 4  
//$ FA(08/11/2000)
#define OFFVPKG    5    // reference to defining package
#if defined(RELEASE_DEVELOPER)
//$ FA(08/11/2000)
#  define OFFVID   6    // unique object (var) id
//$ FA(20/06/2001)
#  define OFFVSIZE 7    // size (only used for functions)
#endif
//

#define TYPVAR    -1
#define TYPCONS   -2
#define TYPTYPE   -3
#define TYPFIELD  -4
#define TYPSTRUC  -5
#define TYPCONS0  -6
#define TYPCOM    -7
#define TYPCOMV   -8

/* definition d'un package */
#if defined(RELEASE_DEVELOPER)
#  define SIZEPAK    5
#else
#  define SIZEPAK    3
#endif
#define OFFPKNAME    0
#define OFFPKINTRN   1
#define OFFPKTYP     2
#if defined(RELEASE_DEVELOPER)
//$ FA(29/11/2000)
#  define OFFPKID    3  // unique package id
//$ FA(19/06/2001)
#  define OFFPKSIZE  4  // size of compiled package
#endif
//

#define PKUNSHARE 0
#define PKSHARE   1

/* definition d'une liste */
#define SIZELIST 2
#define OFFLVAL  0
#define OFFLNEXT 1

/* empilement d'une chaine de caracteres */
int Mpushstring(mmachine m,char *name);

/* empilement d'une chaine de caracteres avec caracteres speciaux
   la chaine commence et finit par des guillemets */
int Mpushstrtok(mmachine m,char *name);

/* empilement d'une chaine sous forme de bloc */
int Mpushstrbloc(mmachine m,char *buf);

/* empilement d'une chaine sous forme de bloc */
int Mpushstrblocn(mmachine m,char *buf,int l);

/* ajout d'un label dans une liste, avec test d'unicite */
int Maddlabel(mmachine m, int first, char *name, int num);

/* suppression des n premiers elements de la liste */
int Mdelnlabel(mmachine m, int first, int n);

/* recherche d'un label dans une liste
   (retourne -1 si introuvable) */
int Msearchlabel(mmachine m, int first, char *name);

int Mnbvar(mmachine m,int i);

int Mnthvar(mmachine m,int i,int n);

/* ajout d'une variable dans une liste, avec test d'unicite */
int Maddvar(mmachine m, int first, char *name, int typ);

/* recherche d'une variable dans une liste
   (retourne l'adresse dans la bande, ou NIL si introuvable) */
int Msearchvar(mmachine m, int first, char *name);

/* recherche un package dans une liste */
int Msearchpak(mmachine m, int first, char *name);

/* recherche une variable dans une liste de packages */
int Msearchinpak(mmachine m, int first, char *name);

/* recherche une variable dans les package systeme */
int Msearchinsyspak(mmachine m, char *name);

/* recherche d'une variable de type dans une liste
   (retourne l'adresse dans la bande, ou NIL si introuvable) */
int Msearchvartyp(mmachine m, int first, char *name);

/* recherche une variable de type dans une liste de packages */
int Msearchtypinpak(mmachine m, int first, char *name);

// Regenerates the initial environment in a hash table
int createInitialEnvironment(mmachine m);

// Prints the initial environment (expected as a hash table)
void printInitialEnvironment(mmachine m);
