iliaa Mon Jun 14 22:02:46 2004 EDT
Modified files: (Branch: PHP_4_3)
/php-src/ext/standard string.c
Log:
A faster & more memory efficient php_addslashes() implementation.
http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.333.2.39&r2=1.333.2.40&ty=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.333.2.39
php-src/ext/standard/string.c:1.333.2.40
--- php-src/ext/standard/string.c:1.333.2.39 Thu May 13 13:44:32 2004
+++ php-src/ext/standard/string.c Mon Jun 14 22:02:45 2004
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.333.2.39 2004/05/13 17:44:32 iliaa Exp $ */
+/* $Id: string.c,v 1.333.2.40 2004/06/15 02:02:45 iliaa Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -2269,10 +2269,8 @@
RETURN_EMPTY_STRING();
}
- RETURN_STRING(php_addslashes(Z_STRVAL_PP(str),
- Z_STRLEN_PP(str),
- &Z_STRLEN_P(return_value), 0
- TSRMLS_CC), 0);
+ Z_TYPE_P(return_value) = IS_STRING;
+ Z_STRVAL_P(return_value) = php_addslashes(Z_STRVAL_PP(str), Z_STRLEN_PP(str),
&Z_STRLEN_P(return_value), 0 TSRMLS_CC);
}
/* }}} */
@@ -2441,72 +2439,80 @@
}
/* }}} */
+/* true static */
+const unsigned char php_esc_list[256] =
{2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
/* {{{ php_addslashes
*/
PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_free
TSRMLS_DC)
{
- /* maximum string length, worst case situation */
- char *new_str;
- char *source, *target;
- char *end;
- int local_new_length;
-
+ char *e = str + (length ? length : (length = strlen(str)));
+ char *p = str;
+ char *new_str, *ps;
+ int local_new_length = length;
+ int type = PG(magic_quotes_sybase) ? 1 : 0;
+
if (!new_length) {
new_length = &local_new_length;
}
+
if (!str) {
*new_length = 0;
return str;
}
- new_str = (char *) emalloc((length?length:(length=strlen(str)))*2+1);
- source = str;
- end = source + length;
- target = new_str;
-
- if (PG(magic_quotes_sybase)) {
- while (source < end) {
- switch (*source) {
- case '\0':
- *target++ = '\\';
- *target++ = '0';
- break;
- case '\'':
- *target++ = '\'';
- *target++ = '\'';
- break;
- default:
- *target++ = *source;
- break;
+
+ /* determine the number of the characters that need to be escaped */
+ while (p < e) {
+ if (php_esc_list[(int)(unsigned char)*p++] > type) {
+ local_new_length++;
+ }
+ }
+
+ /* string does not have any escapable characters */
+ if (local_new_length == length) {
+ new_str = estrndup(str, length);
+ goto done;
+ }
+
+ /* create escaped string */
+ ps = new_str = emalloc(local_new_length + 1);
+ p = str;
+ if (!type) {
+ while (p < e) {
+ if (php_esc_list[(int)(unsigned char)*p]) {
+ *ps++ = '\\';
}
- source++;
+ *ps++ = *p++;
}
} else {
- while (source < end) {
- switch (*source) {
- case '\0':
- *target++ = '\\';
- *target++ = '0';
+ while (p < e) {
+ switch (php_esc_list[(int)(unsigned char)*p]) {
+ case 2:
+ *ps++ = '\\';
+ *ps++ = '0';
+ p++;
break;
- case '\'':
- case '\"':
- case '\\':
- *target++ = '\\';
- /* break is missing *intentionally* */
+
+ case 3:
+ *ps++ = '\'';
+ *ps++ = '\'';
+ p++;
+ break;
+
default:
- *target++ = *source;
- break;
+ *ps++ = *p++;
+ break;
}
-
- source++;
}
}
-
- *target = 0;
- *new_length = target - new_str;
+ *ps = '\0';
+
+done:
if (should_free) {
STR_FREE(str);
}
- new_str = (char *) erealloc(new_str, *new_length+1);
+ *new_length = local_new_length;
+
return new_str;
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php