This source file includes following definitions.
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include "private/ftdm_core.h"
35 #include "ftdm_buffer.h"
36
37 static unsigned buffer_id = 0;
38
39 struct ftdm_buffer {
40 unsigned char *data;
41 unsigned char *head;
42 ftdm_size_t used;
43 ftdm_size_t actually_used;
44 ftdm_size_t datalen;
45 ftdm_size_t max_len;
46 ftdm_size_t blocksize;
47 unsigned id;
48 int loops;
49 };
50
51
52 FT_DECLARE(ftdm_status_t) ftdm_buffer_create(ftdm_buffer_t **buffer, ftdm_size_t blocksize, ftdm_size_t start_len, ftdm_size_t max_len)
53 {
54 ftdm_buffer_t *new_buffer;
55
56 new_buffer = ftdm_malloc(sizeof(*new_buffer));
57 if (new_buffer) {
58 memset(new_buffer, 0, sizeof(*new_buffer));
59
60 if (start_len) {
61 new_buffer->data = ftdm_malloc(start_len);
62 if (!new_buffer->data) {
63 ftdm_safe_free(new_buffer);
64 return FTDM_MEMERR;
65 }
66 memset(new_buffer->data, 0, start_len);
67 }
68
69 new_buffer->max_len = max_len;
70 new_buffer->datalen = start_len;
71 new_buffer->id = buffer_id++;
72 new_buffer->blocksize = blocksize;
73 new_buffer->head = new_buffer->data;
74
75 *buffer = new_buffer;
76 return FTDM_SUCCESS;
77 }
78
79 return FTDM_MEMERR;
80 }
81
82 FT_DECLARE(ftdm_size_t) ftdm_buffer_len(ftdm_buffer_t *buffer)
83 {
84
85 assert(buffer != NULL);
86
87 return buffer->datalen;
88
89 }
90
91
92 FT_DECLARE(ftdm_size_t) ftdm_buffer_freespace(ftdm_buffer_t *buffer)
93 {
94 assert(buffer != NULL);
95
96
97 if (buffer->max_len) {
98 return (ftdm_size_t) (buffer->max_len - buffer->used);
99 }
100 return 1000000;
101
102 }
103
104 FT_DECLARE(ftdm_size_t) ftdm_buffer_inuse(ftdm_buffer_t *buffer)
105 {
106 assert(buffer != NULL);
107
108 return buffer->used;
109 }
110
111 FT_DECLARE(ftdm_size_t) ftdm_buffer_seek(ftdm_buffer_t *buffer, ftdm_size_t datalen)
112 {
113 ftdm_size_t reading = 0;
114
115 assert(buffer != NULL);
116
117 if (buffer->used < 1) {
118 buffer->used = 0;
119 return 0;
120 } else if (buffer->used >= datalen) {
121 reading = datalen;
122 } else {
123 reading = buffer->used;
124 }
125
126 buffer->used = buffer->actually_used - reading;
127 buffer->head = buffer->data + reading;
128
129 return reading;
130 }
131
132 FT_DECLARE(ftdm_size_t) ftdm_buffer_toss(ftdm_buffer_t *buffer, ftdm_size_t datalen)
133 {
134 ftdm_size_t reading = 0;
135
136 assert(buffer != NULL);
137
138 if (buffer->used < 1) {
139 buffer->used = 0;
140 return 0;
141 } else if (buffer->used >= datalen) {
142 reading = datalen;
143 } else {
144 reading = buffer->used;
145 }
146
147 buffer->used -= reading;
148 buffer->head += reading;
149
150 return buffer->used;
151 }
152
153 FT_DECLARE(void) ftdm_buffer_set_loops(ftdm_buffer_t *buffer, int loops)
154 {
155 buffer->loops = loops;
156 }
157
158 FT_DECLARE(ftdm_size_t) ftdm_buffer_read_loop(ftdm_buffer_t *buffer, void *data, ftdm_size_t datalen)
159 {
160 ftdm_size_t len;
161 if ((len = ftdm_buffer_read(buffer, data, datalen)) < datalen) {
162 if (buffer->loops == 0) {
163 return len;
164 }
165 buffer->head = buffer->data;
166 buffer->used = buffer->actually_used;
167 len = ftdm_buffer_read(buffer, (char*)data + len, datalen - len);
168 buffer->loops--;
169 }
170 return len;
171 }
172
173 FT_DECLARE(ftdm_size_t) ftdm_buffer_read(ftdm_buffer_t *buffer, void *data, ftdm_size_t datalen)
174 {
175 ftdm_size_t reading = 0;
176
177 assert(buffer != NULL);
178 assert(data != NULL);
179
180
181 if (buffer->used < 1) {
182 buffer->used = 0;
183 return 0;
184 } else if (buffer->used >= datalen) {
185 reading = datalen;
186 } else {
187 reading = buffer->used;
188 }
189
190 memcpy(data, buffer->head, reading);
191 buffer->used -= reading;
192 buffer->head += reading;
193
194
195 return reading;
196 }
197
198 FT_DECLARE(ftdm_size_t) ftdm_buffer_write(ftdm_buffer_t *buffer, const void *data, ftdm_size_t datalen)
199 {
200 ftdm_size_t freespace, actual_freespace;
201
202 assert(buffer != NULL);
203 assert(data != NULL);
204 assert(buffer->data != NULL);
205
206 if (!datalen) {
207 return buffer->used;
208 }
209
210 actual_freespace = buffer->datalen - buffer->actually_used;
211 if (actual_freespace < datalen && (!buffer->max_len || (buffer->used + datalen <= buffer->max_len))) {
212 memmove(buffer->data, buffer->head, buffer->used);
213 buffer->head = buffer->data;
214 buffer->actually_used = buffer->used;
215 }
216
217 freespace = buffer->datalen - buffer->used;
218
219
220
221
222
223
224
225
226 if (freespace < datalen) {
227 ftdm_size_t new_size, new_block_size;
228 void *data;
229
230 new_size = buffer->datalen + datalen;
231 new_block_size = buffer->datalen + buffer->blocksize;
232
233 if (new_block_size > new_size) {
234 new_size = new_block_size;
235 }
236 buffer->head = buffer->data;
237 data = realloc(buffer->data, new_size);
238 if (!data) {
239 return 0;
240 }
241 buffer->data = data;
242 buffer->head = buffer->data;
243 buffer->datalen = new_size;
244 }
245
246
247 freespace = buffer->datalen - buffer->used;
248
249 if (freespace < datalen) {
250 return 0;
251 } else {
252 memcpy(buffer->head + buffer->used, data, datalen);
253 buffer->used += datalen;
254 buffer->actually_used += datalen;
255 }
256
257
258 return buffer->used;
259 }
260
261 FT_DECLARE(void) ftdm_buffer_zero(ftdm_buffer_t *buffer)
262 {
263 assert(buffer != NULL);
264 assert(buffer->data != NULL);
265
266 buffer->used = 0;
267 buffer->actually_used = 0;
268 buffer->head = buffer->data;
269 }
270
271 FT_DECLARE(ftdm_size_t) ftdm_buffer_zwrite(ftdm_buffer_t *buffer, const void *data, ftdm_size_t datalen)
272 {
273 ftdm_size_t w;
274
275 if (!(w = ftdm_buffer_write(buffer, data, datalen))) {
276 ftdm_buffer_zero(buffer);
277 return ftdm_buffer_write(buffer, data, datalen);
278 }
279
280 return w;
281 }
282
283 FT_DECLARE(void) ftdm_buffer_destroy(ftdm_buffer_t **buffer)
284 {
285 if (*buffer) {
286 ftdm_safe_free((*buffer)->data);
287 ftdm_safe_free(*buffer);
288 }
289
290 *buffer = NULL;
291 }
292
293
294
295
296
297
298
299
300
301
302