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