gdjn  Diff

Differences From Artifact [7c7116050b]:

To Artifact [91836a2225]:


    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  +}