l3.libnazgul/src/spaceListRem.c

111 lines
2.8 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
2004-02-25 23:49:39 +00:00
int msgSpaceListRem(msgSpaceId spaceId){
msgSpaceList * list;
msgSpaceListElemId listHeadElemId;
msgSpaceListElemId listTailElemId;
msgSpaceListId listId;
2004-02-26 07:36:00 +00:00
msgSpaceListElemId prevElemId;
msgSpaceListElemId currElemId;
msgSpaceListElemId nextElemId;
msgSpaceListElem * prevElem;
msgSpaceListElem * currElem;
msgSpaceId currSpaceId;
2004-02-25 18:33:06 +00:00
list=msgSpaceListOpen();
2004-02-25 23:49:39 +00:00
if (list==NULL){
NZG_ERROR("msgSpaceListOpen","");
2004-02-25 18:33:06 +00:00
goto ERROR;
}
2004-02-25 23:49:39 +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"); }
return 1;
} else {
2004-02-26 07:19:08 +00:00
bool found=false;
2004-02-25 18:33:06 +00:00
2004-02-26 07:36:00 +00:00
strcpy(prevElemId,list->headId);
strcpy(currElemId,list->headId);
2004-02-26 07:19:08 +00:00
while(!found){
printf("Recherche dans l'element %s\n",listHeadElemId);
2004-02-26 07:36:00 +00:00
currElem=msgSpaceListElemOpen(currElemId);
if (currElem==NULL){
NZG_ERROR("msgSpaceListElemOpen",currElemId);
2004-02-26 07:19:08 +00:00
goto ERROR;
}
2004-02-26 07:36:00 +00:00
strcpy(nextElemId,currElem->next);
strcpy(currSpaceId,currElem->spaceId);
if (msgSpaceListElemClose(currElem) <0){
NZG_ERROR("msgSpaceListElemClose",currElemId);
2004-02-26 07:19:08 +00:00
goto ERROR;
}
if (strcmp(prevElemId,nextElemId)==0){
// list <20> 1 seul <20>lement
2004-02-26 07:48:56 +00:00
if (strcmp(currSpaceId,spaceId)==0){
2004-02-26 07:19:08 +00:00
// 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...
2004-02-26 07:48:56 +00:00
if (strcmp(currSpaceId,spaceId)==0){
2004-02-26 07:19:08 +00:00
// ca correspond
2004-02-26 07:48:56 +00:00
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);
}
}
2004-02-26 07:19:08 +00:00
// - on d<>truit l'actuel
2004-02-26 07:48:56 +00:00
shm_unlink(currElemId);
2004-02-26 07:19:08 +00:00
found=true;
break;
} else {
//cela ne correspond pas
//on recopie
strcpy(prevElemId,currElemId);
2004-02-26 07:36:00 +00:00
strcpy(currElemId,nextElemId);
2004-02-26 07:19:08 +00:00
}
}
2004-02-25 18:33:06 +00:00
2004-02-26 07:19:08 +00:00
}
if (msgSpaceListClose(list) < 0){
NZG_ERROR("msgSpaceListClose","");
goto ERROR;
}
return 0;
2004-02-25 18:33:06 +00:00
}
ERROR:
return -1;
}
2004-02-23 09:42:25 +00:00