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