• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------*/
2 /*                         List  Functionality                       */
3 /*-------------------------------------------------------------------*/
4 /* #define SH_LIST_DEBUG */
5 /*-------------------------------------------------------------------*/
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include "shlist.h"
9 /*-------------------------------------------------------------------*/
shListInitList(SHLIST * listPtr)10 void shListInitList( SHLIST *listPtr )
11 {
12   listPtr->data = (void *)0L;
13   listPtr->next = listPtr;
14   listPtr->prev = listPtr;
15 }
16 
shListFindItem(SHLIST * head,void * val,shListEqual func)17 SHLIST *shListFindItem( SHLIST *head, void *val, shListEqual func )
18 {
19   SHLIST *item;
20 
21   for(item=head->next;( item != head );item=item->next)
22     if( func ) {
23       if( func( val, item->data ) ) {
24         return( item );
25       }
26     }
27     else {
28       if( item->data == val ) {
29         return( item );
30       }
31     }
32   return( NULL );
33 }
34 
shListGetLastItem(SHLIST * head)35 SHLIST *shListGetLastItem( SHLIST *head )
36 {
37   if( head->prev != head )
38     return( head->prev );
39   return( NULL );
40 }
41 
shListGetFirstItem(SHLIST * head)42 SHLIST *shListGetFirstItem( SHLIST *head )
43 {
44   if( head->next != head )
45     return( head->next );
46   return( NULL );
47 }
48 
shListGetNItem(SHLIST * head,unsigned long num)49 SHLIST *shListGetNItem( SHLIST *head, unsigned long num )
50 {
51   SHLIST *item;
52   unsigned long i;
53 
54   for(i=0,item=head->next;( (i < num) && (item != head) );i++,item=item->next);
55   if( item != head )
56     return( item );
57   return( NULL );
58 }
59 
shListGetNextItem(SHLIST * head,SHLIST * item)60 SHLIST *shListGetNextItem( SHLIST *head, SHLIST *item )
61 {
62   if( item == NULL )
63     return( NULL );
64   if( item->next != head )
65     return( item->next );
66   return( NULL );
67 }
68 
shListGetPrevItem(SHLIST * head,SHLIST * item)69 SHLIST *shListGetPrevItem( SHLIST *head, SHLIST *item )
70 {
71   if( item == NULL )
72     return( NULL );
73   if( item->prev != head )
74     return( item->prev );
75   return( NULL );
76 }
77 
shListDelItem(SHLIST * head,SHLIST * item,shListFree func)78 void shListDelItem( SHLIST *head, SHLIST *item, shListFree func )
79 {
80   if( item == NULL )
81     return;
82 #ifdef SH_LIST_DEBUG
83   fprintf(stderr, "Del %lx\n", (unsigned long)(item->data));
84 #endif
85   (item->prev)->next = item->next;
86   (item->next)->prev = item->prev;
87   if( func && item->data ) {
88     func( (void *)(item->data) );
89   }
90   free( item );
91   head->data = (void *)((unsigned long)(head->data) - 1);
92 }
93 
shListInsFirstItem(SHLIST * head,void * val)94 void shListInsFirstItem( SHLIST *head, void *val )
95 { /* Insert to the beginning of the list */
96   SHLIST *item;
97 
98   item = (SHLIST *)malloc( sizeof(SHLIST) );
99   if( item == NULL )
100     return;
101   item->data = val;
102   item->next = head->next;
103   item->prev = head;
104   (head->next)->prev = item;
105   head->next = item;
106 #ifdef SH_LIST_DEBUG
107   fprintf(stderr, "Ins First %lx\n", (unsigned long)(item->data));
108 #endif
109   head->data = (void *)((unsigned long)(head->data) + 1);
110 }
111 
shListInsLastItem(SHLIST * head,void * val)112 void shListInsLastItem( SHLIST *head, void *val )
113 { /* Insert to the end of the list */
114   SHLIST *item;
115 
116   item = (SHLIST *)malloc( sizeof(SHLIST) );
117   if( item == NULL )
118     return;
119   item->data = val;
120   item->next = head;
121   item->prev = head->prev;
122   (head->prev)->next = item;
123   head->prev = item;
124 #ifdef SH_LIST_DEBUG
125   fprintf(stderr, "Ins Last %lx\n", (unsigned long)(item->data));
126 #endif
127   head->data = (void *)((unsigned long)(head->data) + 1);
128 }
129 
shListInsBeforeItem(SHLIST * head,void * val,void * etal,shListCmp func)130 void shListInsBeforeItem( SHLIST *head, void *val, void *etal,
131                           shListCmp func )
132 {
133   SHLIST *item, *iptr;
134 
135   if( func == NULL )
136     shListInsFirstItem( head, val );
137   else {
138     item = (SHLIST *)malloc( sizeof(SHLIST) );
139     if( item == NULL )
140       return;
141     item->data = val;
142     for(iptr=head->next;( iptr != head );iptr=iptr->next)
143       if( func( val, iptr->data, etal ) )
144          break;
145     item->next = iptr;
146     item->prev = iptr->prev;
147     (iptr->prev)->next = item;
148     iptr->prev = item;
149 #ifdef SH_LIST_DEBUG
150     fprintf(stderr, "Ins Before %lx\n", (unsigned long)(item->data));
151 #endif
152     head->data = (void *)((unsigned long)(head->data) + 1);
153   }
154 }
155 
shListDelAllItems(SHLIST * head,shListFree func)156 void shListDelAllItems( SHLIST *head, shListFree func )
157 {
158   SHLIST *item;
159 
160   for(item=head->next;( item != head );) {
161     shListDelItem( head, item, func );
162     item = head->next;
163   }
164   head->data = (void *)0L;
165 }
166 
shListPrintAllItems(SHLIST * head,shListPrint func)167 void shListPrintAllItems( SHLIST *head, shListPrint func )
168 {
169 #ifdef SH_LIST_DEBUG
170   SHLIST *item;
171 
172   for(item=head->next;( item != head );item=item->next)
173     if( func ) {
174       func(item->data);
175     }
176     else {
177       fprintf(stderr, "Item: %lx\n",(unsigned long)(item->data));
178     }
179 #endif
180 }
181 
shListGetCount(SHLIST * head)182 unsigned long shListGetCount( SHLIST *head )
183 {
184   return( (unsigned long)(head->data) );
185 }
186