/* Removes the first/last element of the list. return the poped data */ void *DListPopFront(dlist_t *dlist) { void *ret = (assert(dlist), DListGetData(DListBegin(dlist))); DListRemove(DListBegin(dlist)); return(ret); }
void DListDestory(DList *list) { void *data; while (0 < DListSize(list)) { if (DListRemove(list, DListTail(list), (void**)&data) == 0 && list->destory != NULL) { list->destory(data); } } memset(list, 0, sizeof(DList)); return; }
thread_t* thread_pick() { for (int i = 0; i < THREAD_PRI_MAX; i++) { DList* list = &run_list[i]; if (DListCount(list) > 0) { DListNode* node = DListRemove(list, list->head); return container_of(node, thread_t, run_node); } } panic("No thread"); }
void *DListPopBack(dlist_t *dlist) { dlist_iter_t poped = (assert(dlist), DListPrev(DListEnd(dlist))); void *ret = DListGetData(poped); DListRemove(poped); /* if(!poped)*/ /* {*/ /* return(NULL);*/ /* }*/ /* */ /* dlist->tail.prev = poped->prev;*/ /* poped->prev->next = &dlist->tail;*/ /* ret = poped->data;*/ /* */ /* free(poped);*/ return(ret); }
__forceinline void RemoveSelf() { DListRemove( &node ); } // 自己从链表中断开
void replace_process(DList* neg_card, DList* pos_card, DList* str) { DListNode *negcard_index = neg_card->head; // DListNode *poscard_index = pos_card->head; while(negcard_index != NULL) { printf("Current neg card %s\n", negcard_index->str); if(str->head == NULL) break; #ifdef DEBUG printf("Stamp0 ! \n"); #endif if(negcard_index->blankIndex == -1) { #ifdef DEBUG printf("Stamp1 ! \n"); #endif DListNode *newNode = (DListNode *)malloc(sizeof(DListNode)); copy_replace(negcard_index,NULL,newNode); DListNode *pos_iterator = pos_card->head; if(pos_iterator == pos_card->tail) DListInsertBefore(pos_card, NULL, newNode); else { while(pos_iterator->blankLength == -1 && pos_iterator->next!=pos_iterator) { pos_iterator = pos_iterator->next; // if(pos_iterator->blankLength != -1) DListInsertBefore(pos_card, pos_iterator, newNode); // else pos_iterator = pos_iterator->next; } DListInsertBefore(pos_card, pos_iterator, newNode); } negcard_index = negcard_index->next; DListRemove(neg_card, negcard_index->prev); } else { DListNode *newNode = (DListNode *)malloc(sizeof(DListNode)); DListNode *str_iterator = str->head; #ifdef DEBUG printf("Stamp2 ! \n"); #endif while(str_iterator != str_iterator->next) { #ifdef DEBUG printf("Str Iterator %s\n", str_iterator->str); #endif if (str_iterator->blankLength == negcard_index->blankLength) { copy_replace(negcard_index, str_iterator, newNode); #ifdef DEBUG printf("Stamp3 ! \n"); printf("New Node Str %s \n", newNode->str); #endif break; } else str_iterator = str_iterator->next; } if((str_iterator->blankLength == negcard_index->blankLength) && (str_iterator == str->tail)) { copy_replace(negcard_index, str_iterator, newNode); #ifdef DEBUG printf("Stamp 3'\n"); printf("New Node Str %s \n", newNode->str); #endif } if((str_iterator == str->tail) && (str_iterator->blankLength != negcard_index->blankLength)) { negcard_index = negcard_index->next; DListRemove(neg_card, negcard_index->prev); break; } #ifdef DEBUG printf("Stamp 4 ! \n"); #endif DListNode *pos_iterator = pos_card->head; if(pos_iterator == NULL) DListInsertBefore(pos_card, NULL, newNode); else { while((pos_iterator->blankLength < newNode->blankLength)&&(pos_iterator->next != pos_iterator)) pos_iterator = pos_iterator->next; // if(pos_iterator->blankLength > newNode->blankLength) DListInsertAfter(pos_card, pos_iterator, newNode); // else pos_iterator = pos_iterator->next; } #ifdef DEBUG DListShow(pos_card); printf("Stamp 5!\n"); #endif if(negcard_index ->next == negcard_index) { DListRemove(neg_card, negcard_index); negcard_index = NULL; } else { negcard_index = negcard_index->next; DListRemove(neg_card, negcard_index->prev); } DListRemove(str, str_iterator); str_iterator = str->head; } } }