libpkgconf: add buffer management functions
Signed-off-by: Ariadne Conill <ariadne@ariadne.space>master
parent
5c535171a5
commit
10017500ff
|
@ -150,6 +150,7 @@ SUFFIXES= .sh
|
||||||
nobase_pkginclude_HEADERS = libpkgconf/bsdstubs.h libpkgconf/iter.h libpkgconf/libpkgconf.h libpkgconf/stdinc.h libpkgconf/libpkgconf-api.h
|
nobase_pkginclude_HEADERS = libpkgconf/bsdstubs.h libpkgconf/iter.h libpkgconf/libpkgconf.h libpkgconf/stdinc.h libpkgconf/libpkgconf-api.h
|
||||||
libpkgconf_la_SOURCES = \
|
libpkgconf_la_SOURCES = \
|
||||||
libpkgconf/audit.c \
|
libpkgconf/audit.c \
|
||||||
|
libpkgconf/buffer.c \
|
||||||
libpkgconf/cache.c \
|
libpkgconf/cache.c \
|
||||||
libpkgconf/client.c \
|
libpkgconf/client.c \
|
||||||
libpkgconf/pkg.c \
|
libpkgconf/pkg.c \
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* buffer.c
|
||||||
|
* dynamically-managed buffers
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 pkgconf authors (see AUTHORS).
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* This software is provided 'as is' and without any warranty, express or
|
||||||
|
* implied. In no event shall the authors be liable for any damages arising
|
||||||
|
* from the use of this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libpkgconf/stdinc.h>
|
||||||
|
#include <libpkgconf/libpkgconf.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* !doc
|
||||||
|
*
|
||||||
|
* libpkgconf `buffer` module
|
||||||
|
* ==========================
|
||||||
|
*
|
||||||
|
* The libpkgconf `buffer` module contains the functions related to managing
|
||||||
|
* dynamically-allocated buffers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
pkgconf_buffer_append(pkgconf_buffer_t *buffer, const char *text)
|
||||||
|
{
|
||||||
|
size_t needed = strlen(text) + 1;
|
||||||
|
|
||||||
|
char *newbase = realloc(buffer->base, pkgconf_buffer_len(buffer) + needed);
|
||||||
|
|
||||||
|
/* XXX: silently failing here is antisocial */
|
||||||
|
if (newbase == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char *newend = newbase + pkgconf_buffer_len(buffer);
|
||||||
|
pkgconf_strlcpy(newend, text, needed);
|
||||||
|
|
||||||
|
buffer->base = newbase;
|
||||||
|
buffer->end = newend;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pkgconf_buffer_finalize(pkgconf_buffer_t *buffer)
|
||||||
|
{
|
||||||
|
free(buffer->base);
|
||||||
|
}
|
|
@ -423,6 +423,22 @@ PKGCONF_API void pkgconf_path_free(pkgconf_list_t *dirlist);
|
||||||
PKGCONF_API bool pkgconf_path_relocate(char *buf, size_t buflen);
|
PKGCONF_API bool pkgconf_path_relocate(char *buf, size_t buflen);
|
||||||
PKGCONF_API void pkgconf_path_copy_list(pkgconf_list_t *dst, const pkgconf_list_t *src);
|
PKGCONF_API void pkgconf_path_copy_list(pkgconf_list_t *dst, const pkgconf_list_t *src);
|
||||||
|
|
||||||
|
/* buffer.c */
|
||||||
|
typedef struct pkgconf_buffer_ {
|
||||||
|
char *base;
|
||||||
|
char *end;
|
||||||
|
} pkgconf_buffer_t;
|
||||||
|
|
||||||
|
PKGCONF_API void pkgconf_buffer_append(pkgconf_buffer_t *buffer, const char *text);
|
||||||
|
PKGCONF_API void pkgconf_buffer_finalize(pkgconf_buffer_t *buffer);
|
||||||
|
static inline const char *pkgconf_buffer_str(const pkgconf_buffer_t *buffer) {
|
||||||
|
return buffer->base;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t pkgconf_buffer_len(const pkgconf_buffer_t *buffer) {
|
||||||
|
return (size_t)(ptrdiff_t)(buffer->end - buffer->base);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -82,6 +82,7 @@ endif
|
||||||
libpkgconf = library('pkgconf',
|
libpkgconf = library('pkgconf',
|
||||||
'libpkgconf/argvsplit.c',
|
'libpkgconf/argvsplit.c',
|
||||||
'libpkgconf/audit.c',
|
'libpkgconf/audit.c',
|
||||||
|
'libpkgconf/buffer.c',
|
||||||
'libpkgconf/bsdstubs.c',
|
'libpkgconf/bsdstubs.c',
|
||||||
'libpkgconf/cache.c',
|
'libpkgconf/cache.c',
|
||||||
'libpkgconf/client.c',
|
'libpkgconf/client.c',
|
||||||
|
|
Loading…
Reference in New Issue