Merge branch '1.37'
[geany-mirror.git] / ctags / main / ptrarray.c
blobd45a6621d6d3d8f860b6f3d71cced2a418785652
1 /*
2 * Copyright (c) 1999-2002, Darren Hiebert
4 * This source code is released for free distribution under the terms of the
5 * GNU General Public License version 2 or (at your option) any later version.
7 * This module contains functions managing resizable pointer arrays.
8 */
11 * INCLUDE FILES
13 #include "general.h" /* must always come first */
15 #include <string.h>
16 #include <stdlib.h>
18 #include "debug.h"
19 #include "ptrarray.h"
20 #include "routines.h"
23 * DATA DECLARATIONS
26 struct sPtrArray {
27 unsigned int max;
28 unsigned int count;
29 void **array;
30 ptrArrayDeleteFunc deleteFunc;
34 * FUNCTION DEFINITIONS
37 extern ptrArray *ptrArrayNew (ptrArrayDeleteFunc deleteFunc)
39 ptrArray* const result = xMalloc (1, ptrArray);
40 result->max = 8;
41 result->count = 0;
42 result->array = xMalloc (result->max, void*);
43 result->deleteFunc = deleteFunc;
44 return result;
47 extern void ptrArrayAdd (ptrArray *const current, void *ptr)
49 Assert (current != NULL);
50 if (current->count == current->max)
52 current->max *= 2;
53 current->array = xRealloc (current->array, current->max, void*);
55 current->array [current->count++] = ptr;
58 extern void ptrArrayRemoveLast (ptrArray *const current)
60 Assert (current != NULL);
61 Assert (current->count > 0);
62 --current->count;
65 /* Combine array `from' into `current', deleting `from' */
66 extern void ptrArrayCombine (ptrArray *const current, ptrArray *const from)
68 unsigned int i;
69 Assert (current != NULL);
70 Assert (from != NULL);
71 for (i = 0 ; i < from->count ; ++i)
72 ptrArrayAdd (current, from->array [i]);
73 from->count = 0;
74 ptrArrayDelete (from);
77 extern unsigned int ptrArrayCount (const ptrArray *const current)
79 Assert (current != NULL);
80 return current->count;
83 extern void* ptrArrayItem (const ptrArray *const current, const unsigned int indx)
85 Assert (current != NULL);
86 return current->array [indx];
89 extern void* ptrArrayLast (const ptrArray *const current)
91 Assert (current != NULL);
92 Assert (current->count > 0);
93 return current->array [current->count - 1];
96 extern void ptrArrayClear (ptrArray *const current)
98 Assert (current != NULL);
99 if (current->deleteFunc)
101 unsigned int i;
102 for (i = 0 ; i < current->count ; ++i)
103 current->deleteFunc (current->array [i]);
105 current->count = 0;
108 extern void ptrArrayDelete (ptrArray *const current)
110 if (current != NULL)
112 ptrArrayClear (current);
113 eFree (current->array);
114 eFree (current);
118 extern bool ptrArrayHasTest (const ptrArray *const current,
119 bool (*test)(const void *ptr, void *userData),
120 void *userData)
122 bool result = false;
123 unsigned int i;
124 Assert (current != NULL);
125 for (i = 0 ; ! result && i < current->count ; ++i)
126 result = (*test)(current->array [i], userData);
127 return result;
130 static bool ptrEq (const void *ptr, void *userData)
132 return (ptr == userData);
135 extern bool ptrArrayHas (const ptrArray *const current, void *ptr)
137 return ptrArrayHasTest (current, ptrEq, ptr);
140 extern void ptrArrayReverse (const ptrArray *const current)
142 unsigned int i, j;
143 void *tmp;
145 Assert (current != NULL);
146 for (i = 0, j = current->count - 1 ; i < (current->count / 2); ++i, --j)
148 tmp = current->array[i];
149 current->array[i] = current->array[j];
150 current->array[j] = tmp;
154 extern void ptrArrayDeleteItem (ptrArray* const current, unsigned int indx)
156 void *ptr = current->array[indx];
158 if (current->deleteFunc)
159 current->deleteFunc (ptr);
161 memmove (current->array + indx, current->array + indx + 1,
162 (current->count - indx) * sizeof (*current->array));
163 --current->count;
166 static int (*ptrArraySortCompareVar)(const void *, const void *);
168 static int ptrArraySortCompare(const void *a0, const void *b0)
170 void *const *a = (void *const *)a0;
171 void *const *b = (void *const *)b0;
173 return ptrArraySortCompareVar (*a, *b);
176 extern void ptrArraySort (ptrArray *const current, int (*compare)(const void *, const void *))
178 ptrArraySortCompareVar = compare;
179 qsort (current->array, current->count, sizeof (void *), ptrArraySortCompare);