]> granicus.if.org Git - php/commitdiff
changed preg_*() to yield NULL instead of '' for unset substrings
authorChristoph M. Becker <cmbecker69@gmx.de>
Sat, 23 May 2015 17:44:42 +0000 (19:44 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Sat, 23 May 2015 17:44:42 +0000 (19:44 +0200)
ext/pcre/php_pcre.c

index 3420a099882bc5cfb5d93ba14a690f8a9ae2017c..0fe5afd988480e4e1e8dd8491ecfc3e13fe20473 100644 (file)
@@ -540,7 +540,11 @@ static inline void add_offset_pair(zval *result, char *str, int len, int offset,
        array_init_size(&match_pair, 2);
 
        /* Add (match, offset) to the return value */
-       ZVAL_STRINGL(&tmp, str, len);
+       if (offset < 0) { /* unset substring */
+               ZVAL_NULL(&tmp);
+       } else {
+               ZVAL_STRINGL(&tmp, str, len);
+       }
        zend_hash_next_index_insert_new(Z_ARRVAL(match_pair), &tmp);
        ZVAL_LONG(&tmp, offset);
        zend_hash_next_index_insert_new(Z_ARRVAL(match_pair), &tmp);
@@ -741,8 +745,12 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec
                                                        }
                                                } else {
                                                        for (i = 0; i < count; i++) {
-                                                               add_next_index_stringl(&match_sets[i], (char *)stringlist[i],
-                                                                                                          offsets[(i<<1)+1] - offsets[i<<1]);
+                                                               if (offsets[i<<1] < 0) { /* unset substring */
+                                                                       add_next_index_null(&match_sets[i]);
+                                                               } else {
+                                                                       add_next_index_stringl(&match_sets[i], (char *)stringlist[i],
+                                                                                                                  offsets[(i<<1)+1] - offsets[i<<1]);
+                                                               }
                                                        }
                                                }
                                                /* Add MARK, if available */
@@ -755,11 +763,11 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec
                                                /*
                                                 * If the number of captured subpatterns on this run is
                                                 * less than the total possible number, pad the result
-                                                * arrays with empty strings.
+                                                * arrays with NULLs.
                                                 */
                                                if (count < num_subpats) {
                                                        for (; i < num_subpats; i++) {
-                                                               add_next_index_string(&match_sets[i], "");
+                                                               add_next_index_null(&match_sets[i]);
                                                        }
                                                }
                                        } else {
@@ -776,11 +784,19 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec
                                                        } else {
                                                                for (i = 0; i < count; i++) {
                                                                        if (subpat_names[i]) {
-                                                                               add_assoc_stringl(&result_set, subpat_names[i], (char *)stringlist[i],
+                                                                       if (offsets[i<<1] < 0) { /* unset substring */
+                                                                               add_assoc_null(&result_set, subpat_names[i]);
+                                                                       } else {
+                                                                                       add_assoc_stringl(&result_set, subpat_names[i], (char *)stringlist[i],
+                                                                                                                                  offsets[(i<<1)+1] - offsets[i<<1]);
+                                                                       }
+                                                                       }
+                                                                       if (offsets[i<<1] < 0) { /* unset substring */
+                                                                               add_next_index_null(&result_set);
+                                                                       } else {
+                                                                               add_next_index_stringl(&result_set, (char *)stringlist[i],
                                                                                                                           offsets[(i<<1)+1] - offsets[i<<1]);
                                                                        }
-                                                                       add_next_index_stringl(&result_set, (char *)stringlist[i],
-                                                                                                                  offsets[(i<<1)+1] - offsets[i<<1]);
                                                                }
                                                        }
                                                } else {
@@ -791,8 +807,12 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec
                                                                }
                                                        } else {
                                                                for (i = 0; i < count; i++) {
-                                                                       add_next_index_stringl(&result_set, (char *)stringlist[i],
-                                                                                                                  offsets[(i<<1)+1] - offsets[i<<1]);
+                                                                       if (offsets[i<<1] < 0) { /* unset substring */
+                                                                               add_next_index_null(&result_set);
+                                                                       } else {
+                                                                               add_next_index_stringl(&result_set, (char *)stringlist[i],
+                                                                                                                          offsets[(i<<1)+1] - offsets[i<<1]);
+                                                                       }
                                                                }
                                                        }
                                                }
@@ -815,11 +835,19 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec
                                                } else {
                                                        for (i = 0; i < count; i++) {
                                                                if (subpat_names[i]) {
-                                                                       add_assoc_stringl(subpats, subpat_names[i], (char *)stringlist[i],
-                                                                                                         offsets[(i<<1)+1] - offsets[i<<1]);
+                                                                       if (offsets[i<<1] < 0) { /* unset substring */
+                                                                               add_assoc_null(subpats, subpat_names[i]);
+                                                                       } else {
+                                                                               add_assoc_stringl(subpats, subpat_names[i], (char *)stringlist[i],
+                                                                                                                 offsets[(i<<1)+1] - offsets[i<<1]);
+                                                                       }
+                                                               }
+                                                               if (offsets[i<<1] < 0) { /* unset substring */
+                                                                       add_next_index_null(subpats);
+                                                               } else {
+                                                                       add_next_index_stringl(subpats, (char *)stringlist[i],
+                                                                                                                  offsets[(i<<1)+1] - offsets[i<<1]);
                                                                }
-                                                               add_next_index_stringl(subpats, (char *)stringlist[i],
-                                                                                                          offsets[(i<<1)+1] - offsets[i<<1]);
                                                        }
                                                }
                                        } else {
@@ -831,8 +859,12 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec
                                                        }
                                                } else {
                                                        for (i = 0; i < count; i++) {
-                                                               add_next_index_stringl(subpats, (char *)stringlist[i],
-                                                                                                          offsets[(i<<1)+1] - offsets[i<<1]);
+                                                               if (offsets[i<<1] < 0) { /* unset substring */
+                                                                       add_next_index_null(subpats);
+                                                               } else {
+                                                                       add_next_index_stringl(subpats, (char *)stringlist[i],
+                                                                                                                  offsets[(i<<1)+1] - offsets[i<<1]);
+                                                               }
                                                        }
                                                }
                                        }