summary refs log tree commit diff
path: root/chat.h
diff options
context:
space:
mode:
authorC. McEnroe2021-06-07 00:08:59 -0400
committerC. McEnroe2021-06-09 11:41:15 -0400
commit5c3cd59af6550d6f8d74487c1e46cdb0b171ff7d (patch)
tree3851069ae3d57ef7f6fc5f09558d3669f27c1acf /chat.h
parent3d931d0f5a0c9665774c34ce894ce4a4a9c932c0 (diff)
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.
Diffstat (limited to 'chat.h')
-rw-r--r--chat.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/chat.h b/chat.h
index e48799c..e9bee8b 100644
--- a/chat.h
+++ b/chat.h
@@ -44,6 +44,18 @@
 typedef unsigned uint;
 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 {
 	char *buf;
 	size_t cap;