#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 (*tmp == '0' && length > 2) { \ /* don't accept numbers with leading zeros */ \ break; \ } else if (end - tmp > MAX_LENGTH_OF_LONG - 1 || (SIZEOF_LONG == 4 && \ end - tmp == MAX_LENGTH_OF_LONG - 1 && *tmp > '2')) { \ /* don't accept numbers too long */ \ break; \ } else { \ idx = (*tmp - '0'); \ while (++tmp < end && *tmp >= '0' && *tmp <= '9') { \ idx = (idx * 10) + (*tmp - '0'); \ } \ if (tmp == end && *end == '\0') { \ if (*key == '-') { \ idx = -idx; \ if (idx > 0) { /* overflow */ \ break; \ } \ } else if (idx < 0) { /* overflow */ \ break; \ } \ 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 (*tmp == 0x30 && length > 2) { \ /* don't accept numbers with leading zeros */ \ break; \ } else if (end - tmp > MAX_LENGTH_OF_LONG - 1 || (SIZEOF_LONG == 4 && \ end - tmp == MAX_LENGTH_OF_LONG - 1 && *tmp > 0x32)) { \ /* don't accept numbers too long */ \ break; \ } else { \ idx = (*tmp - 0x30); \ while (++tmp < end && *tmp >= 0x30 && *tmp <= 0x39) { \ idx = (idx * 10) + (*tmp - 0x30); \ } \ if (tmp == end && *end == 0) { \ if (*key == 0x2D) { \ idx = -idx; \ if (idx > 0) { /* overflow */ \ break; \ } \ } else if (idx < 0) { /* overflow */ \ break; \ } \ return func; \ } \ } \ } \ } while (0)