summaryrefslogtreecommitdiff
path: root/include/cmmm/string-builder.h
blob: 42fb24a20765f423082e7e01bcbf2b22b3436fd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#ifndef INCLUDED__CMMM__STRING_BUILDER__H
#define INCLUDED__CMMM__STRING_BUILDER__H

// #define CMMM__STRING_BUILDER__STRIP_VENDOR
// #define CMMM__STRING_BUILDER__SHORT_NAMESPACE

#include <stddef.h>
#include <string.h>
#include "cmmm/dynamic-array.h"

#define CMMM__STRING_BUILDER struct string_builder *
struct cmmm__string_builder {
  union { char *items, *string; };
  size_t count;
  size_t capacity;
};

#define CMMM__STRING_BUILDER__APPEND_CHAR(SB, CHAR)     \
  CMMM__DYNAMIC_ARRAY__APPEND (SB, CHAR)

#define CMMM__STRING_BUILDER__APPEND_BUF(SB, BUF, SIZE) \
  CMMM__DYNAMIC_ARRAY__APPEND_MANY (SB, BUF, SIZE)

#define CMMM__STRING_BUILDER__APPEND_CSTR(SB, CSTR)     \
  ({                                                    \
    const char *s = (CSTR);                             \
    size_t      n = strlen (s);                         \
    CMMM__DYNAMIC_ARRAY__APPEND_MANY(SB, s, n);         \
  })

#define CMMM__STRING_BUILDER__APPEND_CSTRS(SB, ...)             \
  cmmm__string_builder__append_cstrs (&(SB), __VA_ARGS__, NULL)

#define CMMM__STRING_BUILDER__APPEND_STRING_VIEW(SB, SV)                       \
  CMMM__DYNAMIC_ARRAY__APPEND_MANY(SB, (SV).beg, CMMM__STRING_VIEW__LENGTH (SV));

#define CMMM__STRING_BUILDER__APPEND_NULL(SB)   \
  CMMM__DYNAMIC_ARRAY__APPEND (SB, '\0')

#define CMMM__STRING_BUILDER__RESET(SB) CMMM__DYNAMIC_ARRAY__RESET (SB)
#define CMMM__STRING_BUILDER__FREE( SB) CMMM__DYNAMIC_ARRAY__FREE ( SB)

void cmmm__string_builder__append_ntimes (CMMM__STRING_BUILDER, char c, size_t n);
void cmmm__string_builder__append_cstrs  (CMMM__STRING_BUILDER,                     ...);
void cmmm__string_builder__printf        (CMMM__STRING_BUILDER, const char *format, ...);

#ifdef CMMM__STRING_BUILDER__SHORT_NAMESPACE
#define CMMM__SB_STRIP_VENDOR       CMMM__STRING_BUILDER__STRIP_VENDOR
#define CMMM__SB_SHORT_NAMESPACE    CMMM__STRING_BUILDER__SHORT_NAMESPACE
#define CMMM__SB                    CMMM__STRING_BUILDER
#define cmmm__sb                    cmmm__string_builder
#define CMMM__SB_APPEND_CHAR        CMMM__STRING_BUILDER__APPEND_CHAR
#define CMMM__SB_APPEND_BUF         CMMM__STRING_BUILDER__APPEND_BUF
#define CMMM__SB_APPEND_CSTR        CMMM__STRING_BUILDER__APPEND_CSTR
#define CMMM__SB_APPEND_CSTRS       CMMM__STRING_BUILDER__APPEND_CSTRS
#define CMMM__SB_APPEND_STRING_VIEW CMMM__STRING_BUILDER__APPEND_STRING_VIEW
#define CMMM__SB_APPEND_NULL        CMMM__STRING_BUILDER__APPEND_NULL
#define CMMM__SB_RESET              CMMM__STRING_BUILDER__RESET
#define CMMM__SB_FREE               CMMM__STRING_BUILDER__FREE
#define cmmm__sb_append_ntimes      cmmm__string_builder__append_ntimes
#define cmmm__sb_append_cstrs       cmmm__string_builder__append_cstrs
#define cmmm__sb_printf             cmmm__string_builder__printf
#endif // CMMM__STRING_BUILDER__SHORT_NAMESPACE

#ifdef CMMM__STRING_BUILDER__STRIP_VENDOR
#define STRING_BUILDER__STRIP_VENDOR       CMMM__STRING_BUILDER__STRIP_VENDOR
#define STRING_BUILDER__SHORT_NAMESPACE    CMMM__STRING_BUILDER__SHORT_NAMESPACE
#define STRING_BUILDER                     CMMM__STRING_BUILDER
#define STRING_BUILDER__APPEND_CHAR        CMMM__STRING_BUILDER__APPEND_CHAR
#define STRING_BUILDER__APPEND_BUF         CMMM__STRING_BUILDER__APPEND_BUF
#define STRING_BUILDER__APPEND_CSTR        CMMM__STRING_BUILDER__APPEND_CSTR
#define STRING_BUILDER__APPEND_CSTRS       CMMM__STRING_BUILDER__APPEND_CSTRS
#define STRING_BUILDER__APPEND_STRING_VIEW CMMM__STRING_BUILDER__APPEND_STRING_VIEW
#define STRING_BUILDER__APPEND_NULL        CMMM__STRING_BUILDER__APPEND_NULL
#define STRING_BUILDER__RESET              CMMM__STRING_BUILDER__RESET
#define STRING_BUILDER__FREE               CMMM__STRING_BUILDER__FREE
#define string_builder__append_ntimes      cmmm__string_builder__append_ntimes
#define string_builder__append_cstrs       cmmm__string_builder__append_cstrs
#define string_builder__printf             cmmm__string_builder__printf

#ifdef CMMM__STRING_BUILDER__SHORT_NAMESPACE
#define SB_STRIP_VENDOR       CMMM__STRING_BUILDER__STRIP_VENDOR
#define SB_SHORT_NAMESPACE    CMMM__STRING_BUILDER__SHORT_NAMESPACE
#define SB                    CMMM__STRING_BUILDER
#define SB_APPEND_CHAR        CMMM__STRING_BUILDER__APPEND_CHAR
#define SB_APPEND_BUF         CMMM__STRING_BUILDER__APPEND_BUF
#define SB_APPEND_CSTR        CMMM__STRING_BUILDER__APPEND_CSTR
#define SB_APPEND_CSTRS       CMMM__STRING_BUILDER__APPEND_CSTRS
#define SB_APPEND_STRING_VIEW CMMM__STRING_BUILDER__APPEND_STRING_VIEW
#define SB_APPEND_NULL        CMMM__STRING_BUILDER__APPEND_NULL
#define SB_RESET              CMMM__STRING_BUILDER__RESET
#define SB_FREE               CMMM__STRING_BUILDER__FREE
#define sb_append_ntimes      cmmm__string_builder__append_ntimes
#define sb_append_cstrs       cmmm__string_builder__append_cstrs
#define sb_printf             cmmm__string_builder__printf
#endif // CMMM__STRING_BUILDER__SHORT_NAMESPACE
#endif // CMMM__STRING_BUILDER__STRIP_VENDOR

#endif // INCLUDED__STRING_BUILDER__H