(file) Return to ptrarray.c CVS log (file) (dir) Up to [OMI] / omi / base

 1 krisbash 1.1 #include "ptrarray.h"
 2              #include <stdlib.h>
 3              
 4              int PtrArray_Construct(
 5                  PtrArray* self,
 6                  size_t capacity,
 7                  void (MI_MAIN_CALL *destructor)(void*))
 8              {
 9                  if (capacity == 0)
10                      capacity = 1;
11              
12                  self->size = 0;
13                  self->capacity = capacity;
14                  self->destructor = destructor;
15              
16                  self->data = (void**)PAL_Malloc(self->capacity * sizeof(void*));
17              
18                  if (!self->data)
19                      return -1;
20              
21                  return 0;
22 krisbash 1.1 }
23              
24              void PtrArray_Destruct(
25                  PtrArray* self)
26              {
27                  if (self->destructor)
28                  {
29                      size_t i;
30              
31                      for (i = 0; i < self->size; i++)
32                          (*self->destructor)(self->data[i]);
33              
34                      self->destructor = NULL;
35                  }
36              
37                  if (self->data)
38                  {
39                      PAL_Free(self->data);
40                      self->data = NULL;
41                  }
42              }
43 krisbash 1.1 
44              _Use_decl_annotations_
45              int PtrArray_Append(
46                  PtrArray* self, 
47                  void* element)
48              {
49                  if (self->size == self->capacity)
50                  {
51                      void** _newdata;
52                      size_t _oldcapacity = self->capacity;
53                      size_t _oldsize = _oldcapacity * sizeof(void*);
54                      size_t _newcapacity = _oldcapacity << 1;
55                      size_t _newsize = _oldsize << 1;
56              
57                      /* size_t overflowed */
58                      if ((_newcapacity <= _oldcapacity) || (_newsize <= _oldsize))
59                          return -1;
60              
61                      _newdata = (void**)PAL_Realloc(self->data, _newsize);
62                      if (!_newdata)
63                      {
64 krisbash 1.1             PtrArray_Destruct(self);
65                          return -1;
66                      }
67                      else
68                      {
69                          self->capacity = _newcapacity;
70                          self->data = _newdata;
71                      }
72                  }
73              
74                  self->data[self->size++] = element;
75                  return 0;
76              }

ViewCVS 0.9.2