103 lines
2.6 KiB
C
103 lines
2.6 KiB
C
#ifndef _BOOTSTRAP_STRING_BUF_H
|
|
#define _BOOTSTRAP_STRING_BUF_H
|
|
|
|
#include <stdlib.h>
|
|
|
|
/**
|
|
* @brief A dynamic character array.
|
|
*
|
|
* A `char*` wrapper. Appending `char`s or NUL-terminated strings allocates
|
|
* additional space as needed.
|
|
*/
|
|
struct StringBuf {
|
|
char *buf;
|
|
// The length of @buf excluding `NUL`.
|
|
size_t size;
|
|
// The allocated size of @buf including `NUL`.
|
|
size_t _capacity;
|
|
};
|
|
|
|
/**
|
|
* Create a new `StringBuf` instance.
|
|
*
|
|
* @param capacity
|
|
* The initial size of the internal array (including the trailing `NUL`
|
|
* character). To avoid too many reallocations, aim to make this value large
|
|
* enough to accommodate the size the string is expected to eventually take.
|
|
* @return
|
|
* A new `StringBuf` instance. The caller takes ownership of this value.
|
|
*
|
|
* @see string_buf_free
|
|
*/
|
|
struct StringBuf *string_buf_new(size_t capacity);
|
|
|
|
/**
|
|
* Return the number of characters contained in the internal buffer.
|
|
*
|
|
* @param sb
|
|
* A valid pointer to a `StringBuf` instance.
|
|
* @return
|
|
* The number of characters contained in the internal buffer.
|
|
*/
|
|
size_t string_buf_size(struct StringBuf *sb);
|
|
|
|
/**
|
|
* Return the internal `NUL`-terminated string buffer.
|
|
*
|
|
* @param sb
|
|
* A valid pointer to a `StringBuf` instance.
|
|
* @return
|
|
* The internally managed string.
|
|
*/
|
|
const char *string_buf_value(struct StringBuf *sb);
|
|
|
|
/**
|
|
* Append a character to the end of a `StringBuf`.
|
|
*
|
|
* If appending would cause the internal buffer to overflow, reallocates the
|
|
* internal array to accommodate.
|
|
*
|
|
* @param sb
|
|
* A valid pointer to a `StringBuf` instance.
|
|
* @param c
|
|
* The `char` to append to the end of `sb`.
|
|
*/
|
|
void string_buf_cappend(struct StringBuf *sb, char c);
|
|
|
|
/**
|
|
* Append a `NUL`-terminated string to the end of a `StringBuf`.
|
|
*
|
|
* If appending would cause the internal buffer to overflow, `realloc`s are
|
|
* performed internally to accommodate.
|
|
*
|
|
* @param sb
|
|
* A valid pointer to a `StringBuf` instance.
|
|
* @param s
|
|
* The `char*` to append to the end of `sb`.
|
|
*/
|
|
void string_buf_sappend(struct StringBuf *sb, const char s[static 1]);
|
|
|
|
/**
|
|
* Convert a `StringBuf` instance into a `char*`.
|
|
*
|
|
* @param sb
|
|
* A valid pointer to a `StringBuf` instance.
|
|
* @return
|
|
* A null pointer if `sb` is null. Otherwise a `NUL`-terminated string
|
|
* corresponding to the value of `sb`. The caller takes ownership of this
|
|
* value.
|
|
*/
|
|
const char *string_buf_convert(struct StringBuf *sb);
|
|
|
|
/**
|
|
* Deallocate a previously allocated `StringBuf` instance.
|
|
*
|
|
* @param sb
|
|
* A valid pointer to a `StringBuf` instance.
|
|
*
|
|
* @see string_buf_new
|
|
*/
|
|
void string_buf_free(struct StringBuf *sb);
|
|
|
|
#endif /* _BOOTSTRAP_STRING_BUF_H */
|