1358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*-------------------------------------------------------------------*/ 2358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/* List Functionality */ 3358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*-------------------------------------------------------------------*/ 4358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/* #define SH_LIST_DEBUG */ 5358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*-------------------------------------------------------------------*/ 6358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#include <stdio.h> 7358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#include <stdlib.h> 8358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#include "shlist.h" 9358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*-------------------------------------------------------------------*/ 10358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid shListInitList( SHLIST *listPtr ) 11358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 12358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt listPtr->data = (void *)0L; 13358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt listPtr->next = listPtr; 14358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt listPtr->prev = listPtr; 15358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 16358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 17358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtSHLIST *shListFindItem( SHLIST *head, void *val, shListEqual func ) 18358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 19358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item; 20358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 21358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt for(item=head->next;( item != head );item=item->next) 22358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( func ) { 23358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( func( val, item->data ) ) { 24358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( item ); 25358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 26358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 27358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt else { 28358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item->data == val ) { 29358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( item ); 30358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 31358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 32358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 33358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 34358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 35358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtSHLIST *shListGetLastItem( SHLIST *head ) 36358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 37358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( head->prev != head ) 38358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( head->prev ); 39358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 40358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 41358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 42358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtSHLIST *shListGetFirstItem( SHLIST *head ) 43358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 44358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( head->next != head ) 45358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( head->next ); 46358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 47358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 48358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 49358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtSHLIST *shListGetNItem( SHLIST *head, unsigned long num ) 50358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 51358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item; 52358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned long i; 53358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 54358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt for(i=0,item=head->next;( (i < num) && (item != head) );i++,item=item->next); 55358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item != head ) 56358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( item ); 57358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 58358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 59358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 60358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtSHLIST *shListGetNextItem( SHLIST *head, SHLIST *item ) 61358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 62358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item == NULL ) 63358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 64358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item->next != head ) 65358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( item->next ); 66358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 67358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 68358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 69358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtSHLIST *shListGetPrevItem( SHLIST *head, SHLIST *item ) 70358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 71358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item == NULL ) 72358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 73358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item->prev != head ) 74358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( item->prev ); 75358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 76358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 77358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 78358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid shListDelItem( SHLIST *head, SHLIST *item, shListFree func ) 79358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 80358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item == NULL ) 81358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return; 82358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef SH_LIST_DEBUG 83358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt fprintf(stderr, "Del %lx\n", (unsigned long)(item->data)); 84358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 85358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (item->prev)->next = item->next; 86358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (item->next)->prev = item->prev; 87358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( func && item->data ) { 88358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt func( (void *)(item->data) ); 89358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 90358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt free( item ); 91358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head->data = (void *)((unsigned long)(head->data) - 1); 92358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 93358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 94358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid shListInsFirstItem( SHLIST *head, void *val ) 95358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ /* Insert to the beginning of the list */ 96358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item; 97358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 98358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = (SHLIST *)malloc( sizeof(SHLIST) ); 99358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item == NULL ) 100358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return; 101358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->data = val; 102358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->next = head->next; 103358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->prev = head; 104358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (head->next)->prev = item; 105358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head->next = item; 106358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef SH_LIST_DEBUG 107358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt fprintf(stderr, "Ins First %lx\n", (unsigned long)(item->data)); 108358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 109358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head->data = (void *)((unsigned long)(head->data) + 1); 110358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 111358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 112358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid shListInsLastItem( SHLIST *head, void *val ) 113358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ /* Insert to the end of the list */ 114358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item; 115358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 116358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = (SHLIST *)malloc( sizeof(SHLIST) ); 117358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item == NULL ) 118358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return; 119358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->data = val; 120358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->next = head; 121358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->prev = head->prev; 122358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (head->prev)->next = item; 123358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head->prev = item; 124358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef SH_LIST_DEBUG 125358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt fprintf(stderr, "Ins Last %lx\n", (unsigned long)(item->data)); 126358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 127358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head->data = (void *)((unsigned long)(head->data) + 1); 128358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 129358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 130358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid shListInsBeforeItem( SHLIST *head, void *val, void *etal, 131358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt shListCmp func ) 132358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 133358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item, *iptr; 134358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 135358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( func == NULL ) 136358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt shListInsFirstItem( head, val ); 137358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt else { 138358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = (SHLIST *)malloc( sizeof(SHLIST) ); 139358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item == NULL ) 140358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return; 141358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->data = val; 142358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt for(iptr=head->next;( iptr != head );iptr=iptr->next) 143358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( func( val, iptr->data, etal ) ) 144358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt break; 145358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->next = iptr; 146358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item->prev = iptr->prev; 147358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (iptr->prev)->next = item; 148358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt iptr->prev = item; 149358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef SH_LIST_DEBUG 150358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt fprintf(stderr, "Ins Before %lx\n", (unsigned long)(item->data)); 151358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 152358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head->data = (void *)((unsigned long)(head->data) + 1); 153358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 154358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 155358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 156358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid shListDelAllItems( SHLIST *head, shListFree func ) 157358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 158358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item; 159358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 160358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt for(item=head->next;( item != head );) { 161358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt shListDelItem( head, item, func ); 162358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = head->next; 163358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 164358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head->data = (void *)0L; 165358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 166358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 167358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid shListPrintAllItems( SHLIST *head, shListPrint func ) 168358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 169358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef SH_LIST_DEBUG 170358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item; 171358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 172358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt for(item=head->next;( item != head );item=item->next) 173358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( func ) { 174358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt func(item->data); 175358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 176358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt else { 177358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt fprintf(stderr, "Item: %lx\n",(unsigned long)(item->data)); 178358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 179358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 180358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 181358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 182358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtunsigned long shListGetCount( SHLIST *head ) 183358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 184358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( (unsigned long)(head->data) ); 185358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 186