@@ -28,24 +28,30 @@ union { const char* ptr; char* mutptr; }; // im sorry okay - bool heap; +# ifndef k_static + bool heap; +# endif size_t len; } safestr; -void delstr(safestr s) fn ({ - if (s.heap) { free(s.mutptr); } -}); +#ifndef k_static + void delstr(safestr s) fn ({ + if (s.heap) { free(s.mutptr); } + }); +#endif void clrstr(safestr* s) fn ({ - delstr(*s); - s->heap = false; +# ifndef k_static + delstr(*s); + s->heap = false; +# endif s->ptr = NULL; s->len = 0; }) -char* compose(pstr* lst,size_t ct, size_t* strsz) fn({ +size_t pstrsum(pstr* lst,size_t ct) fn({ size_t len = 0; for (size_t i = 0; i < ct; ++i) { if (lst[i].len == 0) { if (lst[i].ptr == NULL) continue; @@ -52,18 +58,48 @@ lst[i].len = strlen(lst[i].ptr); } len += lst[i].len; } - if (strsz != NULL) *strsz = len; - if (len == 0) return NULL; - - char* str = malloc(len + 1); - char* ptr = str; +}) + +char* pstrcoll(pstr* lst, size_t ct, char* ptr) fn({ for (size_t i = 0; i < ct; ++i) { if (lst[i].len == 0) continue; strncpy(ptr,lst[i].ptr,lst[i].len); ptr += lst[i].len; } + return ptr; +}) + +#ifndef k_static +char* compose(pstr* lst,size_t ct, size_t* strsz) fn({ + size_t len = pstrsum(lst,ct) + if (strsz != NULL) *strsz = len; + if (len == 0) return NULL; + + char* str = malloc(len + 1); + char* ptr = pstrcoll(lst, ct, ptr); *ptr = 0; return str; }); +#endif + +char* impose(pstr* lst,size_t ct, size_t* strsz, char* buf) fn({ + size_t len = pstrsum(lst,ct); + if (strsz != NULL) *strsz = len; + if (len == 0) return NULL; + + char* ptr = pstrcoll(lst, ct, buf); + *ptr = 0; + return ptr; +}); +char* imprint(pstr lst, size_t* strsz, char* buf) fn({ + size_t len = pstrsum(&lst,1); + if (strsz != NULL) *strsz = len; + if (len == 0) return NULL; + + char* ptr = pstrcoll(&lst,1,buf); + *ptr = 0; + return ptr; +}); +#undef fn