#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <libversion/config.h>
#include <libversion/version.h>
static void print_version(void) {
fprintf(stderr, "libversion %s\n", LIBVERSION_VERSION);
}
static void print_usage(const char* progname) {
fprintf(stderr, "Usage: %s [-pa] version1 [op] version2\n", progname);
fprintf(stderr, "\n");
fprintf(stderr, " op - if specified (supports <, <=, =, >=, >, lt, le, eq, ge, gt),\n");
fprintf(stderr, " the utility would exit with zero (success) status code if the\n");
fprintf(stderr, " given condition is satisfied. Otherwise, the utility would\n");
fprintf(stderr, " print <, =, or > to indicate how specified versions compare.\n");
fprintf(stderr, "\n");
fprintf(stderr, " -p - 'p' letter is treated as 'patch' instead of 'pre'\n");
fprintf(stderr, " -a - any alphabetic characters are treated as post-release\n");
fprintf(stderr, "\n");
fprintf(stderr, " -h, -? - print usage and exit\n");
fprintf(stderr, " -v - print version and exit\n");
}
static int streq(const char* a, const char* b) {
return strcmp(a, b) == 0;
}
int main(int argc, char** argv) {
int ch, result, flags = 0;
const char* progname = argv[0];
while ((ch = getopt(argc, argv, "pahv")) != -1) {
switch (ch) {
case 'p':
flags |= VERSIONFLAG_P_IS_PATCH;
break;
case 'a':
flags |= VERSIONFLAG_ANY_IS_PATCH;
break;
case 'h':
case '?':
print_usage(progname);
return 0;
case 'v':
print_version();
return 0;
default:
print_usage(progname);
return 1;
}
}
argc -= optind;
argv += optind;
if (argc == 2) {
result = version_compare4(argv[0], argv[1], flags, flags);
if (result < 0)
printf("<\n");
else if (result > 0)
printf(">\n");
else
printf("=\n");
return 0;
} else if (argc == 3) {
result = version_compare4(argv[0], argv[2], flags, flags);
if (streq(argv[1], "<") || streq(argv[1], "lt"))
return !(result < 0);
else if (streq(argv[1], "<=") || streq(argv[1], "=<") || streq(argv[1], "le"))
return !(result <= 0);
else if (streq(argv[1], "=") || streq(argv[1], "=") || streq(argv[1], "eq"))
return !(result == 0);
else if (streq(argv[1], ">=") || streq(argv[1], "=>") || streq(argv[1], "ge"))
return !(result >= 0);
else if (streq(argv[1], ">") || streq(argv[1], "gt"))
return !(result > 0);
}
print_usage(progname);
return 1;
}