48#define isdig(x) (isdigit(x)&&(x)!='.')
49#define isndig(x) (!isdigit(x)&&(x)!='.')
50#define isspecialver(x) ((x)=='-'||(x)=='_'||(x)=='+')
62 }
else if (!isalnum(*
p)) {
84static int compare_special_version_forms(
char *form1,
char *form2)
86 int found1 = -1, found2 = -1;
102 for (pp = special_forms; pp && pp->
name; pp++) {
108 for (pp = special_forms; pp && pp->
name; pp++) {
125 char *p1, *p2, *n1, *n2;
129 if (!*orig_ver1 || !*orig_ver2) {
130 if (!*orig_ver1 && !*orig_ver2) {
133 return *orig_ver1 ? 1 : -1;
136 if (orig_ver1[0] ==
'#') {
141 if (orig_ver2[0] ==
'#') {
148 while (*p1 && *p2 && n1 && n2) {
155 if (isdigit(*p1) && isdigit(*p2)) {
157 l1 = strtol(p1,
NULL, 10);
158 l2 = strtol(p2,
NULL, 10);
160 }
else if (!isdigit(*p1) && !isdigit(*p2)) {
162 compare = compare_special_version_forms(p1, p2);
166 compare = compare_special_version_forms(
"#N#", p2);
168 compare = compare_special_version_forms(p1,
"#N#");
188 }
else if (n2 !=
NULL) {
208 size_t v1_len, v2_len;
version_compare(string $version1, string $version2, ?string $operator=null)
strchr(string $haystack, string $needle, bool $before_needle=false)
zend_ffi_ctype_name_buf buf
PHPAPI int php_version_compare(const char *orig_ver1, const char *orig_ver2)
PHPAPI char * php_canonicalize_version(const char *version)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
#define ZEND_PARSE_PARAMETERS_END()
#define Z_PARAM_STR_OR_NULL(dest)
#define Z_PARAM_STRING(dest, dest_len)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define safe_emalloc(nmemb, size, offset)
strncmp(string $string1, string $string2, int $length)
struct _zend_string zend_string
#define ZEND_NORMALIZE_BOOL(n)
#define zend_string_equals_literal(str, literal)