#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; }