/[mailutils]/mailutils/mailbox/iterator.c
ViewVC logotype

Diff of /mailutils/mailbox/iterator.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by polak, Sun Feb 9 20:39:58 2003 UTC revision 1.5 by gray, Wed Jul 16 12:19:01 2003 UTC
# Line 22  Line 22 
22  #include <errno.h>  #include <errno.h>
23  #include <stdlib.h>  #include <stdlib.h>
24    
25  #include <mailutils/list.h>  #include <list0.h>
   
26  #include <iterator0.h>  #include <iterator0.h>
27    
28  int  int
# Line 36  iterator_create (iterator_t *piterator, Line 35  iterator_create (iterator_t *piterator,
35    if (iterator == NULL)    if (iterator == NULL)
36      return ENOMEM;      return ENOMEM;
37    iterator->list = list;    iterator->list = list;
38      iterator->cur = NULL;
39      iterator->next = list->itr;
40      list->itr = iterator;
41      iterator->is_advanced = 0;
42    *piterator = iterator;    *piterator = iterator;
43    return 0;    return 0;
44  }  }
# Line 43  iterator_create (iterator_t *piterator, Line 46  iterator_create (iterator_t *piterator,
46  void  void
47  iterator_destroy (iterator_t *piterator)  iterator_destroy (iterator_t *piterator)
48  {  {
49    if (piterator && *piterator)    iterator_t itr, prev;
50      
51      if (!piterator || !*piterator)
52        return;
53    
54      for (itr = (*piterator)->list->itr, prev = NULL;
55           itr;
56           prev = itr, itr = itr->next)
57        if (*piterator == itr)
58          break;
59    
60      if (itr)
61      {      {
62        free (*piterator);        if (prev)
63            prev->next = itr->next;
64          else
65            itr->list->itr = itr->next;
66          free(itr);
67        *piterator = NULL;        *piterator = NULL;
68      }      }
69  }  }
# Line 53  iterator_destroy (iterator_t *piterator) Line 71  iterator_destroy (iterator_t *piterator)
71  int  int
72  iterator_first (iterator_t iterator)  iterator_first (iterator_t iterator)
73  {  {
74    iterator->index = 0;    iterator->cur = iterator->list->head.next;
75      iterator->is_advanced = 0;
76    return 0;    return 0;
77  }  }
78    
79  int  int
80  iterator_next (iterator_t iterator)  iterator_next (iterator_t iterator)
81  {  {
82    iterator->index++;    if (!iterator->is_advanced)
83        iterator->cur = iterator->cur->next;
84      iterator->is_advanced = 0;
85    return 0;    return 0;
86  }  }
87    
88  int  int
89  iterator_current (iterator_t iterator, void **pitem)  iterator_current (iterator_t iterator, void **pitem)
90  {  {
91    return list_get (iterator->list, iterator->index, pitem);    if (!iterator->cur)
92        return ENOENT;
93      *pitem = iterator->cur->item;
94      return 0;
95  }  }
96    
97  int  int
98  iterator_is_done (iterator_t iterator)  iterator_is_done (iterator_t iterator)
99  {  {
   size_t count;  
   int status;  
100    if (iterator == NULL)    if (iterator == NULL)
101      return 1;      return 1;
102    status = list_count (iterator->list, &count);    return iterator->cur == NULL || iterator->cur == &iterator->list->head;
103    if (status != 0)  }
104      return 1;  
105    return (iterator->index >= count);  int
106    iterator_get_list (iterator_t iterator, list_t *plist)
107    {
108      if (!iterator)
109        return EINVAL;
110        *plist = iterator->list;
111      return NULL;
112    }
113    
114    void
115    iterator_advance (iterator_t iterator, struct list_data *e)
116    {
117      for (; iterator; iterator = iterator->next)
118        {
119          if (iterator->cur == e)
120            {
121              iterator->cur = e->next;
122              iterator->is_advanced++;
123            }
124        }
125  }  }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26