1 /***********************************************************************/
2 /* Open Visualization Data Explorer */
3 /* (C) Copyright IBM Corp. 1989,1999 */
4 /* ALL RIGHTS RESERVED */
5 /* This code licensed under the */
6 /* "IBM PUBLIC LICENSE - Open Visualization Data Explorer" */
7 /***********************************************************************/
8
9 #include <dxconfig.h>
10
11
12 #include "hwDeclarations.h"
13 #include "hwList.h"
14
15 typedef struct listS
16 {
17 Pointer *items;
18 Error (*delete)(Pointer);
19 int max;
20 int end;
21 } *listP;
22
23 static void __listEmpty(listP);
24
25 static Error
_deleteHwList(Pointer arg)26 _deleteHwList(Pointer arg)
27 {
28 if (arg)
29 {
30 listP list = (listP)arg;
31 __listEmpty(list);
32 DXFree(list->items);
33 DXFree(list);
34 }
35 return OK;
36 }
37
38 listO
_dxf_newList(int initialSize,Error (* delete)(Pointer))39 _dxf_newList(int initialSize, Error (*delete)(Pointer))
40 {
41 listO lo;
42 listP list;
43
44 list = (Pointer)DXAllocateZero(sizeof(struct listS));
45 if (! list)
46 goto error;
47
48 list->items = (Pointer)DXAllocateZero(initialSize * sizeof(Pointer));
49 if (! list->items)
50 goto error;
51
52 list->max = initialSize;
53 list->end = 0;
54 list->delete = delete;
55
56 lo = (listO)_dxf_newHwObject(HW_CLASS_LIST, (Pointer)list, _deleteHwList);
57 return lo;
58
59 error:
60 if (list)
61 {
62 if (list->items)
63 DXFree(list->items);
64 DXFree(list);
65 }
66
67 return NULL;
68 }
69
70 Error
_dxf_listAppendItem(listO lo,Pointer item)71 _dxf_listAppendItem(listO lo, Pointer item)
72 {
73 listP list = (listP)_dxf_getHwObjectData(lo);
74 if (! list)
75 return ERROR;
76
77 if(list->end == list->max)
78 {
79 Pointer tmp = DXReAllocate(list->items,list->max*2*sizeof(Pointer));
80 if(!tmp)
81 return ERROR;
82 list->max *= 2;
83 list->items = tmp;
84 }
85 list->items[list->end++] = item;
86
87 return OK;
88 }
89
90 Error
_dxf_listEmpty(listO lo)91 _dxf_listEmpty(listO lo)
92 {
93 listP list = (listP)_dxf_getHwObjectData(lo);
94 __listEmpty(list);
95 return OK;
96 }
97
98 static void
__listEmpty(listP list)99 __listEmpty(listP list)
100 {
101 if (list)
102 {
103 if (list->delete)
104 {
105 int i;
106 for (i = 0; i < list->end; i++)
107 if (list->items[i])
108 (*list->delete)(list->items[i]);
109 }
110 }
111
112 list->end = 0;
113 }
114
115 Error
_dxf_listSize(listO lo)116 _dxf_listSize(listO lo)
117 {
118 listP list = (listP)_dxf_getHwObjectData(lo);
119 if (list)
120 return list->end;
121 else
122 return 0;
123 }
124
125 Pointer
_dxf_listGetItem(listO lo,int i)126 _dxf_listGetItem(listO lo, int i)
127 {
128 listP list = (listP)_dxf_getHwObjectData(lo);
129 if (list)
130 if (i<list->end)
131 return list->items[i];
132
133 return NULL;
134 }
135