Differences From
Artifact [7c7116050b]:
19 19 #define _pstrOf(a) ((pstr){.v=_strDynMem(a), .sz=_strDynSz(a)})
20 20
21 21 #define _array(t) struct {t* v; size_t sz;}
22 22 typedef _array(char) pstr;
23 23
24 24 #define _pstrLit(a) ((pstr){.v=(a),.sz=sizeof(a)-1})
25 25
26 -#define _drop(x) ({ \
26 +#define _drop(x) { \
27 27 if (x.v) { \
28 28 _free (x.v); \
29 29 x.v = nullptr; \
30 30 x.sz = 0; \
31 31 } \
32 -})
32 +}
33 33 #define _new(T, n) ((T){ \
34 - .v = _alloc( typeof( ((typeof(T)) {}).v ), n), \
34 + .v = _alloc( typeof( *((typeof(T)) {}).v ), n), \
35 35 .sz = n, \
36 36 })
37 37
38 +static inline pstr
39 +pstrDup(pstr p) {
40 + if (p.v == nullptr) return p;
41 + if (p.sz == 0) p.sz = strlen(p.v);
42 + auto n = _new(pstr, p.sz + 1);
43 + memcpy(n.v, p.v, p.sz);
44 + n.v[p.sz] = 0;
45 + n.sz = p.sz;
46 + return n;
47 +}