Blender V4.5
BLI_dynstr.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9
10#include <cstdio>
11#include <cstdlib> /* malloc */
12#include <cstring>
13
14#include "BLI_dynstr.h"
15#include "BLI_memarena.h"
16#include "BLI_string.h"
17#include "BLI_utildefines.h"
18#include "MEM_guardedalloc.h"
19
20/***/
21
22struct DynStrElem {
24
25 char *str;
26};
27
33
34/***/
35
37{
38 return MEM_callocN<DynStr>("DynStr");
39}
40
42{
43 DynStr *ds = MEM_callocN<DynStr>("DynStr");
45
46 return ds;
47}
48
49template<typename T> inline T *dynstr_alloc(DynStr *__restrict ds, size_t num = 1)
50{
51 return ds->memarena ? BLI_memarena_alloc<T>(ds->memarena, num) :
52 static_cast<T *>(malloc(num * sizeof(T)));
53}
54
55void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr)
56{
58 int cstrlen = strlen(cstr);
59
60 dse->str = dynstr_alloc<char>(ds, cstrlen + 1);
61 memcpy(dse->str, cstr, cstrlen + 1);
62 dse->next = nullptr;
63
64 if (!ds->last) {
65 ds->last = ds->elems = dse;
66 }
67 else {
68 ds->last = ds->last->next = dse;
69 }
70
71 ds->curlen += cstrlen;
72}
73
74void BLI_dynstr_nappend(DynStr *__restrict ds, const char *cstr, int len)
75{
77 int cstrlen = BLI_strnlen(cstr, len);
78
79 dse->str = dynstr_alloc<char>(ds, cstrlen + 1);
80 memcpy(dse->str, cstr, cstrlen);
81 dse->str[cstrlen] = '\0';
82 dse->next = nullptr;
83
84 if (!ds->last) {
85 ds->last = ds->elems = dse;
86 }
87 else {
88 ds->last = ds->last->next = dse;
89 }
90
91 ds->curlen += cstrlen;
92}
93
94void BLI_dynstr_vappendf(DynStr *__restrict ds, const char *__restrict format, va_list args)
95{
96 char *str, fixed_buf[256];
97 size_t str_len;
98 str = BLI_vsprintfN_with_buffer(fixed_buf, sizeof(fixed_buf), &str_len, format, args);
100 if (str != fixed_buf) {
101 MEM_freeN(str);
102 }
103}
104
105void BLI_dynstr_appendf(DynStr *__restrict ds, const char *__restrict format, ...)
106{
107 va_list args;
108 char *str, fixed_buf[256];
109 size_t str_len;
110 va_start(args, format);
111 str = BLI_vsprintfN_with_buffer(fixed_buf, sizeof(fixed_buf), &str_len, format, args);
112 va_end(args);
113 if (LIKELY(str)) {
115 if (str != fixed_buf) {
116 MEM_freeN(str);
117 }
118 }
119}
120
122{
123 return ds->curlen;
124}
125
126void BLI_dynstr_get_cstring_ex(const DynStr *__restrict ds, char *__restrict rets)
127{
128 char *s;
129 const DynStrElem *dse;
130
131 for (s = rets, dse = ds->elems; dse; dse = dse->next) {
132 int slen = strlen(dse->str);
133
134 memcpy(s, dse->str, slen);
135
136 s += slen;
137 }
138 BLI_assert((s - rets) == ds->curlen);
139 rets[ds->curlen] = '\0';
140}
141
143{
144 char *rets = MEM_malloc_arrayN<char>(size_t(ds->curlen) + 1, "dynstr_cstring");
146 return rets;
147}
148
150{
151 if (ds->memarena) {
153 }
154 else {
155 for (DynStrElem *dse_next, *dse = ds->elems; dse; dse = dse_next) {
156 dse_next = dse->next;
157
158 free(dse->str);
159 free(dse);
160 }
161 }
162
163 ds->elems = ds->last = nullptr;
164 ds->curlen = 0;
165}
166
168{
169 if (ds->memarena) {
171 }
172 else {
174 }
175
176 MEM_freeN(ds);
177}
#define BLI_assert(a)
Definition BLI_assert.h:46
void BLI_dynstr_appendf(DynStr *__restrict ds, const char *__restrict format,...)
DynStr * BLI_dynstr_new_memarena()
Definition BLI_dynstr.cc:41
char * BLI_dynstr_get_cstring(const DynStr *ds)
DynStr * BLI_dynstr_new()
Definition BLI_dynstr.cc:36
void BLI_dynstr_free(DynStr *ds)
void BLI_dynstr_nappend(DynStr *__restrict ds, const char *cstr, int len)
Definition BLI_dynstr.cc:74
void BLI_dynstr_get_cstring_ex(const DynStr *__restrict ds, char *__restrict rets)
void BLI_dynstr_clear(DynStr *ds)
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr)
Definition BLI_dynstr.cc:55
T * dynstr_alloc(DynStr *__restrict ds, size_t num=1)
Definition BLI_dynstr.cc:49
void BLI_dynstr_vappendf(DynStr *__restrict ds, const char *__restrict format, va_list args)
Definition BLI_dynstr.cc:94
int BLI_dynstr_get_len(const DynStr *ds)
A dynamically sized string ADT.
void BLI_kdtree_nd_ free(KDTree *tree)
#define BLI_MEMARENA_STD_BUFSIZE
MemArena * BLI_memarena_new(size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(2) ATTR_MALLOC
void BLI_memarena_free(MemArena *ma) ATTR_NONNULL(1)
void * BLI_memarena_alloc(MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_memarena_clear(MemArena *ma) ATTR_NONNULL(1)
ATTR_WARN_UNUSED_RESULT const size_t num
char * BLI_vsprintfN_with_buffer(char *fixed_buf, size_t fixed_buf_size, size_t *result_len, const char *__restrict format, va_list args) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int char char int int int int size_t BLI_strnlen(const char *str, size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition string.cc:923
#define LIKELY(x)
Read Guarded memory(de)allocation.
#define str(s)
format
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:133
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
#define T
DynStrElem * next
Definition BLI_dynstr.cc:23
char * str
Definition BLI_dynstr.cc:25
MemArena * memarena
Definition BLI_dynstr.cc:31
DynStrElem * last
Definition BLI_dynstr.cc:29
int curlen
Definition BLI_dynstr.cc:30
DynStrElem * elems
Definition BLI_dynstr.cc:29
uint len