/*     
      PACKAGE LOADER . Magma 1.0 . 1996 . Sylvain HUET

         loadpak.h : definitions
*/
// Modification history:
//
//$ FA(13/04/2001): Define the structure of a 'native definition' as well as modified
//                  hard-loading service, PKhardpak2. (The two forms will be available
//                  for the moment...)
//$ FA(03/05/2001): Promoted to shared C/C++ header
//$ FA(12/11/2001): Extra package information included only for the developer release
//

#ifndef _LOADPAK_H_
#define _LOADPAK_H_

#include "scolPrerequisites.h"

#ifdef __cplusplus
extern "C" {
#endif

#include "scolMMemory.h"


#define PKGLP  -1   /* liste des packages deja charges */
#define PKGVAR -2   /* liste des variables du package */
#define PKGGLB -3   /* liste des variables globales d'un bytecode */
#define PKGLOC -4   /* liste des variables locales d'un bytecode */
#if defined(RELEASE_DEVELOPER)
#define PKGBPT -5   /* breakpoint position table */
#define PKGNAM -6   /* liste des variables locales d'un bytecode */
#define PKGNOD -7   /* liste des noeuds de typage */
#else
#define PKGNAM -5   /* liste des variables locales d'un bytecode */
#define PKGNOD -6   /* liste des noeuds de typage */
#endif



//$ FA(13/04/2001): Define the structure of a 'native definition'
typedef struct {
  char*  name;
  int    arity;
  char*  type;
  int    (*function)(mmachine);
} NativeDefinition;
//

/* routine ajoutant un package a une liste de packages
  en 1: liste ancienne
  en 0: nouveau package
 retourne en 0: nouvelle liste
*/
int PKaddpak(mmachine m);

/* lecture et linkage d'un package
  en 0: liste des packages deja charges
 retourne en 0: nouvelle liste
*/ 
int PKloader(mmachine m,char *name,char *simplename);

//$BB test pkg
int PKtest(mmachine m,char *name,char *simplename, char *elogs);
int PKtestS(mmachine m,char *name,char *simplename, char *elogs);

//$BLG: same as PKloader but used with _loadS/SPloadS
int BLG_PKloaderS(mmachine m,char *name,char *simplename);

/* lecture d'un package en dur
  en 0: liste des packages deja charges
 retourne en 0: nouvelle liste
*/ 
int PKhardpak(mmachine m, char *name,
              int n, char **namefun, int (**fun)(mmachine z)
              , int *nargfun, char **typfun);


//$ FA(13/04/2001): New syntax for hard-loading packages.
int PKhardpak2(mmachine m, char *name, int ndefs, NativeDefinition defs[]);
//

#ifdef __cplusplus
}
#endif

#endif // loadpak.h























