Add seprintf

Based on seprint(2) from Plan 9. I'm not sure if my return value
exactly matches Plan 9's in the case of truncation. seprint(2) is
described only as returning a pointer to the terminating '\0', but
if it does so even in the case of truncation, it is awkward for the
caller to detect. This implementation returns end in the truncation
case, so that (ptr == end) indicates truncation.
master
C. McEnroe 2021-06-07 00:08:59 -04:00
parent 3d931d0f5a
commit 5c3cd59af6
1 changed files with 12 additions and 0 deletions

12
chat.h
View File

@ -44,6 +44,18 @@
typedef unsigned uint; typedef unsigned uint;
typedef unsigned char byte; typedef unsigned char byte;
static inline char *seprintf(char *ptr, char *end, const char *fmt, ...)
__attribute__((format(printf, 3, 4)));
static inline char *seprintf(char *ptr, char *end, const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
int n = vsnprintf(ptr, end - ptr, fmt, ap);
va_end(ap);
if (n < 0) return NULL;
ptr += n;
return (ptr > end ? end : ptr);
}
struct Cat { struct Cat {
char *buf; char *buf;
size_t cap; size_t cap;