jcs's openbsd hax
openbsd
at jcs 87 lines 2.1 kB view raw
1/* 2 * buffer.c 3 * dynamically-managed buffers 4 * 5 * Copyright (c) 2024 pkgconf authors (see AUTHORS). 6 * 7 * Permission to use, copy, modify, and/or distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * This software is provided 'as is' and without any warranty, express or 12 * implied. In no event shall the authors be liable for any damages arising 13 * from the use of this software. 14 */ 15 16#include <libpkgconf/stdinc.h> 17#include <libpkgconf/libpkgconf.h> 18 19/* 20 * !doc 21 * 22 * libpkgconf `buffer` module 23 * ========================== 24 * 25 * The libpkgconf `buffer` module contains the functions related to managing 26 * dynamically-allocated buffers. 27 */ 28 29static inline size_t 30target_allocation_size(size_t target_size) 31{ 32 return 4096 + (4096 * (target_size / 4096)); 33} 34 35void 36pkgconf_buffer_append(pkgconf_buffer_t *buffer, const char *text) 37{ 38 size_t needed = strlen(text) + 1; 39 size_t newsize = pkgconf_buffer_len(buffer) + needed; 40 41 char *newbase = realloc(buffer->base, target_allocation_size(newsize)); 42 43 /* XXX: silently failing here is antisocial */ 44 if (newbase == NULL) 45 return; 46 47 char *newend = newbase + pkgconf_buffer_len(buffer); 48 pkgconf_strlcpy(newend, text, needed); 49 50 buffer->base = newbase; 51 buffer->end = newend + needed; 52} 53 54void 55pkgconf_buffer_push_byte(pkgconf_buffer_t *buffer, char byte) 56{ 57 size_t newsize = pkgconf_buffer_len(buffer) + 1; 58 char *newbase = realloc(buffer->base, target_allocation_size(newsize)); 59 60 /* XXX: silently failing here remains antisocial */ 61 if (newbase == NULL) 62 return; 63 64 char *newend = newbase + newsize; 65 *(newend - 1) = byte; 66 *newend = '\0'; 67 68 buffer->base = newbase; 69 buffer->end = newend; 70} 71 72void 73pkgconf_buffer_trim_byte(pkgconf_buffer_t *buffer) 74{ 75 size_t newsize = pkgconf_buffer_len(buffer) - 1; 76 char *newbase = realloc(buffer->base, target_allocation_size(newsize)); 77 78 buffer->base = newbase; 79 buffer->end = newbase + newsize; 80 *(buffer->end) = '\0'; 81} 82 83void 84pkgconf_buffer_finalize(pkgconf_buffer_t *buffer) 85{ 86 free(buffer->base); 87}