/*

This source file is part of Scol
For the latest info, see http://www.scolring.org

Copyright (c) 2010 Stephane Bisaro, aka Iri <iri@irizone.net>

This source is under the terms of the Scol License. See the COPYING included file
for more informations.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

For others informations, please contact us from http://www.scolring.org/

*/



/*
        SCOLPLUGIN.H . 1996-99 . Sylvain HUET

         definitions pour les plugins Scol
*/

//
//$ LB (13/06/2002) : added the OBJgetNewHandler function to the cbmachine
//$BLG - v5.22 : updated
//

// $Iri : comment two lines


#ifndef _SCOLPLUGIN_H_
#define _SCOLPLUGIN_H_

// $Iri
/*
#ifdef VERSION_WIN
#include <windows.h>
#include <winuser.h>
#else
#include "win2linux.h"
#endif*/
#if defined VERSION_WIN || defined __WIN32__
#include <windows.h>
#else
#include <stdio.h>
#endif

#include <stdio.h>
// #include "objstr.h"
// #include "macros.h"


/* DEFINITIONS DE TYPES ET DE CONSTANTES
  ---------------------------------------*/

#define NIL -1

/* machine virtuelle Scol */
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;
  //$BLG - v5.22: Add (was missing in file)
  int *top;			 /* top of tape */
  //$BLG - v5.22: Add
  int lckdGC;			// Locked GC flag
};
typedef struct Mmachine *mmachine;

extern mmachine mm;


/* masque pour MMmalloc : tableau d'objets ou buffer quelconque */
#define TYPETAB 1
#define TYPEBUF 0

/* definitions des erreurs */
#define MERREND     1
#define MERROK      0
#define MERRMEM    -1
#define MERRTYP    -2
#define MERRRET    -3
#define MERRNUL    -4
#define MERRNF     -5
#define MERRLINK   -6
#define MERRFULL   -7
#define MERRUNKNOWN -8
#define MERRTOOLARGE -9
//$BLG - v5.22: Add (Already existing but missing in this file)
#define MERREP        -10
#define MERRFILE      -11
#define MERRCLOSE     -12
//$BLG - v5.22: Add
#define MERRCHNLDWN   -13

/* definition des offsets objets */
#define OFFOBJMAG   0
#define OFFOBJCHN   1
#define OFFOBJTYP   2
#define OFFOBJHAND  3
#define OFFOBJTPERE 4
#define OFFOBJHPERE 5
#define OFFOBJREF0  6
#define OFFOBJUSER0 7

/* definitions des masques de message console */
#define MSKFOO     1
#define MSKRUNTIME 2
#define MSKWARNING 4
#define MSKTRACE   8
#define MSKDEBUG   16


/* types Scol predefinis */
#define TYPVAR    -1
#define TYPCONS   -2
#define TYPTYPE   -3
#define TYPFIELD  -4
#define TYPSTRUC  -5
#define TYPCONS0  -6
#define TYPCOM    -7
#define TYPCOMV   -8


/* GESTION DES FICHIERS EN SCOL
  ------------------------------*/

#define SIZESIGN 1024

struct Packdir
{
  char path[SIZESIGN];  /* se termine par '/' */
  int quota;   /* -1: read only, 0: unlimited */
  struct Packdir *next;
};
typedef struct Packdir *packdir;

#define TYPESNONE  0
#define TYPESLOGIC 1


/* FONCTIONS DU KERNEL EXPORTEES VERS LE PLUGIN
  ----------------------------------------------*/

struct CBmachine
{
int (*MMpush)(mmachine m, int val);
int (*MMpushNoGC)(mmachine m, int val);
int (*MMpull)(mmachine m);
int (*MMgetPP)(mmachine m);
void (*MMsetPP)(mmachine m,int i);
int (*MMget)(mmachine m,int i);
void (*MMset)(mmachine m,int i,int v);
int (*MMgetglobal)(mmachine m,int i);
void (*MMsetglobal)(mmachine m,int i,int v);
int (*MMgetbase)(mmachine m,int b,int i);
void (*MMsetbase)(mmachine m,int b,int i,int v);
int (*MMfetch)(mmachine m,int s,int i);
void (*MMstore)(mmachine m,int s,int i,int v);
int* (*MMstart)(mmachine m,int s);
int (*MMsize)(mmachine m,int s);
int (*MMtype)(mmachine m,int s);
char* (*MMstartstr)(mmachine m,int s);
int (*MMsizestr)(mmachine m,int s);
void (*MMsetsizestr)(mmachine m,int s,int size);
int (*MMmalloc)(mmachine m, int size, int type);
int (*MMmallocCLR)(mmachine m, int size, int type);
int (*Mpushstrbloc)(mmachine m,char *buf);
int (*MBdeftab)(mmachine m);
int (*MBstrcat)(mmachine m);
int (*PKhardpak)(mmachine m, char *name,
              int n, char **namefun, int (**fun)(mmachine z)
              , int *nargfun, char **typfun);
int (*PKloader)(mmachine m,char *name,char *simplename);
int (*SPfindfile)(packdir p,char *sign,int *size,char *path);
int (*SPaddfile)(packdir p,char *sign,int size,char *path);
int (*SCgetsrvsocket)(mmachine m, int server);
int (*SCgetsocket)(mmachine m, int channel);
int (*Mcutting)(char *comm, char **argv);
void (*MMechostr)(int i,char *buf,...);
int (*fread)(char* buf,int i,int j,FILE *f);
packdir Firstpack;
int (*OBJcreate)(mmachine m,int typ,int handsys,int typpere,int handsyspere);
int (*OBJaddreflex)(mmachine m,int typ, int num);
int (*OBJbeginreflex)(mmachine m,int typ,int handsys,int num);
int (*OBJdel)(mmachine m,int p,int flag);
int (*OBJdestroy)(mmachine m, int typ,int handsys,int objm,int flag);
int (*OBJdelTH)(mmachine m,int typ,int handsys);
int (*OBJcallreflex)(mmachine m,int nbarg);
int (*OBJregister)(int nbrefl,int recrefl,int (*destroy)(mmachine m,int handsys,int objm),char *name);
int (*OBJtypebyname)(char *name);
#if defined VERSION_WIN || defined __WIN32__
int (*OBJdefEvent)(int event,int (*cbevent)(mmachine m,HWND hwnd, unsigned msg,UINT wParam,LONG lParam,int *ret)); // $Iri
#else
int (*OBJdefEvent)(int event,int (*cbevent)(mmachine m,int hwnd, unsigned msg,int wParam,int lParam,int *ret)); // $Iri
#endif
int (*OBJgetUserEvent)();
void* (*SCgetExtra)(char *funcname);
char* (*stdloadJpg)(char *name,int *w,int *h);
int (*OBJdelTM)(mmachine m,int typ,int q);
int (*OBJfindTH)(mmachine m,int typ,int handsys);
int (*OBJfindTM)(mmachine m,int typ,int objm);
int (*Mpushstrblocn)(mmachine m,char *buf, int n);
int (*Minterpreter)(mmachine m);
int (*Msearchinsyspak)(mmachine m, char *name);
int (*MBstrcatn)(mmachine m);
int (*Buffer2texture)(mmachine m, char *buffer, int width, int height);
void (*MMputs)(int i, const char* text);

//$ LB (13/06/2002)
int (*OBJgetNewHandler)();


};
typedef struct CBmachine *cbmachine;

extern cbmachine ww;


#define SCOLinitplugin(X) ww=X

#define MMpush (ww->MMpush)
#define MMpushNoGC (ww->MMpushNoGC)
#define MMpull (ww->MMpull)
#define MMgetPP (ww->MMgetPP)
#define MMsetPP (ww->MMsetPP)
#define MMget (ww->MMget)
#define MMset (ww->MMset)
#define MMgetglobal (ww->MMgetglobal)
#define MMsetglobal (ww->MMsetglobal)
#define MMgetbase (ww->MMgetbase)
#define MMsetbase (ww->MMsetbase)
#define MMfetch (ww->MMfetch)
#define MMstore (ww->MMstore)
#define MMstart (ww->MMstart)
#define MMsize (ww->MMsize)
#define MMtype (ww->MMtype)
#define MMstartstr (ww->MMstartstr)
#define MMsizestr (ww->MMsizestr)
#define MMsetsizestr (ww->MMsetsizestr)
#define MMmalloc (ww->MMmalloc)
#define MMmallocCLR (ww->MMmallocCLR)
#define Mpushstrbloc (ww->Mpushstrbloc)
#define MBdeftab (ww->MBdeftab)
#define MBstrcat (ww->MBstrcat)
#define PKhardpak (ww->PKhardpak)
#define PKloader (ww->PKloader)
#define SPfindfile (ww->SPfindfile)
#define SPaddfile (ww->SPaddfile)
#define SCgetsrvsocket (ww->SCgetsrvsocket)
#define SCgetsocket (ww->SCgetsocket)
#define Mcutting (ww->Mcutting)
#define MMechostr (ww->MMechostr)
//#define fread (ww->fread)
#define Firstpack (ww->Firstpack)
#define OBJcreate (ww->OBJcreate)
#define OBJaddreflex (ww->OBJaddreflex)
#define OBJbeginreflex (ww->OBJbeginreflex)
#define OBJdel (ww->OBJdel)
#define OBJdestroy (ww->OBJdestroy)
#define OBJdelTH (ww->OBJdelTH)
#define OBJcallreflex (ww->OBJcallreflex)
#define OBJregister (ww->OBJregister)
#define OBJtypebyname (ww->OBJtypebyname)
#define OBJdefEvent (ww->OBJdefEvent) // $Iri
#define OBJgetUserEvent (ww->OBJgetUserEvent)
#define SCgetExtra (ww->SCgetExtra)
#define stdloadJpg (ww->stdloadJpg)
#define OBJdelTM (ww->OBJdelTM)
#define OBJfindTH (ww->OBJfindTH)
#define OBJfindTM (ww->OBJfindTM)
#define Mpushstrblocn (ww->Mpushstrblocn)
#define Minterpreter (ww->Minterpreter)
#define Msearchinsyspak (ww->Msearchinsyspak)
#define MBstrcatn (ww->MBstrcatn)
#define Buffer2texture (ww->Buffer2texture)
#define MMputs (ww->MMputs)

//$ LB (13/06/2002)
#define OBJgetNewHandler (ww->OBJgetNewHandler)


#endif
