HTML-escape high characters Modified: trunk/web/reactos.org/htdocs/roscms/inc/generate_page.php Added: trunk/web/reactos.org/phpext/ Added: trunk/web/reactos.org/phpext/config.m4 Added: trunk/web/reactos.org/phpext/php_roscms.h Added: trunk/web/reactos.org/phpext/roscms.c _____
Modified: trunk/web/reactos.org/htdocs/roscms/inc/generate_page.php --- trunk/web/reactos.org/htdocs/roscms/inc/generate_page.php 2006-01-14 21:57:07 UTC (rev 20866) +++ trunk/web/reactos.org/htdocs/roscms/inc/generate_page.php 2006-01-14 22:18:07 UTC (rev 20867) @@ -392,7 +392,9 @@
// redirect all bad links to the frontpage: $data_page = str_replace("[#link_",$roscms_intern_path_server."?page=index&temp=" ,$data_page); // correct link - + // Replace high chars by their html-escaped version + $data_page = roscms_unicode_escape($data_page); + // Output & View: switch ($rpm_sec2) { case "genpage": // generate a single page _____
Added: trunk/web/reactos.org/phpext/config.m4 --- trunk/web/reactos.org/phpext/config.m4 2006-01-14 21:57:07 UTC (rev 20866) +++ trunk/web/reactos.org/phpext/config.m4 2006-01-14 22:18:07 UTC (rev 20867) @@ -0,0 +1,8 @@
+dnl config.m4 for extension roscms + +PHP_ARG_ENABLE(roscms, whether to enable roscms support, +[ --enable-roscms Enable roscms support]) + +if test "$PHP_ROSCMS" != "no"; then + PHP_NEW_EXTENSION(roscms, roscms.c, $ext_shared) +fi Property changes on: trunk/web/reactos.org/phpext/config.m4 ___________________________________________________________________ Name: svn:eol-style + native _____
Added: trunk/web/reactos.org/phpext/php_roscms.h --- trunk/web/reactos.org/phpext/php_roscms.h 2006-01-14 21:57:07 UTC (rev 20866) +++ trunk/web/reactos.org/phpext/php_roscms.h 2006-01-14 22:18:07 UTC (rev 20867) @@ -0,0 +1,21 @@
+#ifndef PHP_ROSCMS_H +#define PHP_ROSCMS_H + +extern zend_module_entry roscms_module_entry; +#define phpext_roscms_ptr &roscms_module_entry + +#ifdef PHP_WIN32 +#define PHP_ROSCMS_API __declspec(dllexport) +#else +#define PHP_ROSCMS_API +#endif + +#ifdef ZTS +#include "TSRM.h" +#endif + +PHP_MINFO_FUNCTION(roscms); + +PHP_FUNCTION(roscms_unicode_escape); + +#endif /* PHP_ROSCMS_H */ Property changes on: trunk/web/reactos.org/phpext/php_roscms.h ___________________________________________________________________ Name: svn:eol-style + native _____
Added: trunk/web/reactos.org/phpext/roscms.c --- trunk/web/reactos.org/phpext/roscms.c 2006-01-14 21:57:07 UTC (rev 20866) +++ trunk/web/reactos.org/phpext/roscms.c 2006-01-14 22:18:07 UTC (rev 20867) @@ -0,0 +1,206 @@
+#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" +#include "php_roscms.h" + +/* + * Every user visible function must have an entry in roscms_functions[]. + */ +function_entry roscms_functions[] = { + PHP_FE(roscms_unicode_escape,NULL) + {NULL, NULL, NULL} /* Must be the last line in roscms_functions[] */ +}; + +zend_module_entry roscms_module_entry = { +#if ZEND_MODULE_API_NO >= 20010901 + STANDARD_MODULE_HEADER, +#endif + "roscms", + roscms_functions, + NULL, + NULL, + NULL, + NULL, + PHP_MINFO(roscms), +#if ZEND_MODULE_API_NO >= 20010901 + "1.0", /* Replace with version number for your extension */ +#endif + STANDARD_MODULE_PROPERTIES +}; + +#ifdef COMPILE_DL_ROSCMS +ZEND_GET_MODULE(roscms) +#endif + +PHP_MINFO_FUNCTION(roscms) +{ + php_info_print_table_start(); + php_info_print_table_header(2, "roscms support", "enabled"); + php_info_print_table_end(); +} +/* {{{ proto string roscms_unicode_escape(string arg) + Return a string in which characters > 127 have been HTML-escaped */ +PHP_FUNCTION(roscms_unicode_escape) +{ + unsigned char *in, *out, *pi, *po; + unsigned in_len, out_len; + unsigned i; + unsigned val, len; + int has_high; + char msg[128]; + unsigned size; + + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", + &in, &in_len)) + { + RETURN_NULL(); + } + + /* We make a first pass over the input string. If there are high chars, + we use this pass to compute the total amount of mem required. If there + aren't any high chars (will probably happen a lot), we can skip the + conversion */ + size = 0; + i = 0; + pi = in; + has_high = 0; + while (i < in_len) + { + if (*pi <= 127) + { + size++; + i++; + pi++; + } + else + { + if (192 <= *pi && *pi < 224) + { + i += 2; + pi += 2; + } + else if (224 <= *pi && *pi < 240) + { + i += 3; + pi += 3; + } + else if (240 <= *pi && *pi < 248) + { + i += 4; + pi += 4; + } + else if (248 <= *pi && *pi < 252) + { + i += 5; + pi += 5; + } + else if (252 <= *pi && *pi < 254) + { + i += 6; + pi += 6; + } + else + { + RETURN_NULL(); + } + has_high = 1; + size += 8; /*  */ + } + } + + /* Now check if any high chars were found. If not, just return the input */ + if (! has_high) + { + RETURN_STRINGL((char *) in, in_len, 1); + } + + size++; + out = emalloc(size); + if (NULL == out) + { + RETURN_NULL(); + } + + i = 0; + pi = in; + out_len = 0; + po = out; + while (i < in_len) + { + if (*pi <= 127) + { + i++; + *po++ = *pi++; + out_len++; + } + else + { + if (192 <= *pi && *pi < 224) + { + val = (pi[0] - 192) * 64 + + (pi[1] - 128); + i += 2; + pi += 2; + } + else if (224 <= *pi && *pi < 240) + { + val = (pi[0] - 224) * 4096 + + (pi[1] - 128) * 64 + + (pi[2] - 128); + i += 3; + pi += 3; + } + else if (240 <= *pi && *pi < 248) + { + val = (pi[0] - 240) * 262144 + + (pi[1] - 128) * 4096 + + (pi[2] - 128) * 64 + + (pi[3] - 128); + i += 4; + pi += 4; + } + else if (248 <= *pi && *pi < 252) + { + val = (pi[0] - 248) * 16777216 + + (pi[1] - 128) * 262144 + + (pi[2] - 128) * 4096 + + (pi[3] - 128) * 64 + + (pi[4] - 128); + i += 5; + pi += 5; + } + else if (252 <= *pi && *pi < 254) + { + val = (pi[0] - 252) * 1073741824 + + (pi[1] - 128) * 16777216 + + (pi[2] - 128) * 262144 + + (pi[3] - 128) * 4096 + + (pi[4] - 128) * 64 + + (pi[5] - 128); + i += 6; + pi += 6; + } + else + { + RETURN_NULL(); + } + php_sprintf((char *) po, "&#%u;", val); + out_len += strlen((char *)po); + po = out + out_len; + } + } + *po = '\0'; + + if (size < out_len + 1) + { + sprintf(msg, "roscms_unicode_escape: buffer overflow size %u needed %d", + size, out_len); + zend_error(E_ERROR, msg); + } + + RETURN_STRINGL((char *) out, out_len, 0); +} Property changes on: trunk/web/reactos.org/phpext/roscms.c ___________________________________________________________________ Name: svn:eol-style + native