summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r--Zend/zend_hash.c32
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;