strb_t
String buffer interface for C
Loading...
Searching...
No Matches
strb.h
Go to the documentation of this file.
1// Copyright 2024 Christopher Bazley
2// SPDX-License-Identifier: MIT
13#ifndef STRB_H
14#define STRB_H
15
16#include <inttypes.h>
17#include <stdarg.h>
18#include <stdbool.h>
19#include <stddef.h>
20#include <stdint.h>
21
25#ifndef STRB_EXT_STATE
26#define STRB_EXT_STATE 1
27#endif
28
32#ifndef STRB_UNPUTC
33#define STRB_UNPUTC 1
34#endif
35
39#ifndef STRB_RESTORE
40#define STRB_RESTORE 1
41#endif
42
46#ifndef STRB_REUSE_CONST
47#define STRB_REUSE_CONST 1
48#endif
49
53#if defined(_MSC_VER) || \
54 (defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L)
55#define STRB_SIZE_HINT(X)
56#else
57#define STRB_SIZE_HINT(X) static restrict X
58#endif
59
60#if STRB_FREESTANDING
61// No static or dynamic allocation
65#define STRB_MAX SIZE_MAX
70typedef uint8_t strbsize_t;
74#define PRIstrbsize PRIu8
75
79#define STRB_MAX_SIZE UINT8_MAX
80
81#elif STRB_STATIC_ALLOC
82// About 2KB of static storage
86#define STRB_MAX (8) // must not exceed 8
87
92typedef uint8_t strbsize_t;
93
97#define PRIstrbsize PRIu8
98
102#define STRB_MAX_SIZE (256 - 8)
103
104#else
105// Unlimited dynamic allocation
109#define STRB_MAX SIZE_MAX
110
115typedef uint16_t strbsize_t;
116
120#define PRIstrbsize PRIu16
121
125#define STRB_MAX_SIZE UINT16_MAX
126
131#define STRB_DFL_SIZE (256)
132
137#define STRB_MAX_INTERNAL_SIZE (256)
138
142#define STRB_GROW_FACTOR (2)
143
144#endif
145
146/* A type qualifier named _Optional has been used throughout this interface to
147 * clarify declarations. This qualifier was proposed by N3089, which was
148 * reviewed by the committee at the Strasbourg meeting in January 2024 with
149 * strong consensus to proceed. It can be ignored (here, by defining it as an
150 * empty macro) without substantially changing the meaning of the code.
151 */
152#ifdef USE_OPTIONAL
153
154#if !STRB_FREESTANDING
155#include <stdarg.h>
156#include <stdio.h>
157#include <stdlib.h>
158
159static inline void optional_free(_Optional void *x)
160{
161 free((void *)x);
162}
163#undef free
164#define free(x) optional_free(x)
165
166static inline _Optional void *optional_malloc(size_t n)
167{
168 return malloc(n);
169}
170#undef malloc
171#define malloc(n) optional_malloc(n)
172
173static inline _Optional void *optional_realloc(_Optional void *p, size_t n)
174{
175 return realloc((void *)p, n);
176}
177#undef realloc
178#define realloc(p, n) optional_realloc(p, n)
179
180static inline int optional_vsnprintf(_Optional char *buffer, size_t sz,
181 const char *format, va_list vlist)
182{
183 return vsnprintf((char *)buffer, sz, format, vlist);
184}
185#undef vsnprintf
186#define vsnprintf(buffer, sz, format, vlist) \
187 optional_vsnprintf(buffer, sz, format, vlist)
188#endif // !STRB_FREESTANDING
189
190#undef NULL
191#define NULL ((_Optional void *)0)
192
193#else
194#define _Optional
195#endif
196
205typedef struct strb_t strb_t;
206
210typedef struct {
211#if STRB_UNPUTC
212 char unputc_char;
213#endif
214#if STRB_RESTORE
215 char restore_char;
216#endif
217 char flags;
218 strbsize_t len, size, pos;
219 char *buf;
220} strbprivate_t;
221
222#if STRB_EXT_STATE
223
237typedef struct {
241 strbprivate_t p;
243
281strb_t *strb_use(strbstate_t *restrict sbs, size_t size,
282 char buf[STRB_SIZE_HINT(size)]);
283
327_Optional strb_t *strb_reuse(strbstate_t *restrict sbs, size_t size,
328 char buf[STRB_SIZE_HINT(size)]);
329
330#if STRB_REUSE_CONST
361_Optional const strb_t *strb_reuse_const(strbstate_t *restrict sbs,
362 const char buf[STRB_SIZE_HINT(1)]);
363#endif
364
365#elif !STRB_FREESTANDING
366
398_Optional strb_t *strb_use(size_t size, char buf[STRB_SIZE_HINT(size)]);
399
435_Optional strb_t *strb_reuse(size_t size, char buf[STRB_SIZE_HINT(size)]);
436
437#endif
438
439#if !STRB_FREESTANDING
465_Optional strb_t *strb_alloc(size_t n);
466
493_Optional strb_t *strb_dup(const char *str);
494
525_Optional strb_t *strb_ndup(const char *str, size_t n);
526
556_Optional strb_t *strb_aprintf(const char *restrict format, ...);
557
588_Optional strb_t *strb_vaprintf(const char *restrict format, va_list args);
589
608void strb_free(_Optional strb_t *sb);
609#endif
610
625char *strb_ptr(strb_t *sb);
626
630const char *strb_cptr(strb_t const *sb);
631
632#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
633#define strb_ptr(sb) \
634 _Generic(sb, strb_t *: strb_ptr, const strb_t *: strb_cptr)(sb)
635#endif
636
652size_t strb_len(strb_t const *sb);
653
657enum {
671
697int strb_setmode(strb_t *sb, int mode);
698
709int strb_getmode(const strb_t *sb);
710
743int strb_seek(strb_t *sb, size_t pos);
744
755size_t strb_tell(strb_t const *sb);
756
781int strb_putc(strb_t *sb, int c);
782
806int strb_nputc(strb_t *sb, int c, size_t n);
807
808#if STRB_UNPUTC
838int strb_unputc(strb_t *sb);
839#endif
840
866int strb_puts(strb_t *restrict sb, const char *restrict str);
867
894int strb_nputs(strb_t *restrict sb, const char *restrict str, size_t n);
895
896#if !STRB_FREESTANDING
925int strb_vputf(strb_t *restrict sb, const char *restrict format, va_list args);
926
955int strb_putf(strb_t *restrict sb, const char *restrict format, ...);
956#endif
957
993_Optional char *strb_write(strb_t *sb, size_t n);
994
1015void strb_split(strb_t *sb);
1016
1049void strb_restore(strb_t *sb);
1050
1054#define strb_wrote(sb) strb_restore(sb)
1055
1082void strb_delto(strb_t *sb, size_t pos);
1083
1104int strb_cpy(strb_t *restrict sb, const char *restrict str);
1105
1130int strb_ncpy(strb_t *restrict sb, const char *restrict str, size_t n);
1131
1132#if !STRB_FREESTANDING
1133
1161int strb_vprintf(strb_t *restrict sb, const char *restrict format,
1162 va_list args);
1163
1191int strb_printf(strb_t *restrict sb, const char *restrict format, ...);
1192#endif
1193
1221bool strb_error(strb_t const *sb);
1222
1232void strb_clearerr(strb_t *sb);
1233
1234#endif // STRB_H
@ strb_insert
Definition strb.h:663
@ strb_overwrite
Definition strb.h:669
#define STRB_SIZE_HINT(X)
Definition strb.h:57
int strb_seek(strb_t *sb, size_t pos)
Set the editing position of a string buffer.
Definition strb.c:453
int strb_vprintf(strb_t *restrict sb, const char *restrict format, va_list args)
Print a generated string into a string buffer.
Definition strb.c:805
_Optional strb_t * strb_ndup(const char *str, size_t n)
Create a string buffer object with internal storage by duplicating a sequence of characters.
Definition strb.c:315
int strb_getmode(const strb_t *sb)
Get the editing mode of a string buffer.
Definition strb.c:443
_Optional strb_t * strb_vaprintf(const char *restrict format, va_list args)
Create a string buffer object with internal storage by parsing a format string.
Definition strb.c:338
int strb_printf(strb_t *restrict sb, const char *restrict format,...)
Print a generated string into a string buffer.
Definition strb.c:811
size_t strb_tell(strb_t const *sb)
Get the editing position of a string buffer.
Definition strb.c:471
void strb_delto(strb_t *sb, size_t pos)
Delete characters to a specified position in a string buffer.
Definition strb.c:746
_Optional strb_t * strb_alloc(size_t n)
Create a string buffer object with internal storage.
Definition strb.c:269
void strb_free(_Optional strb_t *sb)
Destroy a string buffer object.
Definition strb.c:384
_Optional strb_t * strb_dup(const char *str)
Create a string buffer object with internal storage by duplicating a string.
Definition strb.c:368
int strb_nputs(strb_t *restrict sb, const char *restrict str, size_t n)
Put a sequence of characters into a string buffer.
Definition strb.c:532
int strb_cpy(strb_t *restrict sb, const char *restrict str)
Copy a string into a string buffer.
Definition strb.c:798
_Optional const strb_t * strb_reuse_const(strbstate_t *restrict sbs, const char buf[STRB_SIZE_HINT(1)])
Create a string buffer object that wraps a constant string.
Definition strb.c:179
void strb_restore(strb_t *sb)
Restore a character that may have been overwritten by a preceding write.
Definition strb.c:733
size_t strb_len(strb_t const *sb)
Get the number of characters stored in a string buffer.
Definition strb.c:415
char * strb_ptr(strb_t *sb)
Get a pointer to the character array underlying a string buffer.
Definition strb.c:402
bool strb_error(strb_t const *sb)
Get the error indicator of a string buffer.
Definition strb.c:824
int strb_unputc(strb_t *sb)
Undo the last put character operation.
Definition strb.c:502
int strb_nputc(strb_t *sb, int c, size_t n)
Put a character into a string buffer multiple times.
Definition strb.c:489
const char * strb_cptr(strb_t const *sb)
Definition strb.c:409
int strb_putf(strb_t *restrict sb, const char *restrict format,...)
Put a generated string into a string buffer.
Definition strb.c:575
int strb_puts(strb_t *restrict sb, const char *restrict str)
Put a string into a string buffer.
Definition strb.c:545
void strb_clearerr(strb_t *sb)
Clear the error indicator of a string buffer.
Definition strb.c:830
void strb_split(strb_t *sb)
Split a string at the current position.
Definition strb.c:725
int strb_vputf(strb_t *restrict sb, const char *restrict format, va_list args)
Put a generated string into a string buffer.
Definition strb.c:552
_Optional char * strb_write(strb_t *sb, size_t n)
Prepare to write characters directly into a string buffer.
Definition strb.c:645
strb_t * strb_use(strbstate_t *restrict sbs, size_t size, char buf[STRB_SIZE_HINT(size)])
Create a string buffer object for managing an external character array.
Definition strb.c:139
int strb_putc(strb_t *sb, int c)
Put a character into a string buffer.
Definition strb.c:484
int strb_ncpy(strb_t *restrict sb, const char *restrict str, size_t n)
Copy a sequence of characters into a string buffer.
Definition strb.c:792
int strb_setmode(strb_t *sb, int mode)
Set the editing mode of a string buffer.
Definition strb.c:428
uint16_t strbsize_t
Definition strb.h:115
_Optional strb_t * strb_aprintf(const char *restrict format,...)
Create a string buffer object with internal storage by parsing a format string.
Definition strb.c:373
_Optional strb_t * strb_reuse(strbstate_t *restrict sbs, size_t size, char buf[STRB_SIZE_HINT(size)])
Create a string buffer object by reusing an external character array.
Definition strb.c:154
Definition strb.c:49
String buffer state.
Definition strb.h:237