compare: support textual operators, and port analyze over to it
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "analyze-compare-versions.h"
|
||||
#include "compare-operator.h"
|
||||
#include "macro.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
@@ -26,22 +27,16 @@ int verb_compare_versions(int argc, char *argv[], void *userdata) {
|
||||
|
||||
} else {
|
||||
const char *op = ASSERT_PTR(argv[2]);
|
||||
CompareOperator operator;
|
||||
|
||||
r = strverscmp_improved(ASSERT_PTR(argv[1]), ASSERT_PTR(argv[3]));
|
||||
operator = parse_compare_operator(&op, COMPARE_ALLOW_TEXTUAL);
|
||||
if (operator < 0 || !isempty(op))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown operator \"%s\".", op);
|
||||
|
||||
if (STR_IN_SET(op, "lt", "<"))
|
||||
return r < 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
if (STR_IN_SET(op, "le", "<="))
|
||||
return r <= 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
if (STR_IN_SET(op, "eq", "=="))
|
||||
return r == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
if (STR_IN_SET(op, "ne", "!="))
|
||||
return r != 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
if (STR_IN_SET(op, "ge", ">="))
|
||||
return r >= 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
if (STR_IN_SET(op, "gt", ">"))
|
||||
return r > 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Unknown operator \"%s\".", op);
|
||||
r = version_or_fnmatch_compare(operator, ASSERT_PTR(argv[1]), ASSERT_PTR(argv[3]));
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to compare versions: %m");
|
||||
|
||||
return r ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,13 @@ CompareOperator parse_compare_operator(const char **s, CompareOperatorParseFlags
|
||||
{ COMPARE_EQUAL, "=" },
|
||||
{ COMPARE_STRING_UNEQUAL, "!=", .need_mask = COMPARE_EQUAL_BY_STRING },
|
||||
{ COMPARE_UNEQUAL, "!=" },
|
||||
|
||||
{ COMPARE_LOWER, "lt", .valid_mask = COMPARE_ALLOW_TEXTUAL },
|
||||
{ COMPARE_LOWER_OR_EQUAL, "le", .valid_mask = COMPARE_ALLOW_TEXTUAL },
|
||||
{ COMPARE_EQUAL, "eq", .valid_mask = COMPARE_ALLOW_TEXTUAL },
|
||||
{ COMPARE_UNEQUAL, "ne", .valid_mask = COMPARE_ALLOW_TEXTUAL },
|
||||
{ COMPARE_GREATER_OR_EQUAL, "ge", .valid_mask = COMPARE_ALLOW_TEXTUAL },
|
||||
{ COMPARE_GREATER, "gt", .valid_mask = COMPARE_ALLOW_TEXTUAL },
|
||||
};
|
||||
|
||||
assert(s);
|
||||
|
||||
@@ -49,6 +49,7 @@ static inline bool COMPARE_OPERATOR_IS_ORDER(CompareOperator c) {
|
||||
typedef enum CompareOperatorParseFlags {
|
||||
COMPARE_ALLOW_FNMATCH = 1 << 0,
|
||||
COMPARE_EQUAL_BY_STRING = 1 << 1,
|
||||
COMPARE_ALLOW_TEXTUAL = 1 << 2,
|
||||
} CompareOperatorParseFlags;
|
||||
|
||||
CompareOperator parse_compare_operator(const char **s, CompareOperatorParseFlags flags);
|
||||
|
||||
Reference in New Issue
Block a user