2 * buffer.c -- generic memory buffer .
4 * Copyright (c) 2001-2008, NLnet Labs. All rights reserved.
6 * See LICENSE for the license.
12 * This file contains the definition of sldns_buffer, and functions to manipulate those.
15 #include "sldns/sbuffer.h"
19 sldns_buffer_new(size_t capacity)
21 sldns_buffer *buffer = (sldns_buffer*)malloc(sizeof(sldns_buffer));
27 buffer->_data = (uint8_t *) malloc(capacity);
33 buffer->_position = 0;
34 buffer->_limit = buffer->_capacity = capacity;
36 buffer->_status_err = 0;
38 sldns_buffer_invariant(buffer);
44 sldns_buffer_new_frm_data(sldns_buffer *buffer, void *data, size_t size)
48 buffer->_position = 0;
49 buffer->_limit = buffer->_capacity = size;
51 if (!buffer->_fixed && buffer->_data)
53 buffer->_data = malloc(size);
55 buffer->_status_err = 1;
58 memcpy(buffer->_data, data, size);
59 buffer->_status_err = 0;
61 sldns_buffer_invariant(buffer);
65 sldns_buffer_init_frm_data(sldns_buffer *buffer, void *data, size_t size)
67 memset(buffer, 0, sizeof(*buffer));
69 buffer->_capacity = buffer->_limit = size;
74 sldns_buffer_set_capacity(sldns_buffer *buffer, size_t capacity)
78 sldns_buffer_invariant(buffer);
79 assert(buffer->_position <= capacity && !buffer->_fixed);
81 data = (uint8_t *) realloc(buffer->_data, capacity);
83 buffer->_status_err = 1;
87 buffer->_limit = buffer->_capacity = capacity;
93 sldns_buffer_reserve(sldns_buffer *buffer, size_t amount)
95 sldns_buffer_invariant(buffer);
96 assert(!buffer->_fixed);
97 if (buffer->_capacity < buffer->_position + amount) {
98 size_t new_capacity = buffer->_capacity * 3 / 2;
100 if (new_capacity < buffer->_position + amount) {
101 new_capacity = buffer->_position + amount;
103 if (!sldns_buffer_set_capacity(buffer, new_capacity)) {
104 buffer->_status_err = 1;
108 buffer->_limit = buffer->_capacity;
113 sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...)
119 if (sldns_buffer_status_ok(buffer)) {
120 sldns_buffer_invariant(buffer);
121 assert(buffer->_limit == buffer->_capacity);
123 remaining = sldns_buffer_remaining(buffer);
124 va_start(args, format);
125 written = vsnprintf((char *) sldns_buffer_current(buffer), remaining,
129 buffer->_status_err = 1;
132 buffer->_position += written;
138 sldns_buffer_free(sldns_buffer *buffer)
151 sldns_buffer_copy(sldns_buffer* result, sldns_buffer* from)
153 size_t tocopy = sldns_buffer_limit(from);
155 if(tocopy > sldns_buffer_capacity(result))
156 tocopy = sldns_buffer_capacity(result);
157 sldns_buffer_clear(result);
158 sldns_buffer_write(result, sldns_buffer_begin(from), tocopy);
159 sldns_buffer_flip(result);