#define ZEND_HANDLE_NUMERIC(key, length, func) do { \ register const char *tmp = key; \ \ if (*tmp == '-') { \ tmp++; \ } \ if (*tmp >= '0' && *tmp <= '9') { /* possibly a numeric index */ \ const char *end = key + length - 1; \ long idx; \ \ if (*end != '\0') { /* not a null terminated string */ \ break; \ } else if (*tmp == '0' && length > 2) { \ /* don't accept numbers with leading zeros */ \ break; \ } else if (end - tmp > MAX_LENGTH_OF_LONG - 1) { \ /* don't accept numbers too long */ \ break; \ } else { \ idx = (*tmp - '0'); \ while (++tmp < end && *tmp >= '0' && *tmp <= '9' && \ (idx < LONG_MAX / 10 || \ (idx == LONG_MAX / 10 && *tmp <= (*key == '-' ? '8' : '7')))) { \ idx = (idx * 10) + (*tmp - '0'); \ } \ if (tmp == end) { \ if (*key == '-') { \ idx = -idx; \ } \ return func; \ } \ } \ } \ } while (0) #define ZEND_HANDLE_U_NUMERIC(key, length, func) do { \ register const UChar *tmp = key; \ \ if (*tmp == 0x2D /*'-'*/) { \ tmp++; \ } \ if (*tmp >= 0x30 /*'0'*/ && *tmp <= 0x39 /*'9'*/) { /* possibly a numeric index */ \ const UChar *end = key + length - 1; \ long idx; \ \ if (*end != 0) { /* not a null terminated string */ \ break; \ } else if (*tmp == 0x30 && length > 2) { \ /* don't accept numbers with leading zeros */ \ break; \ } else if (end - tmp > MAX_LENGTH_OF_LONG - 1) { \ /* don't accept numbers too long */ \ break; \ } else { \ idx = (*tmp - 0x30); \ while (++tmp < end && *tmp >= 0x30 && *tmp <= 0x39 && \ (idx < LONG_MAX / 10 || \ (idx == LONG_MAX / 10 && *tmp <= (*key == 0x2D ? 0x38 : 0x37)))) { \ idx = (idx * 10) + (*tmp - 0x30); \ } \ if (tmp == end) { \ if (*key == 0x2D) { \ idx = -idx; \ } \ return func; \ } \ } \ } \ } while (0)