l3.libnazgul/src/spaceListRem.c

129 lines
3.1 KiB
C

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