]>
git.saurik.com Git - apple/network_cmds.git/blob - unbound/ldns/sbuffer.c
3d087bfe252e8781c35dd1b96986753cbc92fa27
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
);