110 lines
2.8 KiB
C
110 lines
2.8 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;
|
|
}
|
|
|