#include "libnazgul.h" #define DEBUG 1 int msgSpaceListRem(msgSpaceId spaceId){ msgSpaceList * list; msgSpaceListElemId listHeadElemId; msgSpaceListElemId listTailElemId; msgSpaceListId listId; msgSpaceListElemId prevElemId; msgSpaceListElemId currElemId; msgSpaceListElemId nextElemId; msgSpaceListElem * prevElem; msgSpaceListElem * currElem; msgSpaceId currSpaceId; list=msgSpaceListOpen(); if (list==NULL){ NZG_ERROR("msgSpaceListOpen",""); goto ERROR; } if (DEBUG) { printf("Before ListStrCpy\n"); } strcpy(listHeadElemId,list->headId); strcpy(listTailElemId,list->tailId); strcpy(listId,list->id); if (DEBUG) { printf("After ListStrCpy\n"); } if ((strcmp(listHeadElemId,listId)==0) && strcmp(listTailElemId,listId)==0){ if (DEBUG) { printf("SpaceList : vide\n"); } return 1; } else { bool found=false; strcpy(prevElemId,list->headId); strcpy(currElemId,list->headId); while(!found){ printf("Recherche dans l'element %s\n",listHeadElemId); currElem=msgSpaceListElemOpen(currElemId); if (currElem==NULL){ NZG_ERROR("msgSpaceListElemOpen",currElemId); goto ERROR; } strcpy(nextElemId,currElem->next); strcpy(currSpaceId,currElem->spaceId); if (msgSpaceListElemClose(currElem) <0){ NZG_ERROR("msgSpaceListElemClose",currElemId); goto ERROR; } if (strcmp(prevElemId,nextElemId)==0){ // list à 1 seul élement if (strcmp(currSpaceId,spaceId)==0){ // on a trouvé l'elem strcpy(list->headId,list->id); strcpy(list->tailId,list->id); // on efface shm_unlink(currElemId); found=true; } else { break; } } else { // liste à plusieurs élements... if (strcmp(currSpaceId,spaceId)==0){ // ca correspond if (strcmp(prevElemId,currElemId)==0){ // si on est en début de liste (prev=current) // - la tete de liste pointe sur le suivant strcpy(list->headId,nextElemId); } else { if (strcmp(currElemId,nextElemId)==0){ // si on est en find de liste (current=next) // - on fait pointer la queue de liste sur le précédent strcpy(list->tailId,prevElemId); // - on fait pointer le précédent sur lui-meme prevElem=msgSpaceListElemOpen(prevElemId); strcpy(prevElem->next,prevElemId); msgSpaceListElemClose(prevElem); }else { // on est en milieu de liste // - on fait pointer le précédent sur le suivant prevElem=msgSpaceListElemOpen(prevElemId); strcpy(prevElem->next,nextElemId); msgSpaceListElemClose(prevElem); } } // - on détruit l'actuel shm_unlink(currElemId); found=true; break; } else { //cela ne correspond pas //on recopie strcpy(prevElemId,currElemId); strcpy(currElemId,nextElemId); } } } if (msgSpaceListClose(list) < 0){ NZG_ERROR("msgSpaceListClose",""); goto ERROR; } return 0; } ERROR: return -1; }