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