MINOR: config: add predicates "version_atleast" and "version_before" to cond blocks

These predicates respectively verify that the current version is at least
a given version or is before a specific one. The syntax is exactly the one
reported by "haproxy -v", though each component is optional, so both "1.5"
and "2.4-dev18-88910-48" are supported. Missing components equal zero, and
"dev" is below "pre" or "rc", which are both inferior to no such mention
(i.e. they are negative). Thus "2.4-dev18" is older than "2.4-rc1" which
is older than "2.4".
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 15e4ad8..dead21d 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -140,6 +140,8 @@
 	CFG_PRED_FEATURE,         // "feature"
 	CFG_PRED_STREQ,           // "streq"
 	CFG_PRED_STRNEQ,          // "strneq"
+	CFG_PRED_VERSION_ATLEAST, // "version_atleast"
+	CFG_PRED_VERSION_BEFORE,  // "version_before"
 };
 
 struct cond_pred_kw {
@@ -154,6 +156,8 @@
 	{ "feature",          CFG_PRED_FEATURE,         ARG1(1, STR)         },
 	{ "streq",            CFG_PRED_STREQ,           ARG2(2, STR, STR)    },
 	{ "strneq",           CFG_PRED_STRNEQ,          ARG2(2, STR, STR)    },
+	{ "version_atleast",  CFG_PRED_VERSION_ATLEAST, ARG1(1, STR)         },
+	{ "version_before",   CFG_PRED_VERSION_BEFORE,  ARG1(1, STR)         },
 	{ NULL, CFG_PRED_NONE, 0 }
 };
 
@@ -1753,6 +1757,14 @@
 			ret = strcmp(argp[0].data.str.area, argp[1].data.str.area) != 0;
 			goto done;
 
+		case CFG_PRED_VERSION_ATLEAST: // checks if the current version is at least this one
+			ret = compare_current_version(argp[0].data.str.area) <= 0;
+			goto done;
+
+		case CFG_PRED_VERSION_BEFORE:  // checks if the current version is older than this one
+			ret = compare_current_version(argp[0].data.str.area) > 0;
+			goto done;
+
 		default:
 			memprintf(err, "internal error: unhandled conditional expression predicate '%s'", cond_pred->word);
 			if (errptr)