ListNode *ListInsertNamedItem(ListNode *InsertNode, const char *Name, void *Item) { ListNode *NewItem, *Next; Next=InsertNode->Next; NewItem=(ListNode *) calloc(1,sizeof(ListNode)); NewItem->Item=Item; NewItem->Prev=InsertNode; NewItem->Next=Next; InsertNode->Next=NewItem; NewItem->Head=InsertNode->Head; if (Next) Next->Prev=NewItem; /* Next might be NULL! */ ListIncrNoOfItems(NewItem); if (StrLen(Name)) NewItem->Tag=CopyStr(NewItem->Tag,Name); return(NewItem); }
ListNode *OrderedListAddNamedItem(ListNode *Head, const char *Name, void *Item) { ListNode *NewItem, *Prev; Prev=ListFindNamedItemInsert(Head, Name); NewItem=(ListNode *) calloc(1,sizeof(ListNode)); NewItem->Item=Item; NewItem->Prev=Prev; NewItem->Next=Prev->Next; Prev->Next=NewItem; NewItem->Head=Prev->Head; if (NewItem->Next) NewItem->Next->Prev=NewItem; /* Next might be NULL! */ ListIncrNoOfItems(NewItem); if (StrLen(Name)) NewItem->Tag=CopyStr(NewItem->Tag,Name); NewItem->Time=GetTime(TRUE); return(NewItem); }
ListNode *ListAddNamedItemAfter(ListNode *ListStart,const char *Name,void *Item) { ListNode *Curr; if (ListStart==NULL) return(NULL); Curr=ListStart; Curr->Next=(ListNode *) calloc(1,sizeof(ListNode)); Curr->Next->Prev=Curr; Curr=Curr->Next; Curr->Item=Item; Curr->Head=ListGetHead(ListStart); Curr->Next=NULL; if (Name) Curr->Tag=CopyStr(NULL,Name); ListIncrNoOfItems(Curr); return(Curr); }
void ListThreadNode(ListNode *Prev, ListNode *Node) { ListNode *Head, *Next; //Never thread something to itself! if (Prev==Node) return; Next=Prev->Next; Node->Prev=Prev; Prev->Next=Node; Node->Next=Next; Head=ListGetHead(Prev); Node->Head=Head; // Next might be NULL! If it is, then our new node is last // item in list, so update Head node accordingly if (Next) Next->Prev=Node; else Head->Prev=Node; ListIncrNoOfItems(Prev); }
ListNode *OrderedListAddNamedItem(ListNode *Head, const char *Name, void *Item) { ListNode *NewItem, *Prev, *Curr, *Start; int count=0, jcount=0, result=-1; if (! Head) return(NULL); Prev=Head; Curr=Head->Next; Start=Curr; while (Curr) { if (Curr->Jump) { count=0; result=strcmp(Curr->Jump->Tag,Name); if (result < 0) { Curr=Curr->Jump; Prev=Curr->Prev; jcount++; if (jcount > 5) { OrderedListAddJump(Head->Next, Curr); jcount=0; } Start=Curr->Next; } } if (Curr->Tag) result=strcmp(Curr->Tag,Name); if (result > -1) break; count++; if (count > 100) { OrderedListAddJump(Start, Curr); count=0; Start=Curr->Next; } Prev=Curr; Curr=Curr->Next; } NewItem=(ListNode *) calloc(1,sizeof(ListNode)); NewItem->Item=Item; NewItem->Prev=Prev; NewItem->Next=Prev->Next; Prev->Next=NewItem; NewItem->Head=Prev->Head; if (NewItem->Next) NewItem->Next->Prev=NewItem; /* Next might be NULL! */ ListIncrNoOfItems(NewItem); if (StrLen(Name)) NewItem->Tag=CopyStr(NewItem->Tag,Name); result=ListSize(NewItem); if ((result % 2000)==0) { Curr=ListGetNth(Head,result / 2); OrderedListAddJump(Head->Next, Curr); } return(NewItem); }