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 "ldns/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 buffer->_data = malloc(size);
53 buffer->_status_err = 1;
56 memcpy(buffer->_data, data, size);
57 buffer->_status_err = 0;
59 sldns_buffer_invariant(buffer);
63 sldns_buffer_init_frm_data(sldns_buffer *buffer, void *data, size_t size)
65 memset(buffer, 0, sizeof(*buffer));
67 buffer->_capacity = buffer->_limit = size;
72 sldns_buffer_set_capacity(sldns_buffer *buffer, size_t capacity)
76 sldns_buffer_invariant(buffer);
77 assert(buffer->_position <= capacity);
79 data = (uint8_t *) realloc(buffer->_data, capacity);
81 buffer->_status_err = 1;
85 buffer->_limit = buffer->_capacity = capacity;
91 sldns_buffer_reserve(sldns_buffer *buffer, size_t amount)
93 sldns_buffer_invariant(buffer);
94 assert(!buffer->_fixed);
95 if (buffer->_capacity < buffer->_position + amount) {
96 size_t new_capacity = buffer->_capacity * 3 / 2;
98 if (new_capacity < buffer->_position + amount) {
99 new_capacity = buffer->_position + amount;
101 if (!sldns_buffer_set_capacity(buffer, new_capacity)) {
102 buffer->_status_err = 1;
106 buffer->_limit = buffer->_capacity;
111 sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...)
117 if (sldns_buffer_status_ok(buffer)) {
118 sldns_buffer_invariant(buffer);
119 assert(buffer->_limit == buffer->_capacity);
121 remaining = sldns_buffer_remaining(buffer);
122 va_start(args, format);
123 written = vsnprintf((char *) sldns_buffer_current(buffer), remaining,
127 buffer->_status_err = 1;
129 } else if ((size_t) written >= remaining) {
130 if (!sldns_buffer_reserve(buffer, (size_t) written + 1)) {
131 buffer->_status_err = 1;
134 va_start(args, format);
135 written = vsnprintf((char *) sldns_buffer_current(buffer),
136 sldns_buffer_remaining(buffer), format, args);
139 buffer->_status_err = 1;
143 buffer->_position += written;
149 sldns_buffer_free(sldns_buffer *buffer)
162 sldns_buffer_export(sldns_buffer *buffer)
165 return buffer->_data;
169 sldns_buffer_copy(sldns_buffer* result, sldns_buffer* from)
171 size_t tocopy = sldns_buffer_limit(from);
173 if(tocopy > sldns_buffer_capacity(result))
174 tocopy = sldns_buffer_capacity(result);
175 sldns_buffer_clear(result);
176 sldns_buffer_write(result, sldns_buffer_begin(from), tocopy);
177 sldns_buffer_flip(result);