[PATCH] lib: fwts_log_html: convert misc ASCII chars to HTML mnemonics
Chris Van Hoof
vanhoof at canonical.com
Mon Jun 11 15:57:06 UTC 2012
On 06/11/2012 06:01 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Signed-off-by: Colin Ian King <colin.king at 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 at canonical.com>
More information about the fwts-devel
mailing list