#ifndef BUF_H #define BUF_H #include typedef struct buf { size_t sz, cap; char *buf; } str_t; typedef struct { const char *s; size_t n; } strv_t; /* string views */ #define strv(s) _Generic((s),\ char *: strv_cstr, const char *: strv_cstr,\ str_t *: strv_pstr, const str_t *: strv_pstr,\ str_t: strv_str\ )(s) strv_t strv_cstr(const char *s); static inline strv_t strv_pstr(const str_t *s) { return (strv_t) { s->buf, s->sz }; } static inline strv_t strv_str(str_t s) { return (strv_t) { s.buf, s.sz }; } char strv_next(strv_t *s); int strv_split(strv_t *src, int chr, strv_t *dest); /* strings */ void str_init(str_t *, size_t); void str_grow(str_t *, size_t); void str_free(str_t *); void str_cat(str_t *b, strv_t s); void str_catc(str_t *b, char c); void str_fmt(str_t *b, const char *fmt, ...); #endif