FreeBASIC  0.91.0
flist.bas
Go to the documentation of this file.
1 '' one-way list, w/o deallocations
2 ''
3 '' chng: apr/2005 written [v1ctor]
4 ''
5 
6 
7 #include once "flist.bi"
8 
9 sub flistInit _
10  ( _
11  byval flist as TFLIST ptr, _
12  byval items as integer, _
13  byval itemlen as integer _
14  )
15 
16  flist->totitems = items
17  flist->items = items
18 
19  listInit( @flist->list, items, itemlen + len( TFLISTITEM ), LIST_FLAGS_NONE )
20 
21  flist->listtb = flist->list.tbtail
22  flist->index = 0
23  flist->itemtb = flist->listtb->nodetb
24  flist->lastitem = NULL
25 
26 end sub
27 
28 sub flistEnd(byval flist as TFLIST ptr)
29  flist->totitems = 0
30  flist->items = 0
31  flist->index = 0
32  flist->lastitem = NULL
33  listEnd( @flist->list )
34 end sub
35 
36 '':::::
37 function flistNewItem _
38  ( _
39  byval flist as TFLIST ptr _
40  ) as any ptr static
41 
42  dim as TFLISTITEM ptr item
43 
44  '' alloc new item flist if there are no free items
45  if( flist->items <= 0 ) Then
46 
47  flist->listtb = flist->listtb->next
48 
49  if( flist->listtb = NULL ) then
50  flist->items = cunsg(flist->totitems) \ 2
51  flist->totitems += flist->items
52  listAllocTB( @flist->list, flist->items )
53  flist->listtb = flist->list.tbtail
54  else
55  flist->items = flist->listtb->nodes
56  end if
57 
58  flist->itemtb = flist->listtb->nodetb
59  flist->index = 0
60  end if
61 
62  ''
63  item = cast( TFLISTITEM ptr, _
64  cast( byte ptr, flist->itemtb ) + (flist->index * flist->list.nodelen) )
65  flist->index += 1
66  flist->items -= 1
67 
68  ''
69  if( flist->lastitem <> NULL ) then
70  flist->lastitem->next = item
71  end if
72 
73  flist->lastitem = item
74  item->next = NULL
75 
76  ''
77  function = cast( byte ptr, item ) + len( TFLISTITEM )
78 
79 end function
80 
81 '':::::
82 sub flistReset _
83  ( _
84  byval flist as TFLIST ptr _
85  ) static
86 
87  flist->listtb = flist->list.tbhead
88  flist->items = flist->listtb->nodes
89  flist->itemtb = flist->listtb->nodetb
90  flist->index = 0
91  flist->lastitem = NULL
92 
93 end sub
94 
95 '':::::
96 function flistGetHead _
97  ( _
98  byval flist as TFLIST ptr _
99  ) as any ptr static
100 
101  dim as TFLISTITEM ptr item
102 
103  item = flist->list.tbhead->nodetb
104  if( item = NULL ) then
105  function = NULL
106  else
107  function = cast( byte ptr, item ) + len( TFLISTITEM )
108  end if
109 
110 end function
111 
112 '':::::
113 function flistGetNext _
114  ( _
115  byval node as any ptr _
116  ) as any ptr static
117 
118  dim as TFLISTITEM ptr nxt
119 
120 #ifdef DEBUG
121  if( node = NULL ) then
122  return NULL
123  end if
124 #endif
125 
126  nxt = cast( TFLISTITEM ptr, _
127  cast( byte ptr, node ) - len( TFLISTITEM ) )->next
128 
129  if( nxt = NULL ) then
130  function = NULL
131  else
132  function = cast( byte ptr, nxt ) + len( TFLISTITEM )
133  end if
134 
135 end function
136 
137 
138