buffer.c

Go to the documentation of this file.
00001 /*
00002  * This file is part of LibParserUtils.
00003  * Licensed under the MIT License,
00004  *                http://www.opensource.org/licenses/mit-license.php
00005  * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
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         /* Leak the buffer's current data, so we don't reuse it */
00181         /* buffer->alloc(buffer->data, 0, buffer->pw); */
00182 
00183         buffer->data = temp;
00184 #endif
00185 
00186 
00187         return PARSERUTILS_OK;
00188 }
00189 

Generated on Wed Jul 29 11:59:21 2015 for Libparserutils by  doxygen 1.5.6