diff options
Diffstat (limited to 'ext/satellite/hashtable.c')
-rw-r--r-- | ext/satellite/hashtable.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/ext/satellite/hashtable.c b/ext/satellite/hashtable.c new file mode 100644 index 0000000000..68f801f423 --- /dev/null +++ b/ext/satellite/hashtable.c @@ -0,0 +1,101 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: David Eriksson <eriksson@php.net> | + +----------------------------------------------------------------------+ + */ + +/* + * $Id$ + * vim: syntax=c tabstop=2 shiftwidth=2 + */ + +/* + * HashTable helpers + */ +#include "hashtable.h" +#include "zend_API.h" + +#ifndef FALSE +#define FALSE 0 +#endif + +/* + * duplicate a zval + */ +static zval * orbit_duplicate_zval(const zval * pValue) +{ + zval * p_new_value = NULL; + + if (pValue == NULL) + return NULL; + + ALLOC_ZVAL(p_new_value); /* allocate */ + memcpy(p_new_value, pValue, sizeof(zval)); /* raw data copy */ + zval_copy_ctor(p_new_value); /* smart data copy */ + INIT_PZVAL(p_new_value); /* set reference count */ + + return p_new_value; +} + +/* + * store a zval in a hashtable with a key + */ +zend_bool orbit_store_by_key(HashTable * pHashTable, const char * pKey, const zval * pValue) +{ + int result = FAILURE; + void * p_destination = NULL; + zval * p_new_value = NULL; + + if (pHashTable == NULL || pKey == NULL || pValue == NULL) + return FALSE; + + p_new_value = orbit_duplicate_zval(pValue); + + result = zend_hash_update( + pHashTable, + (char *)pKey, /* discard const */ + strlen(pKey)+1, + p_new_value, + sizeof(zval), + &p_destination + ); + + return result == SUCCESS; +} + +/* + * find a zval in a hashtable with a key + */ +zval * orbit_find_by_key(HashTable * pHashTable, const char * pKey) +{ + int result = FAILURE; + zval * p_value = NULL; + + result = zend_hash_find( + pHashTable, + (char *)pKey, /* discard const */ + strlen(pKey)+1, + (void**)&p_value + ); + + if (result != SUCCESS) + { + p_value = NULL; + } + + return p_value; +} + + |