Variant HHVM_FUNCTION(version_compare, const String& version1, const String& version2, const String& sop /*="" */) { const char *op = sop.data(); int op_len = sop.size(); int compare = php_version_compare(version1.data(), version2.data()); if (sop.empty()) { return compare; } if (!strncmp(op, "<", op_len) || !strncmp(op, "lt", op_len)) { return compare == -1; } if (!strncmp(op, "<=", op_len) || !strncmp(op, "le", op_len)) { return compare != 1; } if (!strncmp(op, ">", op_len) || !strncmp(op, "gt", op_len)) { return compare == 1; } if (!strncmp(op, ">=", op_len) || !strncmp(op, "ge", op_len)) { return compare != -1; } if (!strncmp(op, "==", op_len) || !strncmp(op, "=", op_len) || !strncmp(op, "eq", op_len)) { return compare == 0; } if (!strncmp(op, "!=", op_len) || !strncmp(op, "<>", op_len) || !strncmp(op, "ne", op_len)) { return compare != 0; } return uninit_null(); }
Variant f_version_compare(CStrRef version1, CStrRef version2, CStrRef sop /* = null_string */) { const char *op = sop.data(); int op_len = sop.size(); int compare = php_version_compare(version1.data(), version2.data()); if (sop.empty()) { return compare; } if (!strncmp(op, "<", op_len) || !strncmp(op, "lt", op_len)) { return compare == -1; } if (!strncmp(op, "<=", op_len) || !strncmp(op, "le", op_len)) { return compare != 1; } if (!strncmp(op, ">", op_len) || !strncmp(op, "gt", op_len)) { return compare == 1; } if (!strncmp(op, ">=", op_len) || !strncmp(op, "ge", op_len)) { return compare != -1; } if (!strncmp(op, "==", op_len) || !strncmp(op, "=", op_len) || !strncmp(op, "eq", op_len)) { return compare == 0; } if (!strncmp(op, "!=", op_len) || !strncmp(op, "<>", op_len) || !strncmp(op, "ne", op_len)) { return compare != 0; } return uninit_null(); }
/** * Checks if GD is enabled * * @return boolean */ PHP_METHOD(Phalcon_Image_Adapter_GD, check){ zval gd_version = {}, ret = {}, gd_info = {}, version = {}, exception_message = {}, pattern = {}, matches = {}; if (phalcon_function_exists_ex(SL("gd_info")) == FAILURE) { PHALCON_THROW_EXCEPTION_STRW(phalcon_image_exception_ce, "GD is either not installed or not enabled, check your configuration"); return; } if (!phalcon_get_constant(&gd_version, SL("GD_VERSION"))) { PHALCON_CALL_FUNCTIONW(&gd_info, "gd_info"); if (phalcon_array_isset_fetch_str(&gd_version, &gd_info, SL("GD Version"))) { ZVAL_STRING(&pattern, "#\\d+\\.\\d+(?:\\.\\d+)?#"); ZVAL_NULL(&matches); ZVAL_MAKE_REF(&matches); RETURN_ON_FAILURE(phalcon_preg_match(&ret, &pattern, &gd_version, &matches)); ZVAL_UNREF(&matches); if (zend_is_true(&ret)) { if (!phalcon_array_isset_fetch_long(&version, &matches, 0)) { ZVAL_EMPTY_STRING(&version); } } else { ZVAL_EMPTY_STRING(&version); } } else { PHALCON_CPY_WRT_CTOR(&version, &gd_version); } } if (-1 == php_version_compare(Z_STRVAL_P(&gd_version), "2.0.1")) { PHALCON_CONCAT_SV(&exception_message, "Phalcon\\Image\\Adapter\\GD requires GD version '2.0.1' or greater, you have '", &gd_version); PHALCON_THROW_EXCEPTION_ZVALW(phalcon_image_exception_ce, &exception_message); return; } phalcon_update_static_property_ce(phalcon_image_adapter_gd_ce, SL("_checked"), &PHALCON_GLOBAL(z_true)); RETURN_TRUE; }
static int php_version_compare(const char *orig_ver1, const char *orig_ver2) { char *ver1; char *ver2; char *p1, *p2, *n1, *n2; long l1, l2; int compare = 0; if (!*orig_ver1 || !*orig_ver2) { if (!*orig_ver1 && !*orig_ver2) { return 0; } else { return *orig_ver1 ? 1 : -1; } } if (orig_ver1[0] == '#') { ver1 = strdup(orig_ver1); } else { ver1 = php_canonicalize_version(orig_ver1); } if (orig_ver2[0] == '#') { ver2 = strdup(orig_ver2); } else { ver2 = php_canonicalize_version(orig_ver2); } p1 = n1 = ver1; p2 = n2 = ver2; while (*p1 && *p2 && n1 && n2) { if ((n1 = strchr(p1, '.')) != NULL) { *n1 = '\0'; } if ((n2 = strchr(p2, '.')) != NULL) { *n2 = '\0'; } if (isdigit(*p1) && isdigit(*p2)) { /* compare element numerically */ l1 = strtol(p1, NULL, 10); l2 = strtol(p2, NULL, 10); compare = sign(l1 - l2); } else if (!isdigit(*p1) && !isdigit(*p2)) { /* compare element names */ compare = compare_special_version_forms(p1, p2); } else { /* mix of names and numbers */ if (isdigit(*p1)) { compare = compare_special_version_forms("#N#", p2); } else { compare = compare_special_version_forms(p1, "#N#"); } } if (compare != 0) { break; } if (n1 != NULL) { p1 = n1 + 1; } if (n2 != NULL) { p2 = n2 + 1; } } if (compare == 0) { if (n1 != NULL) { if (isdigit(*p1)) { compare = 1; } else { compare = php_version_compare(p1, "#N#"); } } else if (n2 != NULL) { if (isdigit(*p2)) { compare = -1; } else { compare = php_version_compare("#N#", p2); } } } free(ver1); free(ver2); return compare; }