1 #define _POSIX_C_SOURCE 200809L
11 void zpm_buffer_init(struct zpm_buffer *buffer) {
18 void zpm_buffer_compact(struct zpm_buffer *b) {
21 if (b->error || b->size == b->len) {
26 new = realloc(b->buffer, b->len);
37 /* makes sure there's at least need bytes free */
38 void zpm_buffer_expand(struct zpm_buffer *buf, size_t need) {
45 want = buf->len + need;
47 if (want <= buf->size) {
52 char *new = realloc(buf->buffer, want);
56 memset(buf->buffer + buf->len, 0, buf->size - buf->len);
62 void zpm_buffer_free(struct zpm_buffer *buffer) {
63 /* TODO only zero out memory if it's "secure" buffer */
64 if (buffer->buffer && buffer->len) {
65 memset(buffer->buffer, 0, buffer->len);
68 zpm_buffer_init(buffer);
71 void zpm_buffer_set(struct zpm_buffer *buffer, int ch) {
72 /* TODO only zero out memory if it's "secure" buffer */
73 if (buffer->buffer && buffer->size) {
74 memset(buffer->buffer, ch, buffer->size);
78 void zpm_buffer_appendvf(struct zpm_buffer *buf, const char *fmt, va_list ap) {
83 len = vsnprintf(0, 0, fmt, ar);
86 zpm_buffer_expand(buf, len+1);
87 vsprintf(buf->buffer + buf->len, fmt, ap);
90 void zpm_buffer_appendf(struct zpm_buffer *buf, const char *fmt, ...) {
95 len = vsnprintf(0, 0, fmt, ap);
97 zpm_buffer_expand(buf, len+1);
99 vsprintf(buf->buffer + buf->len, fmt, ap);
103 void zpm_buffer_append(struct zpm_buffer *buffer, const unsigned char *bytes, size_t n) {
104 zpm_buffer_expand(buffer, n);
106 if (buffer->error || !bytes) {
110 memcpy(buffer->buffer + buffer->len, bytes, n);
114 void zpm_buffer_append_str(struct zpm_buffer *buf, const char *s) {
115 zpm_buffer_append(buf, (const unsigned char *)s, strlen(s));
118 void zpm_buffer_append16(struct zpm_buffer *buffer, uint16_t n) {
119 zpm_buffer_expand(buffer, 2);
125 buffer->buffer[buffer->len++] = (n >> 8) & 0xff;
126 buffer->buffer[buffer->len++] = n & 0xff;
129 void zpm_buffer_append24(struct zpm_buffer *buffer, uint32_t n) {
130 zpm_buffer_expand(buffer, 3);
136 buffer->buffer[buffer->len++] = (n >> 16) & 0xff;
137 buffer->buffer[buffer->len++] = (n >> 8) & 0xff;
138 buffer->buffer[buffer->len++] = n & 0xff;
141 void zpm_buffer_append_byte(struct zpm_buffer *buffer, uint8_t n) {
142 zpm_buffer_expand(buffer, 1);
148 buffer->buffer[buffer->len++] = n & 0xff;
151 void zpm_buffer_write16(struct zpm_buffer *buffer, uint16_t n, size_t at) {
152 if (at+2 > buffer->size) {
153 zpm_buffer_expand(buffer, at+2 - buffer->size);
160 buffer->buffer[at] = (n >> 8) & 0xff;
161 buffer->buffer[at+1] = n & 0xff;
163 if (at+2 > buffer->len) {
164 buffer->len = at + 2;
168 uint16_t zpm_buffer_read16(struct zpm_buffer *buffer, size_t at) {
171 if (buffer->error || at+2 < buffer->len) {
175 res = (buffer->buffer[at] << 8) + buffer->buffer[at+1];
179 uint64_t zpm_buffer_readbe(struct zpm_buffer *buffer, int bytes, size_t at) {
183 if (buffer->error || at+bytes < buffer->len) {
187 for (i=0; i<bytes; i++) {
189 res += buffer->buffer[at+i];
195 void zpm_buffer_writebe(struct zpm_buffer *buffer, int bytes, size_t at, uint64_t val) {
197 if (at+bytes > buffer->size) {
198 zpm_buffer_expand(buffer, at+bytes - buffer->size);
205 for (i=bytes-1; i>=0; i--) {
206 buffer->buffer[at+i] = val & 0xff;
213 void zpm_buffer_shift(struct zpm_buffer *buffer, size_t n) {
218 if (buffer->len < n) {
223 memmove(buffer->buffer, buffer->buffer + n, buffer->len - n);
224 memset(buffer->buffer + buffer->len - n, 0, n);
226 fprintf(stderr, "memmove(%p, %p, %zu)\n", buffer->buffer,
227 buffer->buffer+n, buffer->len - n);
228 fprintf(stderr, "memset(%p, %d, %zu)\n", buffer->buffer+n,
236 /* make room at the beginning */
237 void zpm_buffer_unshift(struct zpm_buffer *buffer, size_t n) {
238 zpm_buffer_expand(buffer, n);
244 memmove(buffer->buffer + n, buffer->buffer, n);
245 memset(buffer->buffer, 0, n);
249 uint32_t zpm_buffer_next3(struct zpm_buffer_reader *rb) {
252 r = zpm_buffer_readbe(rb, 3, rb->cursor);
257 uint16_t zpm_buffer_next2(struct zpm_buffer_reader *rb) {
260 r = zpm_buffer_readbe(rb, 2, rb->cursor);
265 uint8_t zpm_buffer_next(struct zpm_buffer_reader *rb) {
268 r = zpm_buffer_readbe(rb, 2, rb->cursor);
273 void zpm_buffer_nextn(struct zpm_buffer_reader *rb, unsigned char *b, size_t n) {
274 zpm_buffer_read(rb, b, n, rb->cursor);