buffer.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include <string.h>
00009
00010 #include <parserutils/utils/buffer.h>
00011
00012 #define DEFAULT_SIZE (4096)
00013
00022 parserutils_error parserutils_buffer_create(parserutils_buffer **buffer)
00023 {
00024 parserutils_buffer *b;
00025
00026 if (buffer == NULL)
00027 return PARSERUTILS_BADPARM;
00028
00029 b = malloc(sizeof(parserutils_buffer));
00030 if (b == NULL)
00031 return PARSERUTILS_NOMEM;
00032
00033 b->data = malloc(DEFAULT_SIZE);
00034 if (b->data == NULL) {
00035 free(b);
00036 return PARSERUTILS_NOMEM;
00037 }
00038
00039 b->length = 0;
00040 b->allocated = DEFAULT_SIZE;
00041
00042 *buffer = b;
00043
00044 return PARSERUTILS_OK;
00045 }
00046
00053 parserutils_error parserutils_buffer_destroy(parserutils_buffer *buffer)
00054 {
00055 if (buffer == NULL)
00056 return PARSERUTILS_BADPARM;
00057
00058 free(buffer->data);
00059 free(buffer);
00060
00061 return PARSERUTILS_OK;
00062 }
00063
00072 parserutils_error parserutils_buffer_append(parserutils_buffer *buffer,
00073 const uint8_t *data, size_t len)
00074 {
00075 while (len >= buffer->allocated - buffer->length) {
00076 parserutils_error error = parserutils_buffer_grow(buffer);
00077 if (error != PARSERUTILS_OK)
00078 return error;
00079 }
00080
00081 memcpy(buffer->data + buffer->length, data, len);
00082
00083 buffer->length += len;
00084
00085 return PARSERUTILS_OK;
00086 }
00087
00097 parserutils_error parserutils_buffer_insert(parserutils_buffer *buffer,
00098 size_t offset, const uint8_t *data, size_t len)
00099 {
00100 if (offset > buffer->length)
00101 return PARSERUTILS_BADPARM;
00102
00103 if (offset == buffer->length)
00104 return parserutils_buffer_append(buffer, data, len);
00105
00106 while (len >= buffer->allocated - buffer->length) {
00107 parserutils_error error = parserutils_buffer_grow(buffer);
00108 if (error != PARSERUTILS_OK)
00109 return error;
00110 }
00111
00112 memmove(buffer->data + offset + len,
00113 buffer->data + offset, buffer->length - offset);
00114
00115 memcpy(buffer->data + offset, data, len);
00116
00117 buffer->length += len;
00118
00119 return PARSERUTILS_OK;
00120 }
00121
00130 parserutils_error parserutils_buffer_discard(parserutils_buffer *buffer,
00131 size_t offset, size_t len)
00132 {
00133 if (offset >= buffer->length || offset + len > buffer->length)
00134 return PARSERUTILS_BADPARM;
00135
00136 memmove(buffer->data + offset, buffer->data + offset + len,
00137 buffer->length - (len + offset));
00138
00139 buffer->length -= len;
00140
00141 return PARSERUTILS_OK;
00142 }
00143
00150 parserutils_error parserutils_buffer_grow(parserutils_buffer *buffer)
00151 {
00152 uint8_t *temp = realloc(buffer->data, buffer->allocated * 2);
00153 if (temp == NULL)
00154 return PARSERUTILS_NOMEM;
00155
00156 buffer->data = temp;
00157 buffer->allocated *= 2;
00158
00159 return PARSERUTILS_OK;
00160 }
00161
00162 parserutils_error parserutils_buffer_randomise(parserutils_buffer *buffer)
00163 {
00164 #ifndef NDEBUG
00165 uint8_t *temp;
00166 #endif
00167
00168 if (buffer == NULL)
00169 return PARSERUTILS_BADPARM;
00170
00171 #ifndef NDEBUG
00172 temp = malloc(buffer->allocated);
00173 if (temp == NULL)
00174 return PARSERUTILS_NOMEM;
00175
00176 memcpy(temp, buffer->data, buffer->length);
00177
00178 memset(buffer->data, 0xff, buffer->length);
00179
00180
00181
00182
00183 buffer->data = temp;
00184 #endif
00185
00186
00187 return PARSERUTILS_OK;
00188 }
00189