geany  1.38
About: Geany is a text editor (using GTK2) with basic features of an integrated development environment (syntax highlighting, code folding, symbol name auto-completion, ...). F: office T: editor programming GTK+ IDE
  Fossies Dox: geany-1.38.tar.bz2  ("unofficial" and yet experimental doxygen-generated source code documentation)  

ptrarray.c
Go to the documentation of this file.
1/*
2* Copyright (c) 1999-2002, Darren Hiebert
3*
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.
6*
7* This module contains functions managing resizable pointer arrays.
8*/
9
10/*
11* INCLUDE FILES
12*/
13#include "general.h" /* must always come first */
14
15#include <string.h>
16#include <stdlib.h>
17
18#include "debug.h"
19#include "ptrarray.h"
20#include "routines.h"
21
22/*
23* DATA DECLARATIONS
24*/
25
26struct sPtrArray {
27 unsigned int max;
28 unsigned int count;
29 void **array;
31};
32
33/*
34* FUNCTION DEFINITIONS
35*/
36
38{
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;
45}
46
47extern unsigned int ptrArrayAdd (ptrArray *const current, void *ptr)
48{
49 Assert (current != NULL);
50 if (current->count == current->max)
51 {
52 current->max *= 2;
53 current->array = xRealloc (current->array, current->max, void*);
54 }
55 current->array [current->count] = ptr;
56 return current->count++;
57}
58
59extern void *ptrArrayRemoveLast (ptrArray *const current)
60{
61 Assert (current != NULL);
62 Assert (current->count > 0);
63 void *r = ptrArrayLast (current);
64 --current->count;
65 return r;
66}
67
68/* Combine array `from' into `current', deleting `from' */
69extern void ptrArrayCombine (ptrArray *const current, ptrArray *const from)
70{
71 unsigned int i;
72 Assert (current != NULL);
73 Assert (from != NULL);
74 for (i = 0 ; i < from->count ; ++i)
75 ptrArrayAdd (current, from->array [i]);
76 from->count = 0;
77 ptrArrayDelete (from);
78}
79
80extern unsigned int ptrArrayCount (const ptrArray *const current)
81{
82 Assert (current != NULL);
83 return current->count;
84}
85
86extern void* ptrArrayItem (const ptrArray *const current, const unsigned int indx)
87{
88 Assert (current != NULL);
89 return current->array [indx];
90}
91
92extern void* ptrArrayLast (const ptrArray *const current)
93{
94 Assert (current != NULL);
95 Assert (current->count > 0);
96 return current->array [current->count - 1];
97}
98
99extern void ptrArrayClear (ptrArray *const current)
100{
101 Assert (current != NULL);
102 if (current->deleteFunc)
103 {
104 unsigned int i;
105 for (i = 0 ; i < current->count ; ++i)
106 current->deleteFunc (current->array [i]);
107 }
108 current->count = 0;
109}
110
111extern void ptrArrayDelete (ptrArray *const current)
112{
113 if (current != NULL)
114 {
115 ptrArrayClear (current);
116 eFree (current->array);
117 eFree (current);
118 }
119}
120
121extern bool ptrArrayHasTest (const ptrArray *const current,
122 bool (*test)(const void *ptr, void *userData),
123 void *userData)
124{
125 bool result = false;
126 unsigned int i;
127 Assert (current != NULL);
128 for (i = 0 ; ! result && i < current->count ; ++i)
129 result = (*test)(current->array [i], userData);
130 return result;
131}
132
133static bool ptrEq (const void *ptr, void *userData)
134{
135 return (ptr == userData);
136}
137
138extern bool ptrArrayHas (const ptrArray *const current, void *ptr)
139{
140 return ptrArrayHasTest (current, ptrEq, ptr);
141}
142
143extern void ptrArrayReverse (const ptrArray *const current)
144{
145 unsigned int i, j;
146 void *tmp;
147
148 Assert (current != NULL);
149 for (i = 0, j = current->count - 1 ; i < (current->count / 2); ++i, --j)
150 {
151 tmp = current->array[i];
152 current->array[i] = current->array[j];
153 current->array[j] = tmp;
154 }
155}
156
157extern void ptrArrayDeleteItem (ptrArray* const current, unsigned int indx)
158{
159 void *ptr = current->array[indx];
160
161 if (current->deleteFunc)
162 current->deleteFunc (ptr);
163
164 memmove (current->array + indx, current->array + indx + 1,
165 (current->count - indx) * sizeof (*current->array));
166 --current->count;
167}
168
169static int (*ptrArraySortCompareVar)(const void *, const void *);
170
171static int ptrArraySortCompare(const void *a0, const void *b0)
172{
173 void *const *a = (void *const *)a0;
174 void *const *b = (void *const *)b0;
175
176 return ptrArraySortCompareVar (*a, *b);
177}
178
179extern void ptrArraySort (ptrArray *const current, int (*compare)(const void *, const void *))
180{
181 ptrArraySortCompareVar = compare;
182 qsort (current->array, current->count, sizeof (void *), ptrArraySortCompare);
183}
GeanyBuildCommand ** ptr
Definition: build.c:2679
#define Assert(c)
Definition: debug.h:47
bool ptrArrayHasTest(const ptrArray *const current, bool(*test)(const void *ptr, void *userData), void *userData)
Definition: ptrarray.c:121
unsigned int ptrArrayCount(const ptrArray *const current)
Definition: ptrarray.c:80
void ptrArrayClear(ptrArray *const current)
Definition: ptrarray.c:99
static bool ptrEq(const void *ptr, void *userData)
Definition: ptrarray.c:133
void ptrArrayDeleteItem(ptrArray *const current, unsigned int indx)
Definition: ptrarray.c:157
void ptrArrayCombine(ptrArray *const current, ptrArray *const from)
Definition: ptrarray.c:69
void ptrArraySort(ptrArray *const current, int(*compare)(const void *, const void *))
Definition: ptrarray.c:179
static int ptrArraySortCompare(const void *a0, const void *b0)
Definition: ptrarray.c:171
void * ptrArrayItem(const ptrArray *const current, const unsigned int indx)
Definition: ptrarray.c:86
bool ptrArrayHas(const ptrArray *const current, void *ptr)
Definition: ptrarray.c:138
void * ptrArrayLast(const ptrArray *const current)
Definition: ptrarray.c:92
ptrArray * ptrArrayNew(ptrArrayDeleteFunc deleteFunc)
Definition: ptrarray.c:37
void ptrArrayDelete(ptrArray *const current)
Definition: ptrarray.c:111
void * ptrArrayRemoveLast(ptrArray *const current)
Definition: ptrarray.c:59
unsigned int ptrArrayAdd(ptrArray *const current, void *ptr)
Definition: ptrarray.c:47
static int(* ptrArraySortCompareVar)(const void *, const void *)
Definition: ptrarray.c:169
void ptrArrayReverse(const ptrArray *const current)
Definition: ptrarray.c:143
void(* ptrArrayDeleteFunc)(void *data)
Definition: ptrarray.h:24
#define NULL
Definition: rbtree.h:150
void eFree(void *const ptr)
Definition: routines.c:252
#define xMalloc(n, Type)
Definition: routines.h:23
#define xRealloc(p, n, Type)
Definition: routines.h:25
ptrArrayDeleteFunc deleteFunc
Definition: ptrarray.c:30
unsigned int max
Definition: ptrarray.c:27
void ** array
Definition: ptrarray.c:29
unsigned int count
Definition: ptrarray.c:28