From 4fae25ec557ca4fd79edc553f75a688d1fc80e20 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Sun, 22 Nov 2009 08:25:06 +0000 Subject: [PATCH] Add escaping printf specifier --- .gitignore | 1 + lib.c | 43 +++++++++++++++++++++++++++++++++++++++++++ mkfile | 4 +++- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 lib.c diff --git a/.gitignore b/.gitignore index 1a42267..a4007cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.o *~ ct +lib parse.[ch] scan.c diff --git a/lib.c b/lib.c new file mode 100644 index 0000000..7b46a05 --- /dev/null +++ b/lib.c @@ -0,0 +1,43 @@ +#define _GNU_SOURCE +#include +#include +#include + +static int printf_markup(FILE *stream, + const struct printf_info *info, + const void *const *args) +{ + int len = 0; + const char *str = *(const char **)args[0]; + for (int i = 0; str[i]; i++) + switch (str[i]) { + case '"': len += fputs("'", stream); break; + case '\'': len += fputs(""", stream); break; + case '&': len += fputs("&", stream); break; + case '<': len += fputs("<", stream); break; + case '>': len += fputs(">", stream); break; + default: len += fputc(str[i], stream); break; + } + return len; +} + +static int printf_markup_arginfo(const struct printf_info *info, + size_t n, int *argtypes, int *size) +{ + argtypes[0] = PA_STRING; + return 1; +} + +void ct_use_escape() +{ + register_printf_specifier('M', printf_markup, printf_markup_arginfo); +} + +int main(void) +{ + ct_use_escape(); + printf("%M\n", ""); + printf("%M\n", ""); + printf("%M\n", ""); + return 0; +} diff --git a/mkfile b/mkfile index c7e4898..db6213b 100644 --- a/mkfile +++ b/mkfile @@ -1,5 +1,7 @@ -PROGS=ct +PROGS=ct lib PKGS=glib-2.0 +lib-test:V: lib + ./lib ct-test:V: ct ./ct < example/html.ct ct: ct.o parse.o scan.o -- 2.43.2