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(&para); \
+                               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(&para, c);
+                               break;
+
+                       default: /* erroneous */
+                               return;
+                       }
+                       break;
+
+               case 1:
+                       switch (c) {
+                       case '\\':
+                               s = 2;
+                               break;
+
+                       case '\'':
+                               s = 4;
+                               ADD_PARA();
+                               break;
+
+                       default:
+                               smart_str_appendc(&para, c);
+                               break;
+                       }
+                       break;
+
+               case 2:
+                       smart_str_appendc(&para, c);
+                       s = 1;
+                       break;
+
+               case 3:
+                       switch (c) {
+                       case ',':
+                               s = 0;
+                               ADD_PARA();
+                               break;
+
+                       default:
+                               smart_str_appendc(&para, 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(&para);
+       }
+}
 
 /* {{{ 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

Reply via email to