Ejemplo n.º 1
0
/*  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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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");
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
	__forceinline void    RemoveSelf()                   { DListRemove( &node ); }  // 自己从链表中断开
Ejemplo n.º 6
0
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;
		}

	}
}