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;
37 buffer->_status_err = 0;
39 sldns_buffer_invariant(buffer);
45 sldns_buffer_new_frm_data(sldns_buffer *buffer, void *data, size_t size)
49 buffer->_position = 0;
50 buffer->_limit = buffer->_capacity = size;
53 if (!buffer->_fixed && buffer->_data)
55 buffer->_data = malloc(size);
57 buffer->_status_err = 1;
60 memcpy(buffer->_data, data, size);
61 buffer->_status_err = 0;
63 sldns_buffer_invariant(buffer);
67 sldns_buffer_init_frm_data(sldns_buffer *buffer, void *data, size_t size)
69 memset(buffer, 0, sizeof(*buffer));
71 buffer->_capacity = buffer->_limit = size;
77 sldns_buffer_init_vfixed_frm_data(sldns_buffer *buffer, void *data, size_t size)
79 memset(buffer, 0, sizeof(*buffer));
81 buffer->_capacity = buffer->_limit = size;
87 sldns_buffer_set_capacity(sldns_buffer *buffer, size_t capacity)
91 sldns_buffer_invariant(buffer);
92 assert(buffer->_position <= capacity && !buffer->_fixed);
94 data = (uint8_t *) realloc(buffer->_data, capacity);
96 buffer->_status_err = 1;
100 buffer->_limit = buffer->_capacity = capacity;
106 sldns_buffer_reserve(sldns_buffer *buffer, size_t amount)
108 sldns_buffer_invariant(buffer);
109 assert(!buffer->_fixed);
110 if (buffer->_capacity < buffer->_position + amount) {
111 size_t new_capacity = buffer->_capacity * 3 / 2;
113 if (new_capacity < buffer->_position + amount) {
114 new_capacity = buffer->_position + amount;
116 if (!sldns_buffer_set_capacity(buffer, new_capacity)) {
117 buffer->_status_err = 1;
121 buffer->_limit = buffer->_capacity;
126 sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...)
132 if (sldns_buffer_status_ok(buffer)) {
133 sldns_buffer_invariant(buffer);
134 assert(buffer->_limit == buffer->_capacity);
136 remaining = sldns_buffer_remaining(buffer);
137 va_start(args, format);
138 written = vsnprintf((char *) sldns_buffer_current(buffer), remaining,
142 buffer->_status_err = 1;
144 } else if (!buffer->_vfixed && (size_t) written >= remaining) {
145 if (!sldns_buffer_reserve(buffer, (size_t) written + 1)) {
146 buffer->_status_err = 1;
149 va_start(args, format);
150 written = vsnprintf((char *) sldns_buffer_current(buffer),
151 sldns_buffer_remaining(buffer), format, args);
154 buffer->_status_err = 1;
158 buffer->_position += written;
164 sldns_buffer_free(sldns_buffer *buffer)
177 sldns_buffer_export(sldns_buffer *buffer)
180 return buffer->_data;
184 sldns_buffer_copy(sldns_buffer* result, sldns_buffer* from)
186 size_t tocopy = sldns_buffer_limit(from);
188 if(tocopy > sldns_buffer_capacity(result))
189 tocopy = sldns_buffer_capacity(result);
190 sldns_buffer_clear(result);
191 sldns_buffer_write(result, sldns_buffer_begin(from), tocopy);
192 sldns_buffer_flip(result);