From 805ed17f932c39a885fba725980cabc38535b9ec Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 25 Jun 2023 04:36:29 +1100 Subject: [PATCH] Fix XML escapes in JUnit output --- tests/crt.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/crt.c b/tests/crt.c index 5ec355e..7782cb7 100644 --- a/tests/crt.c +++ b/tests/crt.c @@ -51,6 +51,8 @@ unsigned long random_between(int lo, int hi) { // FORMATTING AND IO +bool fmt_xml_escapes = false; + static void fprintc(FILE *file, char c) { fputc(c, file); } @@ -61,6 +63,27 @@ static void fprints(FILE *file, char *str) { } } +static void fprintc_maybe_xml(FILE *file, char c) { + if(c == '"' && fmt_xml_escapes) { + fprints(file, """); + } + else if(c == '&' && fmt_xml_escapes) { + fprints(file, "&"); + } + else if(c == '<' && fmt_xml_escapes) { + fprints(file, "<"); + } + else if(c == '>' && fmt_xml_escapes) { + fprints(file, ">"); + } + else if(c == '\'' && fmt_xml_escapes) { + fprints(file, "'"); + } + else { + fprintc(file, c); + } +} + static void fprintd(FILE *file, int32_t number, int width) { if(number < 0) { fprintc(file, '-'); @@ -109,14 +132,17 @@ static void fvprint_fmt(FILE *file, char *fmt, va_list args) { } if(*fmt == 'c') { int ch = va_arg(args, int); - fprintc(file, ch); + fprintc_maybe_xml(file, ch); } else if(*fmt == '%') { fprintc(file, '%'); } else if(*fmt == 's') { char *str = va_arg(args, char*); - fprints(file, str); + while(*str != 0) { + fprintc_maybe_xml(file, *str); + ++str; + } } else if(*fmt == 'd') { int32_t i = va_arg(args, int32_t); @@ -338,6 +364,7 @@ static void print_test_results(Test_Feature *features) { // JUNIT OUTPUT static void junit_write(char *path, Test_Feature *features) { + fmt_xml_escapes = true; FILE *xml = fopen(path, "wb"); // TODO: store tests and failures in an object instead of calculating it like that int total_test_count = 0; @@ -371,6 +398,7 @@ static void junit_write(char *path, Test_Feature *features) { } fprint_fmt(xml, "\n"); fclose(xml); + fmt_xml_escapes = false; } // TEST MACROS