]> granicus.if.org Git - php/commitdiff
Go back to ZE1-like code
authorZeev Suraski <zeev@php.net>
Wed, 23 Jul 2003 08:56:34 +0000 (08:56 +0000)
committerZeev Suraski <zeev@php.net>
Wed, 23 Jul 2003 08:56:34 +0000 (08:56 +0000)
Zend/zend_hash.c
Zend/zend_hash.h

index 1ba0b4b3ec8fc2cdca4a52b5af39e76478976da6..ac53af332a1d0728ae1e0e24d8233afe7ff1601c 100644 (file)
@@ -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)
 {
index 48dede3dcd6e798fc140860ec6ce6c1686ea0086..4ab5e30c42ad8eeb2ee46c89d019f21be1a218fe 100644 (file)
@@ -89,8 +89,6 @@ typedef Bucket* HashPosition;
 
 BEGIN_EXTERN_C()
 
-ZEND_API zend_bool zend_is_numeric_key(char *arKey, uint nKeyLength, long *val);
-
 /* 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_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)
 
 
+#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)                                 \
 {
-       long idx;
-
-       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);
-       }
+       HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_update(ht, idx, 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)
 {
-       long idx;
-
-       if (zend_is_numeric_key(arKey, nKeyLength, &idx)) {
-               return zend_hash_index_del(ht, idx);
-       } else {
-               return zend_hash_del(ht, arKey, nKeyLength);
-       }
+       HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx))
+       return zend_hash_del(ht, arKey, nKeyLength);
 }
 
 
 static inline int zend_symtable_find(HashTable *ht, char *arKey, uint nKeyLength, void **pData)
 {
-       long idx;
-
-       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);
-       }
+       HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_find(ht, idx, pData));
+       return zend_hash_find(ht, arKey, nKeyLength, pData);
 }
 
 
 static inline int zend_symtable_exists(HashTable *ht, char *arKey, uint nKeyLength)
 {
-       long idx;
-
-       if (zend_is_numeric_key(arKey, nKeyLength, &idx)) {
-               return zend_hash_index_exists(ht, idx);
-       } else {
-               return zend_hash_exists(ht, arKey, nKeyLength);
-       }
+       HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_exists(ht, idx));
+       return zend_hash_exists(ht, arKey, nKeyLength);
 }
 
 #endif                                                 /* ZEND_HASH_H */