sas Sat Sep 21 16:14:19 2002 EDT Modified files: /php4/ext/ircg ircg.c php_ircg.h Log: (PHP) Add ircg_eval_ecmascript_params This function turns a flat ecmascript parameter string, including escapes back into an array. 5-10 times speedup when compared to user implementation. Index: php4/ext/ircg/ircg.c diff -u php4/ext/ircg/ircg.c:1.134 php4/ext/ircg/ircg.c:1.135 --- php4/ext/ircg/ircg.c:1.134 Tue Sep 3 09:05:54 2002 +++ php4/ext/ircg/ircg.c Sat Sep 21 16:14:18 2002 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ircg.c,v 1.134 2002/09/03 13:05:54 sas Exp $ */ +/* $Id: ircg.c,v 1.135 2002/09/21 20:14:18 sas Exp $ */ /* {{{ includes */ @@ -129,6 +129,7 @@ PHP_FE(ircg_lookup_format_messages, NULL) PHP_FE(ircg_register_format_messages, NULL) PHP_FE(ircg_get_username, NULL) + PHP_FE(ircg_eval_ecmascript_params, NULL) {NULL, NULL, NULL} /* Must be the last line in ircg_functions[] */ }; /* }}} */ @@ -2013,6 +2014,118 @@ RETURN_TRUE; } /* }}} */ + +#define ADD_PARA() do { \ + if (para.len) smart_str_0(¶); \ + add_next_index_stringl(return_value, \ + para.len == 0 ? empty_string : para.c, +\ + para.len, 0); \ + para.len = 0; \ + para.c = 0; \ +} while (0) + +PHP_FUNCTION(ircg_eval_ecmascript_params) +{ + zval **str; + int s; + unsigned char *ptr, *ptre; + unsigned char c; + smart_str para = {0}; + + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) + WRONG_PARAM_COUNT; + + convert_to_string_ex(str); + + array_init(return_value); + + ptr = Z_STRVAL_PP(str); + ptre = ptr + Z_STRLEN_PP(str); + + s = 0; + + for (; ptr < ptre; ptr++) { + c = *ptr; + switch (s) { + + /* + * State 0: Looking for ' or digit + * State 1: Assembling parameter inside '..' + * State 2: After escape sign: Copies single char verbatim, go to 1 + * State 3: Assembling numeric para, no quotation + * State 4: Looking for ",", skipping whitespace + */ + + case 0: + switch (c) { + case '\'': + s = 1; + para.len = 0; + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + s = 3; + smart_str_appendc(¶, c); + break; + + default: /* erroneous */ + return; + } + break; + + case 1: + switch (c) { + case '\\': + s = 2; + break; + + case '\'': + s = 4; + ADD_PARA(); + break; + + default: + smart_str_appendc(¶, c); + break; + } + break; + + case 2: + smart_str_appendc(¶, c); + s = 1; + break; + + case 3: + switch (c) { + case ',': + s = 0; + ADD_PARA(); + break; + + default: + smart_str_appendc(¶, c); + break; + } + break; + + case 4: + switch (c) { + case ',': + s = 0; + break; + } + break; + } + } + + if (para.len != 0) { + if (s == 3) + ADD_PARA(); + else + smart_str_free(¶); + } +} /* {{{ proto bool ircg_msg(void) ??? */ Index: php4/ext/ircg/php_ircg.h diff -u php4/ext/ircg/php_ircg.h:1.19 php4/ext/ircg/php_ircg.h:1.20 --- php4/ext/ircg/php_ircg.h:1.19 Thu Feb 28 03:26:18 2002 +++ php4/ext/ircg/php_ircg.h Sat Sep 21 16:14:18 2002 @@ -53,6 +53,7 @@ PHP_FUNCTION(ircg_nickname_escape); PHP_FUNCTION(ircg_nickname_unescape); PHP_FUNCTION(ircg_get_username); +PHP_FUNCTION(ircg_eval_ecmascript_params); PHP_MINIT_FUNCTION(ircg); PHP_MSHUTDOWN_FUNCTION(ircg);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php