From 3335c8ea0da0fb6f5be77cb57980fcaa4b0daaf5 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Sat, 17 Jul 1999 20:03:10 +0000 Subject: [PATCH] -Kill compile warnings in apache.c -Make preg_grep() work with copies of array entries --- ext/apache/apache.c | 4 +-- ext/pcre/php_pcre.c | 77 +++++++++++++++++++++++++-------------------- 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/ext/apache/apache.c b/ext/apache/apache.c index d80d2cbfa8..6b35ae52fe 100644 --- a/ext/apache/apache.c +++ b/ext/apache/apache.c @@ -362,10 +362,10 @@ PHP_FUNCTION(apache_lookup_uri) add_property_string(return_value,"the_request",rr->the_request,1); } if (rr->status_line) { - add_property_string(return_value,"status_line",rr->status_line,1); + add_property_string(return_value,"status_line",(char *)rr->status_line,1); } if (rr->method) { - add_property_string(return_value,"method",rr->method,1); + add_property_string(return_value,"method",(char *)rr->method,1); } if (rr->content_type) { add_property_string(return_value,"content_type",(char *)rr->content_type,1); diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index c90835f0b9..0e4c0e8f61 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -1010,7 +1010,8 @@ PHP_FUNCTION(preg_grep) { zval *regex, /* Regular expression */ *input, /* Input array */ - **entry; /* An entry in the input array */ + *entry, /* A copy of the entry in the input array */ + **entry_ptr; /* An entry in the input array */ pcre *re = NULL; /* Compiled regular expression */ pcre_extra *extra = NULL; /* Holds results of studying */ int preg_options = 0; /* Custom preg options */ @@ -1045,48 +1046,56 @@ PHP_FUNCTION(preg_grep) /* Initialize return array */ array_init(return_value); - + + /* Allocate entry storage */ + entry = (zval *)emalloc(sizeof(zval)); + /* Go through the input array */ zend_hash_internal_pointer_reset(input->value.ht); - while(zend_hash_get_current_data(input->value.ht, (void **)&entry) == SUCCESS) { - - /* Only match against strings */ - if ((*entry)->type == IS_STRING) { - /* Perform the match */ - count = pcre_exec(re, extra, (*entry)->value.str.val, - (*entry)->value.str.len, (*entry)->value.str.val, - 0, offsets, size_offsets, 0); - - /* Check for too many substrings condition. */ - if (count == 0) { - zend_error(E_NOTICE, "Matched, but too many substrings\n"); - count = size_offsets/3; - } + while(zend_hash_get_current_data(input->value.ht, (void **)&entry_ptr) == SUCCESS) { - /* If something matched */ - if (count > 0) { - (*entry)->refcount++; - - /* Add to return array */ - switch(zend_hash_get_current_key(input->value.ht, &string_key, &num_key)) - { - case HASH_KEY_IS_STRING: - zend_hash_update(return_value->value.ht, string_key, - strlen(string_key)+1, entry, sizeof(zval *), NULL); - efree(string_key); - break; - - case HASH_KEY_IS_LONG: - zend_hash_next_index_insert(return_value->value.ht, entry, - sizeof(zval *), NULL); - break; - } + /* Copy entry and convert to string */ + *entry = **entry_ptr; + zval_copy_ctor(entry); + convert_to_string(entry); + + /* Perform the match */ + count = pcre_exec(re, extra, entry->value.str.val, + entry->value.str.len, entry->value.str.val, + 0, offsets, size_offsets, 0); + + /* Check for too many substrings condition. */ + if (count == 0) { + zend_error(E_NOTICE, "Matched, but too many substrings\n"); + count = size_offsets/3; + } + + /* If something matched */ + if (count > 0) { + (*entry_ptr)->refcount++; + + /* Add to return array */ + switch(zend_hash_get_current_key(input->value.ht, &string_key, &num_key)) + { + case HASH_KEY_IS_STRING: + zend_hash_update(return_value->value.ht, string_key, + strlen(string_key)+1, entry_ptr, sizeof(zval *), NULL); + efree(string_key); + break; + + case HASH_KEY_IS_LONG: + zend_hash_next_index_insert(return_value->value.ht, entry_ptr, + sizeof(zval *), NULL); + break; } } + zval_dtor(entry); zend_hash_move_forward(input->value.ht); } + /* Clean up */ + efree(entry); efree(offsets); } /* }}} */ -- 2.40.0