#ifndef HASH_H #define HASH_H 1 #include "php.h" #include "string.h" #include "main/php_main.h" #include "Zend/zend_API.h" #include "zend_exceptions.h" #include "zend_interfaces.h" #include "zend_object_handlers.h" #include "ext/pcre/php_pcre.h" #include "ext/standard/php_string.h" #include "php_r3.h" #include "r3_mux.h" #include "r3_functions.h" #if R3_DEBUG #define HT_OK 0 #define HT_IS_DESTROYING 1 #define HT_DESTROYED 2 #define HT_CLEANING 3 static void _zend_is_inconsistent(const HashTable *ht, const char *file, int line) { if (ht->inconsistent==HT_OK) { return; } switch (ht->inconsistent) { case HT_IS_DESTROYING: zend_output_debug_string(1, "%s(%d) : ht=%p is being destroyed", file, line, ht); break; case HT_DESTROYED: zend_output_debug_string(1, "%s(%d) : ht=%p is already destroyed", file, line, ht); break; case HT_CLEANING: zend_output_debug_string(1, "%s(%d) : ht=%p is being cleaned", file, line, ht); break; default: zend_output_debug_string(1, "%s(%d) : ht=%p is inconsistent", file, line, ht); break; } zend_bailout(); } #define IS_CONSISTENT(a) _zend_is_inconsistent(a, __FILE__, __LINE__); #define SET_INCONSISTENT(n) ht->inconsistent = n; #else #define IS_CONSISTENT(a) #define SET_INCONSISTENT(n) #endif HashTable * zend_hash_clone_persistent(HashTable* src TSRMLS_DC); HashTable * zend_hash_clone(HashTable* src TSRMLS_DC); typedef void* (*ht_copy_fun_t)(void*, void*, int TSRMLS_DC); HashTable * my_copy_hashtable(HashTable *target, HashTable *source, ht_copy_fun_t copy_fn, void *tmp, uint size, int persistent TSRMLS_DC); #endif