Libparserutils
buffer.c
Go to the documentation of this file.
1/*
2 * This file is part of LibParserUtils.
3 * Licensed under the MIT License,
4 * http://www.opensource.org/licenses/mit-license.php
5 * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
6 */
7
8#include <string.h>
9
11
12#define DEFAULT_SIZE (4096)
13
23{
25
26 if (buffer == NULL)
28
29 b = malloc(sizeof(parserutils_buffer));
30 if (b == NULL)
31 return PARSERUTILS_NOMEM;
32
33 b->data = malloc(DEFAULT_SIZE);
34 if (b->data == NULL) {
35 free(b);
36 return PARSERUTILS_NOMEM;
37 }
38
39 b->length = 0;
41
42 *buffer = b;
43
44 return PARSERUTILS_OK;
45}
46
54{
55 if (buffer == NULL)
57
58 free(buffer->data);
59 free(buffer);
60
61 return PARSERUTILS_OK;
62}
63
73 const uint8_t *data, size_t len)
74{
75 while (len >= buffer->allocated - buffer->length) {
77 if (error != PARSERUTILS_OK)
78 return error;
79 }
80
81 memcpy(buffer->data + buffer->length, data, len);
82
83 buffer->length += len;
84
85 return PARSERUTILS_OK;
86}
87
98 size_t offset, const uint8_t *data, size_t len)
99{
100 if (offset > buffer->length)
101 return PARSERUTILS_BADPARM;
102
103 if (offset == buffer->length)
104 return parserutils_buffer_append(buffer, data, len);
105
106 while (len >= buffer->allocated - buffer->length) {
108 if (error != PARSERUTILS_OK)
109 return error;
110 }
111
112 memmove(buffer->data + offset + len,
113 buffer->data + offset, buffer->length - offset);
114
115 memcpy(buffer->data + offset, data, len);
116
117 buffer->length += len;
118
119 return PARSERUTILS_OK;
120}
121
131 size_t offset, size_t len)
132{
133 if (offset >= buffer->length || offset + len > buffer->length)
134 return PARSERUTILS_BADPARM;
135
136 memmove(buffer->data + offset, buffer->data + offset + len,
137 buffer->length - (len + offset));
138
139 buffer->length -= len;
140
141 return PARSERUTILS_OK;
142}
143
151{
152 uint8_t *temp = realloc(buffer->data, buffer->allocated * 2);
153 if (temp == NULL)
154 return PARSERUTILS_NOMEM;
155
156 buffer->data = temp;
157 buffer->allocated *= 2;
158
159 return PARSERUTILS_OK;
160}
161
163{
164#ifndef NDEBUG
165 uint8_t *temp;
166#endif
167
168 if (buffer == NULL)
169 return PARSERUTILS_BADPARM;
170
171#ifndef NDEBUG
172 temp = malloc(buffer->allocated);
173 if (temp == NULL)
174 return PARSERUTILS_NOMEM;
175
176 memcpy(temp, buffer->data, buffer->length);
177
178 memset(buffer->data, 0xff, buffer->length);
179
180 /* Leak the buffer's current data, so we don't reuse it */
181 /* buffer->alloc(buffer->data, 0, buffer->pw); */
182
183 buffer->data = temp;
184#endif
185
186
187 return PARSERUTILS_OK;
188}
189
parserutils_error parserutils_buffer_insert(parserutils_buffer *buffer, size_t offset, const uint8_t *data, size_t len)
Insert data into a memory buffer.
Definition buffer.c:97
parserutils_error parserutils_buffer_randomise(parserutils_buffer *buffer)
Definition buffer.c:162
parserutils_error parserutils_buffer_create(parserutils_buffer **buffer)
Create a memory buffer.
Definition buffer.c:22
parserutils_error parserutils_buffer_destroy(parserutils_buffer *buffer)
Destroy a memory buffer.
Definition buffer.c:53
#define DEFAULT_SIZE
Definition buffer.c:12
parserutils_error parserutils_buffer_append(parserutils_buffer *buffer, const uint8_t *data, size_t len)
Append data to a memory buffer.
Definition buffer.c:72
parserutils_error parserutils_buffer_grow(parserutils_buffer *buffer)
Extend the amount of space allocated for a memory buffer.
Definition buffer.c:150
parserutils_error parserutils_buffer_discard(parserutils_buffer *buffer, size_t offset, size_t len)
Discard a section of a memory buffer.
Definition buffer.c:130
size_t len
Definition codec_8859.c:23
parserutils_error
Definition errors.h:18
@ PARSERUTILS_OK
Definition errors.h:19
@ PARSERUTILS_NOMEM
Definition errors.h:21
@ PARSERUTILS_BADPARM
Definition errors.h:22
uint8_t * data
Definition buffer.h:21
size_t allocated
Definition buffer.h:23