#include #include #include #include "vecteur_with_except.h" #include "memory.h" #define NB_ELEM_INITIAL 3 DEFINE_EXCEPTION(vector_too_big); DEFINE_EXCEPTION(index_out_of_range); struct vecteur { void **debut; long taille; long nombre_elements; int mode_bavard; }; vecteur vecteur_creer(void) { vecteur recv; HANDLE(memory_default, recv=memory_alloc(sizeof(struct vecteur))); if (exception_raised()) RAISE(vector_too_big); HANDLE(memory_default, recv->debut = memory_calloc(NB_ELEM_INITIAL, sizeof(void*))); if (exception_raised()) RAISE(vector_too_big); recv->taille = NB_ELEM_INITIAL; recv->nombre_elements = 0; recv->mode_bavard = 0; return recv; } void vecteur_detruire(vecteur recv) { free(recv->debut); free(recv); } void vecteur_ecrire(vecteur recv, int indice, void *valeur) { void **p; long taille = recv -> taille; while (indice >= taille) taille = 2 * taille + 1; if (taille > recv->taille) { HANDLE(memory_default, recv->debut = memory_realloc(recv->debut, taille * sizeof(void*))); if (exception_raised()) RAISE(vector_too_big); for (p = recv->debut + recv->taille; p < recv->debut + taille; p++) *p = NULL; if (recv->mode_bavard) { fprintf(stderr, ">>vecteur: extension de %d a %d\n", recv->taille, taille); } recv->taille = taille; } recv->debut[indice] = valeur; if (recv->nombre_elements < indice+1) recv->nombre_elements = indice+1; } void *vecteur_lire(vecteur recv, int indice) { if (indice < 0 || indice >= recv->nombre_elements) RAISE(index_out_of_range); return recv->debut[indice]; } int vecteur_nombre_elements(vecteur recv) { return recv->nombre_elements; } void vecteur_mode_bavard(vecteur recv, int mode) { recv->mode_bavard = mode; }