diff options
author | Zeev Suraski <zeev@php.net> | 2003-07-22 16:06:07 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 2003-07-22 16:06:07 +0000 |
commit | cf90932a05b03354fdf6b844ff3a6902fc51a928 (patch) | |
tree | 4979bfe564435a2f5ac19e4c839ea58e8d11beed /Zend/zend_hash.c | |
parent | 5fcff2d872dfc59328e8855b5bc754a1efe48005 (diff) | |
download | php-git-cf90932a05b03354fdf6b844ff3a6902fc51a928.tar.gz |
Improve infrastructure of numeric handling of elements in symbol tables.
When you want to work with a symbol table, and you don't know whether you
have a numeric ("string that looks like a number") or a string element in
your hands, use zend_symtable_*() functions, in place of zend_hash_*()
functions.
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r-- | Zend/zend_hash.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 08ca21ad31..1ba0b4b3ec 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -130,6 +130,38 @@ 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) { uint i = 3; |