|
Libparserutils
|
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
1.7.3