]> Pileus Git - ~andy/ct/commitdiff
Add escaping printf specifier
authorAndy Spencer <andy753421@gmail.com>
Sun, 22 Nov 2009 08:25:06 +0000 (08:25 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sun, 22 Nov 2009 08:25:06 +0000 (08:25 +0000)
.gitignore
lib.c [new file with mode: 0644]
mkfile

index 1a422674868cb9187664464ed8f79b7561328c4b..a4007cceafef22da9a98b4ad3805915efc66768a 100644 (file)
@@ -1,5 +1,6 @@
 *.o
 *~
 ct
+lib
 parse.[ch]
 scan.c
diff --git a/lib.c b/lib.c
new file mode 100644 (file)
index 0000000..7b46a05
--- /dev/null
+++ b/lib.c
@@ -0,0 +1,43 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <printf.h>
+
+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("&#39;",  stream); break;
+               case '\'': len += fputs("&quot;", stream); break;
+               case '&':  len += fputs("&amp;",  stream); break;
+               case '<':  len += fputs("&lt;",   stream); break;
+               case '>':  len += fputs("&gt;",   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", "<Hello, World>");
+       printf("%M\n", "<Hello, World>");
+       printf("%M\n", "<Hello, World>");
+       return 0;
+}
diff --git a/mkfile b/mkfile
index c7e4898687fd9bc2d82d2543a37540befa88feee..db6213b4853d78b61377a3827a96ecd35eb37fa8 100644 (file)
--- 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