1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
#include <assert.h> // assert()
#include <stdio.h> // sscanf
#include <string_lib.h> // StringEqual()
#include <version_comparison.h>
VersionComparison CompareVersion(const char *a, const char *b)
{
int a_major = 0;
int a_minor = 0;
int a_patch = 0;
const int a_num = sscanf(a, "%d.%d.%d", &a_major, &a_minor, &a_patch);
if (a_num < 1 || a_num > 3)
{
return VERSION_ERROR;
}
int b_major = 0;
int b_minor = 0;
int b_patch = 0;
const int b_num = sscanf(b, "%d.%d.%d", &b_major, &b_minor, &b_patch);
if (b_num < 1 || b_num > 3)
{
return VERSION_ERROR;
}
if (a_major > b_major)
{
return VERSION_GREATER;
}
if (a_major < b_major)
{
return VERSION_SMALLER;
}
assert(a_major == b_major);
if (a_num == 1 || b_num == 1)
{
return VERSION_EQUAL;
}
assert(a_num >= 2 && b_num >= 2);
if (a_minor < b_minor)
{
return VERSION_SMALLER;
}
if (a_minor > b_minor)
{
return VERSION_GREATER;
}
assert(a_minor == b_minor);
if (a_num == 2 || b_num == 2)
{
return VERSION_EQUAL;
}
assert(a_num == 3 && b_num == 3);
if (a_patch < b_patch)
{
return VERSION_SMALLER;
}
if (a_patch > b_patch)
{
return VERSION_GREATER;
}
assert(a_patch == b_patch);
return VERSION_EQUAL;
}
BooleanOrError CompareVersionExpression(
const char *const a, const char *const operator, const char * const b)
{
const VersionComparison r = CompareVersion(a, b);
if (r == VERSION_ERROR)
{
return BOOLEAN_ERROR;
}
if (StringEqual(operator, "=") || StringEqual(operator, "=="))
{
return (BooleanOrError) (r == VERSION_EQUAL);
}
if (StringEqual(operator, ">"))
{
return (BooleanOrError) (r == VERSION_GREATER);
}
if (StringEqual(operator, "<"))
{
return (BooleanOrError) (r == VERSION_SMALLER);
}
if (StringEqual(operator, ">="))
{
return (BooleanOrError) (r == VERSION_GREATER || r == VERSION_EQUAL);
}
if (StringEqual(operator, "<="))
{
return (BooleanOrError) (r == VERSION_SMALLER || r == VERSION_EQUAL);
}
if (StringEqual(operator, "!="))
{
return (BooleanOrError) (r != VERSION_EQUAL);
}
return BOOLEAN_ERROR;
}
|