mirror of
https://github.com/php/php-src.git
synced 2025-08-17 06:28:50 +02:00
Go back to ZE1-like code
This commit is contained in:
parent
785130c09c
commit
e89977f9d9
2 changed files with 34 additions and 61 deletions
|
@ -130,37 +130,6 @@ ZEND_API ulong zend_hash_func(char *arKey, uint nKeyLength)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ZEND_API zend_bool zend_is_numeric_key(char *arKey, uint nKeyLength, long *val)
|
|
||||||
{
|
|
||||||
char *tmp = arKey;
|
|
||||||
|
|
||||||
if ((*tmp>='0' && *tmp<='9')) { /* possibly a numeric index */
|
|
||||||
char *end=tmp+nKeyLength-1;
|
|
||||||
ulong idx;
|
|
||||||
|
|
||||||
if (*tmp++=='0' && nKeyLength>2) { /* don't accept numbers with leading zeros */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (tmp<end) {
|
|
||||||
if (!(*tmp>='0' && *tmp<='9')) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tmp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tmp==end && *tmp=='\0') { /* a numeric index */
|
|
||||||
idx = strtol(arKey, NULL, 10);
|
|
||||||
if (idx!=LONG_MAX) {
|
|
||||||
*val = idx;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
|
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
|
||||||
{
|
{
|
||||||
|
|
|
@ -89,8 +89,6 @@ typedef Bucket* HashPosition;
|
||||||
|
|
||||||
BEGIN_EXTERN_C()
|
BEGIN_EXTERN_C()
|
||||||
|
|
||||||
ZEND_API zend_bool zend_is_numeric_key(char *arKey, uint nKeyLength, long *val);
|
|
||||||
|
|
||||||
/* startup/shutdown */
|
/* startup/shutdown */
|
||||||
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC);
|
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC);
|
||||||
ZEND_API int _zend_hash_init_ex(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC);
|
ZEND_API int _zend_hash_init_ex(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC);
|
||||||
|
@ -286,51 +284,57 @@ END_EXTERN_C()
|
||||||
zend_hash_init(ht, n, NULL, ZVAL_PTR_DTOR, persistent)
|
zend_hash_init(ht, n, NULL, ZVAL_PTR_DTOR, persistent)
|
||||||
|
|
||||||
|
|
||||||
|
#define HANDLE_NUMERIC(key, length, func) { \
|
||||||
|
register char *tmp=key; \
|
||||||
|
\
|
||||||
|
if ((*tmp>='0' && *tmp<='9')) do { /* possibly a numeric index */ \
|
||||||
|
char *end=tmp+length-1; \
|
||||||
|
ulong idx; \
|
||||||
|
\
|
||||||
|
if (*tmp++=='0' && length>2) { /* don't accept numbers with leading zeros */ \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
while (tmp<end) { \
|
||||||
|
if (!(*tmp>='0' && *tmp<='9')) { \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
tmp++; \
|
||||||
|
} \
|
||||||
|
if (tmp==end && *tmp=='\0') { /* a numeric index */ \
|
||||||
|
idx = strtol(key, NULL, 10); \
|
||||||
|
if (idx!=LONG_MAX) { \
|
||||||
|
return func; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while (0); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int zend_symtable_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest) \
|
static inline int zend_symtable_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest) \
|
||||||
{
|
{
|
||||||
long idx;
|
HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_update(ht, idx, pData, nDataSize, pDest));
|
||||||
|
|
||||||
if (zend_is_numeric_key(arKey, nKeyLength, &idx)) {
|
|
||||||
return zend_hash_index_update(ht, idx, pData, nDataSize, pDest);
|
|
||||||
} else {
|
|
||||||
return zend_hash_update(ht, arKey, nKeyLength, pData, nDataSize, pDest);
|
return zend_hash_update(ht, arKey, nKeyLength, pData, nDataSize, pDest);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int zend_symtable_del(HashTable *ht, char *arKey, uint nKeyLength)
|
static inline int zend_symtable_del(HashTable *ht, char *arKey, uint nKeyLength)
|
||||||
{
|
{
|
||||||
long idx;
|
HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx))
|
||||||
|
|
||||||
if (zend_is_numeric_key(arKey, nKeyLength, &idx)) {
|
|
||||||
return zend_hash_index_del(ht, idx);
|
|
||||||
} else {
|
|
||||||
return zend_hash_del(ht, arKey, nKeyLength);
|
return zend_hash_del(ht, arKey, nKeyLength);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int zend_symtable_find(HashTable *ht, char *arKey, uint nKeyLength, void **pData)
|
static inline int zend_symtable_find(HashTable *ht, char *arKey, uint nKeyLength, void **pData)
|
||||||
{
|
{
|
||||||
long idx;
|
HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_find(ht, idx, pData));
|
||||||
|
|
||||||
if (zend_is_numeric_key(arKey, nKeyLength, &idx)) {
|
|
||||||
return zend_hash_index_find(ht, idx, pData);
|
|
||||||
} else {
|
|
||||||
return zend_hash_find(ht, arKey, nKeyLength, pData);
|
return zend_hash_find(ht, arKey, nKeyLength, pData);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int zend_symtable_exists(HashTable *ht, char *arKey, uint nKeyLength)
|
static inline int zend_symtable_exists(HashTable *ht, char *arKey, uint nKeyLength)
|
||||||
{
|
{
|
||||||
long idx;
|
HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_exists(ht, idx));
|
||||||
|
|
||||||
if (zend_is_numeric_key(arKey, nKeyLength, &idx)) {
|
|
||||||
return zend_hash_index_exists(ht, idx);
|
|
||||||
} else {
|
|
||||||
return zend_hash_exists(ht, arKey, nKeyLength);
|
return zend_hash_exists(ht, arKey, nKeyLength);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* ZEND_HASH_H */
|
#endif /* ZEND_HASH_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue