diff options
Diffstat (limited to 'render/textplain.c')
-rw-r--r-- | render/textplain.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/render/textplain.c b/render/textplain.c index 0a7f5db7c..4b08e0acc 100644 --- a/render/textplain.c +++ b/render/textplain.c @@ -9,6 +9,7 @@ #include "netsurf/content/content.h" #include "netsurf/render/html.h" #include "netsurf/render/textplain.h" +#include "netsurf/utils/messages.h" static const char header[] = "<html><body><pre>"; @@ -25,6 +26,52 @@ bool textplain_create(struct content *c, const char *params[]) return true; } +bool textplain_process_data(struct content *c, char *data, + unsigned int size) +{ + unsigned int i, s; + char *d, *p; + union content_msg_data msg_data; + bool ret; + + /* count number of '<' in data buffer */ + for (d = data, i = 0, s = 0; i != size; i++, d++) { + if (*d == '<') + s++; + } + + /* create buffer for modified input */ + d = calloc(size + 3*s, sizeof(char)); + if (!d) { + msg_data.error = messages_get("NoMemory"); + content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + return false; + } + + /* copy data across to modified buffer, + * replacing occurrences of '<' with '<' + * This prevents the parser stripping sequences of '<...>' + */ + for (p = d, i = 0, s = 0; i != size; i++, data++) { + if (*data == '<') { + *p++ = '&'; + *p++ = 'l'; + *p++ = 't'; + *p++ = ';'; + s += 4; + } + else { + *p++ = *data; + s++; + } + } + + ret = html_process_data(c, d, s); + + free(d); + + return ret; +} bool textplain_convert(struct content *c, int width, int height) { |