l3.libnazgul/src/spaceListRem.c

129 lines
3.1 KiB
C
Raw Normal View History

2004-02-23 09:42:25 +00:00
#include "libnazgul.h"
2004-02-25 23:49:39 +00:00
#define DEBUG 1
2004-02-23 09:42:25 +00:00
2020-03-03 23:06:43 +00:00
int msgSpaceListRem(msgSpaceId spaceId)
{
msgSpaceList *list;
msgSpaceListElemId listHeadElemId;
msgSpaceListElemId listTailElemId;
msgSpaceListId listId;
2004-02-26 07:36:00 +00:00
2020-03-03 23:06:43 +00:00
msgSpaceListElemId prevElemId;
msgSpaceListElemId currElemId;
msgSpaceListElemId nextElemId;
2004-02-26 07:36:00 +00:00
2020-03-03 23:06:43 +00:00
msgSpaceListElem *prevElem;
msgSpaceListElem *currElem;
msgSpaceId currSpaceId;
2004-02-26 07:36:00 +00:00
2020-03-03 23:06:43 +00:00
list = msgSpaceListOpen();
if (list == NULL) {
NZG_ERROR("msgSpaceListOpen", "");
2004-02-26 07:19:08 +00:00
goto ERROR;
2020-03-03 23:06:43 +00:00
}
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");
2004-02-26 07:19:08 +00:00
}
2020-03-03 23:06:43 +00:00
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 <20> 1 seul <20>lement
if (strcmp(currSpaceId, spaceId) == 0) {
// on a trouv<75> l'elem
strcpy(list->headId, list->id);
strcpy(list->tailId, list->id);
// on efface
shm_unlink(currElemId);
found = true;
} else {
break;
}
} else {
// liste <20> plusieurs <20>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<70>c<EFBFBD>dent
strcpy(list->tailId,
prevElemId);
// - on fait pointer le pr<70>c<EFBFBD>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<70>c<EFBFBD>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);
}
2004-02-26 07:48:56 +00:00
}
2004-02-25 18:33:06 +00:00
2020-03-03 23:06:43 +00:00
}
if (msgSpaceListClose(list) < 0) {
NZG_ERROR("msgSpaceListClose", "");
goto ERROR;
}
return 0;
2004-02-26 07:19:08 +00:00
}
2020-03-03 23:06:43 +00:00
ERROR:
return -1;
2004-02-25 18:33:06 +00:00
}