#include <object.h>
#include <stdio.h>
#include <stdlib.h>
/* Pour les nouveaux numeros d'identificateurs d'objects */
uint32 current_obj_num = 0;
/*****************************************************************/
/* Renvoi le numero de type qui correspond a un object tout con */
/* chaque autre type d'object (button, window...) doit avoir son */
/* propre numero ainsi que sa propre fonction sur le meme type. */
uint32 object_type(void)
{ static uint32 object_type_num = 0;
if(object_type_num == 0)
{
object_type_num = object_num_new;
}
return(object_type_num);
}
/*****************************************************************/
void object_free(obj_ofs *this)
{
free(this);
}
/***********************************************************/
/* initialise un object (utile pour les object qui herite) */
/* qui doivent appeler init avant de faire leur propre */
/* initialisation specifique ou de surcharge. */
void object_init(obj_ofs *this)
{ int i;
object *vobject;
/* si on veut acceder a un champ de object */
for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != object_type());i++);
/* on peut meme faire une petite verification dynamique de l'objet */
/* pour verifier si cet objet peut bien etre considere comme un "object" */
if(this[i].obj_type == 0)
{
fprintf(stderr,"object_init (object.c) : invalide object\n");
exit(2);
}
vobject = (object *)this[i].ofs;
/* on initialise les attributs et les methodes */
vobject->free = object_free;
}
/***********************************************************/
/******************/
/* cree un object */
obj_ofs *object_new(void)
{ obj_ofs *vobj_table;
pointer mem;
/* allocation de la memoire pour l'objet */
if((mem = (pointer)malloc(sizeof(obj_ofs)*2+sizeof(object))) == NULL)
{ perror("malloc failed "); exit(1); }
/* table des objets */
vobj_table = (obj_ofs *)mem;
/* pour la partie uniquement object */
vobj_table[0].obj_type = object_type();
vobj_table[0].ofs = mem + sizeof(obj_ofs)*2;
/* le dernier sert a delimiter la table des objets */
/* aucun objet n'est identifie par la clee 0 donc pas d'ambiguite */
vobj_table[1].obj_type = 0;
/* on fait appel au constructeur de l'objet object */
object_init(vobj_table);
/* et voila un nouvel objet */
return(vobj_table);
}
/******************/