#include #include #include #include #include #include #include "vector.h" sem_t fifo; sem_t mutex_g; sem_t mutex_l; int nl=0; /** Renvoie un pointeur vers un nouveau vecteur vide ou bien NULL s'il y a eu un probleme. */ struct vector_t *newVec() { struct vector_t *pv = calloc(sizeof(struct vector_t), 1); sem_init(&fifo, 0, 1); sem_init(&mutex_g, 0, 1); sem_init(&mutex_l, 0, 1); nl=0; return pv; } /** Libere toutes les structures de donnees accessible a partir de pv. Libere egalement la zone pointee par pv */ void deleteVec(struct vector_t *pv) { // Inutile pour l'exercice 2 } /** Ajoute une copie de la string s a la fin du vecteur pv. Renvoie le rang dans le vecteur de la chaine ajoutee ou bien -1 s'il y a eu un problème. */ int pushBack(struct vector_t *pv, char *s) { sem_wait(&fifo); sem_wait(&mutex_g); sem_post(&fifo); pv->elem = realloc(pv->elem, (pv->nbElem+1)*sizeof(char*)); if (pv->elem == NULL) { sem_post(&mutex_g); return -1; } pv->elem[pv->nbElem] = malloc(strlen(s)+1); if (pv->elem[pv->nbElem] == NULL) { sem_post(&mutex_g); return -1; } strcpy(pv->elem[pv->nbElem], s); pv->nbElem++; int retval = pv->nbElem - 1; sem_post(&mutex_g); return retval; } /** Renvoie l'element place a la case rank dans pv ou NULL si rank est en dehors des bornes de pv. */ char *getElem(const struct vector_t *pv, int rank) { sem_wait(&fifo); sem_wait(&mutex_l); nl++; if(nl == 1) { sem_wait(&mutex_g); } sem_post(&mutex_l); sem_post(&fifo); char* retval; if ((rank < 0) || (rank >= pv->nbElem)) { retval = NULL; } else { retval = pv->elem[rank]; } sem_wait(&mutex_l); nl--; if(nl==0) { sem_post(&mutex_g); } sem_post(&mutex_l); return retval; } /** Cree un nouveau vecteur en initialisant son contenu avec les informations trouvees dans le fichier de nom filename. S'il y a un souci dans l'acces au fichier filename, affiche un message d'erreur et renvoie NULL. NB : le fichier est structure de la maniere suivante - Les 4 premiers octets contiennent le nombre, ecrit en binaire, d'elements du vecteur - Ensuite, pour chaque element du vecteur, il y a 4 octets contenant la longueur, ecrite en binaire, que doit avoir la zone memoire pour stocker la chaine de caracteres qui va etre lue ensuite (NB : cette longueur prend en compte le '\0' final), puis les octets de la chaine de caracteres (y compris le '\0' final). */ struct vector_t *loadVec(char *filename) { // Inutile pour l'exercice 2 return NULL; } /** Sauvegarde le vecteur pv dans le fichier binaire de nom filename (format du fichier explique dans loadVec). Renvoie 0 si tout s'est bien passe et -1 sinon (apres avoir affiche un message d'erreur explicatif) */ int saveVec(struct vector_t *pv, char *filename) { // Inutile pour l'exercice 2 return 0; }