vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit 1148f09522d8cb4a99a50d48071712eec565da85
parent f238e441f78c34038cb5da30fb4873635f1e171b
Author: Marc André Tanner <mat@brain-dump.org>
Date: Tue, 22 Sep 2015 16:32:41 +0200
text: add text_{v,}printf function
Convenient way to insert formated data into a Text.
Diffstat:
| M | text.c | | | 18 | ++++++++++++++++++ |
| M | text.h | | | 3 | +++ |
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/text.c b/text.c @@ -634,6 +634,24 @@ bool text_insert(Text *txt, size_t pos, const char *data, size_t len) { return true; } +bool text_printf(Text *txt, size_t pos, const char *format, ...) { + va_list ap; + va_start(ap, format); + bool ret = text_vprintf(txt, pos, format, ap); + va_end(ap); + return ret; +} + +bool text_vprintf(Text *txt, size_t pos, const char *format, va_list ap) { + int len = vsnprintf(NULL, 0, format, ap); + if (len == -1) + return false; + char *buf = malloc(len+1); + bool ret = buf && (vsnprintf(buf, len+1, format, ap) == len) && text_insert(txt, pos, buf, len); + free(buf); + return ret; +} + static size_t action_undo(Text *txt, Action *a) { size_t pos = EPOS; for (Change *c = a->change; c; c = c->next) { diff --git a/text.h b/text.h @@ -4,6 +4,7 @@ #include <stdbool.h> #include <time.h> #include <unistd.h> +#include <stdarg.h> #include <sys/types.h> #include <sys/stat.h> @@ -36,6 +37,8 @@ typedef struct { Text *text_load(const char *filename); /* file information at time of load or last save */ struct stat text_stat(Text*); +bool text_printf(Text*, size_t pos, const char *format, ...); +bool text_vprintf(Text*, size_t pos, const char *format, va_list ap); /* insert `len' bytes starting from `data' at `pos' which has to be * in the interval [0, text_size(txt)] */ bool text_insert(Text*, size_t pos, const char *data, size_t len);