summaryrefslogtreecommitdiff
path: root/main/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/main.c')
-rw-r--r--main/main.c48
1 files changed, 45 insertions, 3 deletions
diff --git a/main/main.c b/main/main.c
index 96411157ba..26c21068b8 100644
--- a/main/main.c
+++ b/main/main.c
@@ -377,12 +377,54 @@ PHPAPI int php_printf(const char *format, ...)
}
/* }}} */
-
/* {{{ php_html_puts */
-/* wrapper for backwards compatibility */
+#include "ext/standard/php_smart_str.h"
+
PHPAPI void php_html_puts(const char *str, uint size TSRMLS_DC)
{
- zend_html_puts(str, size);
+ const char *end = str+size;
+ const char *p = str;
+ smart_str s = {0};
+
+ while (p < end) {
+ switch (*p) {
+ case '\n':
+ smart_str_appendl(&s, "<br />", sizeof("<br />")-1);
+ break;
+ case '<':
+ smart_str_appendl(&s, "&lt;", sizeof("&lt;")-1);
+ break;
+ case '>':
+ smart_str_appendl(&s, "&gt;", sizeof("&gt;")-1);
+ break;
+ case '&':
+ smart_str_appendl(&s, "&amp;", sizeof("&amp;")-1);
+ break;
+ case ' ': {
+ const char *nextchar = p+1, *prevchar = p-1;
+
+ /* series of spaces should be converted to &nbsp;'s */
+ if (((nextchar < end) && *nextchar==' ')
+ || ((prevchar >= str) && *prevchar==' ')) {
+ smart_str_appendl(&s, "&nbsp;", sizeof("&nbsp;")-1);
+ } else {
+ smart_str_appendc(&s, ' ');
+ }
+ }
+ break;
+ case '\t':
+ smart_str_appendl(&s, "&nbsp;&nbsp;&nbsp;&nbsp;", sizeof("&nbsp;&nbsp;&nbsp;&nbsp;")-1);
+ break;
+ default:
+ smart_str_appendc(&s, *p);
+ }
+ p++;
+ }
+
+ if (s.c) {
+ PHPWRITE(s.c, s.len);
+ smart_str_free(&s);
+ }
}
/* }}} */