#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); } /******************/