Jeff King [off-list ref] writes:
quoted
struct strs {...};
void strs_init(struct strs *);
void strs_push(struct strs *, const char *);
void strs_pushf(struct strs *, const char *fmt, ...);
void strs_pushl(struct strs *, ...);
void strs_pushv(struct strs *, const char **);
void strs_pop(struct strs *);
void strs_clear(struct strs *);
const char **strs_detach(struct strs *);
...is short, feels pretty natural, and doesn't require understanding
"v" for "vector".
Not bad. The "v" carries the information that it _is_ a NULL-terminated
vector and not some other list-like structure (and so is suitable for
feeding to execv, etc). But that may just be obvious from looking at its
uses and documentation.
And with "v", it probably is obvious without looking at its uses and
documentation, so... ;-)