Message ID | 1339408910-31944-1-git-send-email-colin.king@canonical.com |
---|---|
State | Accepted |
Headers | show |
On 06/11/2012 06:01 AM, Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/lib/src/fwts_log_html.c | 207 +++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 198 insertions(+), 9 deletions(-) > > diff --git a/src/lib/src/fwts_log_html.c b/src/lib/src/fwts_log_html.c > index 1ca79b8..a040b43 100644 > --- a/src/lib/src/fwts_log_html.c > +++ b/src/lib/src/fwts_log_html.c > @@ -34,6 +34,133 @@ typedef struct { > const char *name; > } fwts_log_html_stack_t; > > +typedef struct { > + unsigned char ch; /* ASCII */ > + char * html; /* HTML equivalent */ > +} fwts_log_html_ascii_t; > + > +/* > + * ASCII to HTML conversion table: > + * ISO 10646, ISO 8879, ISO 8859-1 Latin alphabet No. 1 > + * Browser support: All browsers > + */ > +static fwts_log_html_ascii_t fwts_log_html_ascii_table[] = { > + { '"', """ }, > + { '&', "&" }, > + { '<', "<" }, > + { '>', ">" }, > + { '{', "{" }, > + { '|', "|" }, > + { '}', "}" }, > + { '~', "~" }, > + > + { 160, " " }, > + { 161, "&iexl;" }, > + { 162, "¢" }, > + { 163, "£" }, > + { 164, "¤" }, > + { 165, "¥" }, > + { 166, "¦" }, > + { 167, "§" }, > + { 168, "¨" }, > + { 169, "©" }, > + { 170, "ª" }, > + { 171, "«" }, > + { 172, "¬" }, > + { 173, "­" }, > + { 174, "®" }, > + { 175, "¯" }, > + > + { 176, "°" }, > + { 177, "±" }, > + { 178, "²" }, > + { 179, "³" }, > + { 180, "´" }, > + { 181, "µ" }, > + { 182, "¶" }, > + { 183, "·" }, > + { 184, "¸" }, > + { 185, "¹" }, > + { 186, "º" }, > + { 187, "»" }, > + { 187, "¼" }, > + { 189, "½" }, > + { 190, "¾" }, > + { 191, "¿" }, > + > + /* Probably never used, but here in case */ > + > + { 192, "À" }, > + { 193, "Á" }, > + { 194, "Â" }, > + { 195, "Ã" }, > + { 196, "Ä" }, > + { 197, "Å" }, > + { 198, "Æ" }, > + { 199, "Ç" }, > + { 200, "È" }, > + { 201, "É" }, > + { 202, "Ê" }, > + { 203, "Ë" }, > + { 204, "&lgrave;" }, > + { 205, "ĺ" }, > + { 206, "&lcirc;" }, > + { 207, "&luml;" }, > + > + { 208, "Ð" }, > + { 209, "Ñ" }, > + { 210, "Ò" }, > + { 211, "Ó" }, > + { 212, "Ô" }, > + { 213, "Õ" }, > + { 214, "Ö" }, > + { 215, "×" }, > + { 216, "Ø" }, > + { 217, "Ù" }, > + { 218, "Ú" }, > + { 219, "Û" }, > + { 220, "Ü" }, > + { 221, "Ý" }, > + { 222, "Þ" }, > + { 223, "ß" }, > + > + { 224, "à" }, > + { 225, "á" }, > + { 226, "â" }, > + { 227, "ã" }, > + { 228, "ä" }, > + { 229, "å" }, > + { 230, "æ" }, > + { 231, "ç" }, > + { 232, "è" }, > + { 233, "é" }, > + { 234, "ê" }, > + { 235, "&emuml;" }, > + { 236, "ì" }, > + { 237, "í" }, > + { 238, "î" }, > + { 239, "ï" }, > + > + { 240, "ð" }, > + { 241, "ñ" }, > + { 242, "ò" }, > + { 243, "ó" }, > + { 244, "ô" }, > + { 245, "õ" }, > + { 246, "ö" }, > + { 247, "÷" }, > + { 248, "ø" }, > + { 249, "ù" }, > + { 250, "ú" }, > + { 251, "û" }, > + { 252, "ü" }, > + { 253, "ý" }, > + { 254, "þ" }, > + { 255, "ÿ" }, > + > + { 0, NULL }, > +}; > + > static fwts_log_html_stack_t html_stack[MAX_HTML_STACK]; > static int html_stack_index = 0; > > @@ -49,6 +176,58 @@ static void fwts_log_html(fwts_log_file *log_file, const char *fmt, ...) > va_end(args); > } > > +/* > + * fwts_log_html_convert_ascii() > + * return a static string containing any convertion from ASCII to a > + * HTML representation of char ch. If no conversion needed, just > + * return a string containing the ch. > + */ > +static char *fwts_log_html_convert_ascii(const char ch) > +{ > + int i; > + static char buf[2]; > + > + for (i = 0; fwts_log_html_ascii_table[i].html != NULL; i++) { > + if (fwts_log_html_ascii_table[i].ch == ch) > + return fwts_log_html_ascii_table[i].html; > + } > + > + /* No mapping, just return string containing ch */ > + buf[0] = ch; > + buf[1] = '\0'; > + > + return buf; > +} > + > +/* > + * fwts_log_html_convert_ascii_str() > + * convert an ASCII string into a HTML encoded string. The returned > + * string needs free'ing once finished with. > + */ > +static char *fwts_log_html_convert_ascii_str(const char *buffer) > +{ > + const char *str1; > + char *converted; > + size_t len = 0; > + > + /* Step 1, figure out how much space we need */ > + for (str1 = buffer; *str1; str1++) { > + char *str = fwts_log_html_convert_ascii(*str1); > + len += strlen(str); > + } > + > + if ((converted = calloc(len + 1, 1)) == NULL) > + return NULL; > + > + /* Step 2, convert */ > + for (str1 = buffer; *str1; str1++) { > + char *str = fwts_log_html_convert_ascii(*str1); > + strcat(converted, str); > + } > + > + return converted; > +} > + > > /* > * fwts_log_print_html() > @@ -67,6 +246,7 @@ static int fwts_log_print_html( > char *style; > char *code_start; > char *code_end; > + char *html_converted; > > if (!((field & LOG_FIELD_MASK) & fwts_log_filter)) > return 0; > @@ -74,6 +254,12 @@ static int fwts_log_print_html( > if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG)) > return 0; > > + if ((html_converted = fwts_log_html_convert_ascii_str(buffer)) == NULL) { > + /* We can't report an error via the logging mechanism in case we loop */ > + fprintf(stderr, "Out of memory converting html.\n"); > + exit(EXIT_FAILURE); > + } > + > fwts_log_html(log_file, "<TR>\n"); > > if (field & LOG_VERBATUM) { > @@ -87,23 +273,24 @@ static int fwts_log_print_html( > switch (field & LOG_FIELD_MASK) { > case LOG_ERROR: > fwts_log_html(log_file, " <TD class=style_error>Error</TD>" > - "<TD COLSPAN=2>%s</TD>\n", buffer); > + "<TD COLSPAN=2>%s</TD>\n", html_converted); > break; > case LOG_WARNING: > fwts_log_html(log_file, " <TD class=style_error>Warning</TD>" > "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > case LOG_HEADING: > fwts_log_html(log_file, "<TD COLSPAN=2 class=style_heading>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > case LOG_INFO: > fwts_log_html(log_file, " <TD></TD><TD COLSPAN=2 class=style_infos>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > case LOG_PASSED: > - fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n", buffer); > + fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n", > + html_converted); > break; > case LOG_FAILED: > switch (level) { > @@ -128,30 +315,32 @@ static int fwts_log_print_html( > str = fwts_log_level_to_str(level); > > fwts_log_html(log_file, " <TD%s>%s [%s]</TD>\n", style, *status ? status : "", str); > - fwts_log_html(log_file, " <TD>%s</TD>\n", buffer); > + fwts_log_html(log_file, " <TD>%s</TD>\n", html_converted); > break; > > case LOG_SKIPPED: > fwts_log_html(log_file, "<TD class=style_skipped>Skipped</TD>" > - "<TD>%s%s%s</TD>\n", code_start, buffer, code_end); > + "<TD>%s%s%s</TD>\n", code_start, html_converted, code_end); > break; > > case LOG_SUMMARY: > fwts_log_html(log_file, " <TD></TD>" > "<TD COLSPAN=2 class=style_summary>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > > case LOG_ADVICE: > fwts_log_html(log_file, " <TD class=style_advice>Advice</TD>" > "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > > default: > break; > } > > + free(html_converted); > + > fwts_log_html(log_file, "</TR>\n"); > fflush(log_file->fp); Looks good to me, and renders with no issues or warnings while generating: http://ouwish.com/~vanhoof/pickup/cking/fwts_2012-06-11/results.html Tested-by: Chris Van Hoof <vanhoof@canonical.com>
On Mon, Jun 11, 2012 at 6:01 PM, Colin King <colin.king@canonical.com> wrote: > From: Colin Ian King <colin.king@canonical.com> > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/lib/src/fwts_log_html.c | 207 +++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 198 insertions(+), 9 deletions(-) > > diff --git a/src/lib/src/fwts_log_html.c b/src/lib/src/fwts_log_html.c > index 1ca79b8..a040b43 100644 > --- a/src/lib/src/fwts_log_html.c > +++ b/src/lib/src/fwts_log_html.c > @@ -34,6 +34,133 @@ typedef struct { > const char *name; > } fwts_log_html_stack_t; > > +typedef struct { > + unsigned char ch; /* ASCII */ > + char * html; /* HTML equivalent */ > +} fwts_log_html_ascii_t; > + > +/* > + * ASCII to HTML conversion table: > + * ISO 10646, ISO 8879, ISO 8859-1 Latin alphabet No. 1 > + * Browser support: All browsers > + */ > +static fwts_log_html_ascii_t fwts_log_html_ascii_table[] = { > + { '"', """ }, > + { '&', "&" }, > + { '<', "<" }, > + { '>', ">" }, > + { '{', "{" }, > + { '|', "|" }, > + { '}', "}" }, > + { '~', "~" }, > + > + { 160, " " }, > + { 161, "&iexl;" }, > + { 162, "¢" }, > + { 163, "£" }, > + { 164, "¤" }, > + { 165, "¥" }, > + { 166, "¦" }, > + { 167, "§" }, > + { 168, "¨" }, > + { 169, "©" }, > + { 170, "ª" }, > + { 171, "«" }, > + { 172, "¬" }, > + { 173, "­" }, > + { 174, "®" }, > + { 175, "¯" }, > + > + { 176, "°" }, > + { 177, "±" }, > + { 178, "²" }, > + { 179, "³" }, > + { 180, "´" }, > + { 181, "µ" }, > + { 182, "¶" }, > + { 183, "·" }, > + { 184, "¸" }, > + { 185, "¹" }, > + { 186, "º" }, > + { 187, "»" }, > + { 187, "¼" }, > + { 189, "½" }, > + { 190, "¾" }, > + { 191, "¿" }, > + > + /* Probably never used, but here in case */ > + > + { 192, "À" }, > + { 193, "Á" }, > + { 194, "Â" }, > + { 195, "Ã" }, > + { 196, "Ä" }, > + { 197, "Å" }, > + { 198, "Æ" }, > + { 199, "Ç" }, > + { 200, "È" }, > + { 201, "É" }, > + { 202, "Ê" }, > + { 203, "Ë" }, > + { 204, "&lgrave;" }, > + { 205, "ĺ" }, > + { 206, "&lcirc;" }, > + { 207, "&luml;" }, > + > + { 208, "Ð" }, > + { 209, "Ñ" }, > + { 210, "Ò" }, > + { 211, "Ó" }, > + { 212, "Ô" }, > + { 213, "Õ" }, > + { 214, "Ö" }, > + { 215, "×" }, > + { 216, "Ø" }, > + { 217, "Ù" }, > + { 218, "Ú" }, > + { 219, "Û" }, > + { 220, "Ü" }, > + { 221, "Ý" }, > + { 222, "Þ" }, > + { 223, "ß" }, > + > + { 224, "à" }, > + { 225, "á" }, > + { 226, "â" }, > + { 227, "ã" }, > + { 228, "ä" }, > + { 229, "å" }, > + { 230, "æ" }, > + { 231, "ç" }, > + { 232, "è" }, > + { 233, "é" }, > + { 234, "ê" }, > + { 235, "&emuml;" }, > + { 236, "ì" }, > + { 237, "í" }, > + { 238, "î" }, > + { 239, "ï" }, > + > + { 240, "ð" }, > + { 241, "ñ" }, > + { 242, "ò" }, > + { 243, "ó" }, > + { 244, "ô" }, > + { 245, "õ" }, > + { 246, "ö" }, > + { 247, "÷" }, > + { 248, "ø" }, > + { 249, "ù" }, > + { 250, "ú" }, > + { 251, "û" }, > + { 252, "ü" }, > + { 253, "ý" }, > + { 254, "þ" }, > + { 255, "ÿ" }, > + > + { 0, NULL }, > +}; > + > static fwts_log_html_stack_t html_stack[MAX_HTML_STACK]; > static int html_stack_index = 0; > > @@ -49,6 +176,58 @@ static void fwts_log_html(fwts_log_file *log_file, const char *fmt, ...) > va_end(args); > } > > +/* > + * fwts_log_html_convert_ascii() > + * return a static string containing any convertion from ASCII to a > + * HTML representation of char ch. If no conversion needed, just > + * return a string containing the ch. > + */ > +static char *fwts_log_html_convert_ascii(const char ch) > +{ > + int i; > + static char buf[2]; > + > + for (i = 0; fwts_log_html_ascii_table[i].html != NULL; i++) { > + if (fwts_log_html_ascii_table[i].ch == ch) > + return fwts_log_html_ascii_table[i].html; > + } > + > + /* No mapping, just return string containing ch */ > + buf[0] = ch; > + buf[1] = '\0'; > + > + return buf; > +} > + > +/* > + * fwts_log_html_convert_ascii_str() > + * convert an ASCII string into a HTML encoded string. The returned > + * string needs free'ing once finished with. > + */ > +static char *fwts_log_html_convert_ascii_str(const char *buffer) > +{ > + const char *str1; > + char *converted; > + size_t len = 0; > + > + /* Step 1, figure out how much space we need */ > + for (str1 = buffer; *str1; str1++) { > + char *str = fwts_log_html_convert_ascii(*str1); > + len += strlen(str); > + } > + > + if ((converted = calloc(len + 1, 1)) == NULL) > + return NULL; > + > + /* Step 2, convert */ > + for (str1 = buffer; *str1; str1++) { > + char *str = fwts_log_html_convert_ascii(*str1); > + strcat(converted, str); > + } > + > + return converted; > +} > + > > /* > * fwts_log_print_html() > @@ -67,6 +246,7 @@ static int fwts_log_print_html( > char *style; > char *code_start; > char *code_end; > + char *html_converted; > > if (!((field & LOG_FIELD_MASK) & fwts_log_filter)) > return 0; > @@ -74,6 +254,12 @@ static int fwts_log_print_html( > if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG)) > return 0; > > + if ((html_converted = fwts_log_html_convert_ascii_str(buffer)) == NULL) { > + /* We can't report an error via the logging mechanism in case we loop */ > + fprintf(stderr, "Out of memory converting html.\n"); > + exit(EXIT_FAILURE); > + } > + > fwts_log_html(log_file, "<TR>\n"); > > if (field & LOG_VERBATUM) { > @@ -87,23 +273,24 @@ static int fwts_log_print_html( > switch (field & LOG_FIELD_MASK) { > case LOG_ERROR: > fwts_log_html(log_file, " <TD class=style_error>Error</TD>" > - "<TD COLSPAN=2>%s</TD>\n", buffer); > + "<TD COLSPAN=2>%s</TD>\n", html_converted); > break; > case LOG_WARNING: > fwts_log_html(log_file, " <TD class=style_error>Warning</TD>" > "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > case LOG_HEADING: > fwts_log_html(log_file, "<TD COLSPAN=2 class=style_heading>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > case LOG_INFO: > fwts_log_html(log_file, " <TD></TD><TD COLSPAN=2 class=style_infos>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > case LOG_PASSED: > - fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n", buffer); > + fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n", > + html_converted); > break; > case LOG_FAILED: > switch (level) { > @@ -128,30 +315,32 @@ static int fwts_log_print_html( > str = fwts_log_level_to_str(level); > > fwts_log_html(log_file, " <TD%s>%s [%s]</TD>\n", style, *status ? status : "", str); > - fwts_log_html(log_file, " <TD>%s</TD>\n", buffer); > + fwts_log_html(log_file, " <TD>%s</TD>\n", html_converted); > break; > > case LOG_SKIPPED: > fwts_log_html(log_file, "<TD class=style_skipped>Skipped</TD>" > - "<TD>%s%s%s</TD>\n", code_start, buffer, code_end); > + "<TD>%s%s%s</TD>\n", code_start, html_converted, code_end); > break; > > case LOG_SUMMARY: > fwts_log_html(log_file, " <TD></TD>" > "<TD COLSPAN=2 class=style_summary>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > > case LOG_ADVICE: > fwts_log_html(log_file, " <TD class=style_advice>Advice</TD>" > "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", > - code_start, buffer, code_end); > + code_start, html_converted, code_end); > break; > > default: > break; > } > > + free(html_converted); > + > fwts_log_html(log_file, "</TR>\n"); > fflush(log_file->fp); > > -- > 1.7.10.4 > Acked-by: Keng-Yu Lin <kengyu@canonical.com>
On 06/11/2012 06:01 PM, Colin King wrote: > From: Colin Ian King<colin.king@canonical.com> > > Signed-off-by: Colin Ian King<colin.king@canonical.com> > --- > src/lib/src/fwts_log_html.c | 207 +++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 198 insertions(+), 9 deletions(-) > > diff --git a/src/lib/src/fwts_log_html.c b/src/lib/src/fwts_log_html.c > index 1ca79b8..a040b43 100644 > --- a/src/lib/src/fwts_log_html.c > +++ b/src/lib/src/fwts_log_html.c Acked-by: Alex Hung <alex.hung@canonical.com>
diff --git a/src/lib/src/fwts_log_html.c b/src/lib/src/fwts_log_html.c index 1ca79b8..a040b43 100644 --- a/src/lib/src/fwts_log_html.c +++ b/src/lib/src/fwts_log_html.c @@ -34,6 +34,133 @@ typedef struct { const char *name; } fwts_log_html_stack_t; +typedef struct { + unsigned char ch; /* ASCII */ + char * html; /* HTML equivalent */ +} fwts_log_html_ascii_t; + +/* + * ASCII to HTML conversion table: + * ISO 10646, ISO 8879, ISO 8859-1 Latin alphabet No. 1 + * Browser support: All browsers + */ +static fwts_log_html_ascii_t fwts_log_html_ascii_table[] = { + { '"', """ }, + { '&', "&" }, + { '<', "<" }, + { '>', ">" }, + { '{', "{" }, + { '|', "|" }, + { '}', "}" }, + { '~', "~" }, + + { 160, " " }, + { 161, "&iexl;" }, + { 162, "¢" }, + { 163, "£" }, + { 164, "¤" }, + { 165, "¥" }, + { 166, "¦" }, + { 167, "§" }, + { 168, "¨" }, + { 169, "©" }, + { 170, "ª" }, + { 171, "«" }, + { 172, "¬" }, + { 173, "­" }, + { 174, "®" }, + { 175, "¯" }, + + { 176, "°" }, + { 177, "±" }, + { 178, "²" }, + { 179, "³" }, + { 180, "´" }, + { 181, "µ" }, + { 182, "¶" }, + { 183, "·" }, + { 184, "¸" }, + { 185, "¹" }, + { 186, "º" }, + { 187, "»" }, + { 187, "¼" }, + { 189, "½" }, + { 190, "¾" }, + { 191, "¿" }, + + /* Probably never used, but here in case */ + + { 192, "À" }, + { 193, "Á" }, + { 194, "Â" }, + { 195, "Ã" }, + { 196, "Ä" }, + { 197, "Å" }, + { 198, "Æ" }, + { 199, "Ç" }, + { 200, "È" }, + { 201, "É" }, + { 202, "Ê" }, + { 203, "Ë" }, + { 204, "&lgrave;" }, + { 205, "ĺ" }, + { 206, "&lcirc;" }, + { 207, "&luml;" }, + + { 208, "Ð" }, + { 209, "Ñ" }, + { 210, "Ò" }, + { 211, "Ó" }, + { 212, "Ô" }, + { 213, "Õ" }, + { 214, "Ö" }, + { 215, "×" }, + { 216, "Ø" }, + { 217, "Ù" }, + { 218, "Ú" }, + { 219, "Û" }, + { 220, "Ü" }, + { 221, "Ý" }, + { 222, "Þ" }, + { 223, "ß" }, + + { 224, "à" }, + { 225, "á" }, + { 226, "â" }, + { 227, "ã" }, + { 228, "ä" }, + { 229, "å" }, + { 230, "æ" }, + { 231, "ç" }, + { 232, "è" }, + { 233, "é" }, + { 234, "ê" }, + { 235, "&emuml;" }, + { 236, "ì" }, + { 237, "í" }, + { 238, "î" }, + { 239, "ï" }, + + { 240, "ð" }, + { 241, "ñ" }, + { 242, "ò" }, + { 243, "ó" }, + { 244, "ô" }, + { 245, "õ" }, + { 246, "ö" }, + { 247, "÷" }, + { 248, "ø" }, + { 249, "ù" }, + { 250, "ú" }, + { 251, "û" }, + { 252, "ü" }, + { 253, "ý" }, + { 254, "þ" }, + { 255, "ÿ" }, + + { 0, NULL }, +}; + static fwts_log_html_stack_t html_stack[MAX_HTML_STACK]; static int html_stack_index = 0; @@ -49,6 +176,58 @@ static void fwts_log_html(fwts_log_file *log_file, const char *fmt, ...) va_end(args); } +/* + * fwts_log_html_convert_ascii() + * return a static string containing any convertion from ASCII to a + * HTML representation of char ch. If no conversion needed, just + * return a string containing the ch. + */ +static char *fwts_log_html_convert_ascii(const char ch) +{ + int i; + static char buf[2]; + + for (i = 0; fwts_log_html_ascii_table[i].html != NULL; i++) { + if (fwts_log_html_ascii_table[i].ch == ch) + return fwts_log_html_ascii_table[i].html; + } + + /* No mapping, just return string containing ch */ + buf[0] = ch; + buf[1] = '\0'; + + return buf; +} + +/* + * fwts_log_html_convert_ascii_str() + * convert an ASCII string into a HTML encoded string. The returned + * string needs free'ing once finished with. + */ +static char *fwts_log_html_convert_ascii_str(const char *buffer) +{ + const char *str1; + char *converted; + size_t len = 0; + + /* Step 1, figure out how much space we need */ + for (str1 = buffer; *str1; str1++) { + char *str = fwts_log_html_convert_ascii(*str1); + len += strlen(str); + } + + if ((converted = calloc(len + 1, 1)) == NULL) + return NULL; + + /* Step 2, convert */ + for (str1 = buffer; *str1; str1++) { + char *str = fwts_log_html_convert_ascii(*str1); + strcat(converted, str); + } + + return converted; +} + /* * fwts_log_print_html() @@ -67,6 +246,7 @@ static int fwts_log_print_html( char *style; char *code_start; char *code_end; + char *html_converted; if (!((field & LOG_FIELD_MASK) & fwts_log_filter)) return 0; @@ -74,6 +254,12 @@ static int fwts_log_print_html( if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG)) return 0; + if ((html_converted = fwts_log_html_convert_ascii_str(buffer)) == NULL) { + /* We can't report an error via the logging mechanism in case we loop */ + fprintf(stderr, "Out of memory converting html.\n"); + exit(EXIT_FAILURE); + } + fwts_log_html(log_file, "<TR>\n"); if (field & LOG_VERBATUM) { @@ -87,23 +273,24 @@ static int fwts_log_print_html( switch (field & LOG_FIELD_MASK) { case LOG_ERROR: fwts_log_html(log_file, " <TD class=style_error>Error</TD>" - "<TD COLSPAN=2>%s</TD>\n", buffer); + "<TD COLSPAN=2>%s</TD>\n", html_converted); break; case LOG_WARNING: fwts_log_html(log_file, " <TD class=style_error>Warning</TD>" "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", - code_start, buffer, code_end); + code_start, html_converted, code_end); break; case LOG_HEADING: fwts_log_html(log_file, "<TD COLSPAN=2 class=style_heading>%s%s%s</TD>\n", - code_start, buffer, code_end); + code_start, html_converted, code_end); break; case LOG_INFO: fwts_log_html(log_file, " <TD></TD><TD COLSPAN=2 class=style_infos>%s%s%s</TD>\n", - code_start, buffer, code_end); + code_start, html_converted, code_end); break; case LOG_PASSED: - fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n", buffer); + fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n", + html_converted); break; case LOG_FAILED: switch (level) { @@ -128,30 +315,32 @@ static int fwts_log_print_html( str = fwts_log_level_to_str(level); fwts_log_html(log_file, " <TD%s>%s [%s]</TD>\n", style, *status ? status : "", str); - fwts_log_html(log_file, " <TD>%s</TD>\n", buffer); + fwts_log_html(log_file, " <TD>%s</TD>\n", html_converted); break; case LOG_SKIPPED: fwts_log_html(log_file, "<TD class=style_skipped>Skipped</TD>" - "<TD>%s%s%s</TD>\n", code_start, buffer, code_end); + "<TD>%s%s%s</TD>\n", code_start, html_converted, code_end); break; case LOG_SUMMARY: fwts_log_html(log_file, " <TD></TD>" "<TD COLSPAN=2 class=style_summary>%s%s%s</TD>\n", - code_start, buffer, code_end); + code_start, html_converted, code_end); break; case LOG_ADVICE: fwts_log_html(log_file, " <TD class=style_advice>Advice</TD>" "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", - code_start, buffer, code_end); + code_start, html_converted, code_end); break; default: break; } + free(html_converted); + fwts_log_html(log_file, "</TR>\n"); fflush(log_file->fp);