129 lines
3.1 KiB
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;
|
|
}
|