Return status
#Return status YouYou create this:
Bug/Not what you mean
#Bug/Not what you mean DoingDoing a
Shorter version
#Shorter version I'mI'm not sure this is cleaner, but here I go:
#Return status You create this:
#Bug/Not what you mean Doing a
#Shorter version I'm not sure this is cleaner, but here I go:
Return status
You create this:
Bug/Not what you mean
Doing a
Shorter version
I'm not sure this is cleaner, but here I go:
int main(void)
{
struct version ref = { 1, 2, 21, 8 };
struct version lower1 = { 0, 2, 21, 8 };
struct version lower2 = { 1, 1, 21, 8 };
struct version lower3 = { 1, 2, 20, 8 };
struct version lower4 = { 1, 2, 21, 7 };
struct version equal = { 1, 2, 21, 8 };
struct version higher1 = { 2, 2, 21, 8 };
struct version higher2 = { 1, 3, 21, 8 };
struct version higher3 = { 1, 2, 22, 8 };
struct version higher4 = { 1, 2, 21, 9 };
#define TEST(a,b,expectexpect1,expect2)\
do {\
bool result;\result1, result2;\
is_less_than((a), (b), &result&result1);\
is_less_than((b), (a), &result2);\
puts(result==result1==(expectexpect1) && result2==(expect2)?"ok":"failed");\
} while(0)
#define TESTL(a,b) TEST(a,b,true,false)
#define TESTE(a,b) TEST(&lower1a,b,false,false)
#define &refTESTH(a,b) TEST(a,b,false,true);
TESTTESTL(&lower2&lower1, &ref);
TESTL(&lower2, true&ref);
TESTTESTL(&lower3, &ref, true);
TESTTESTL(&lower4, &ref, true);
TESTTESTE(&equal, &ref, false);
TESTTESTH(&higher1, &ref, false);
TESTTESTH(&higher2, &ref, false);
TESTTESTH(&higher3, &ref, false);
TESTTESTH(&higher4, &ref, false);
return 0;
}
int main(void)
{
struct version ref = { 1, 2, 21, 8 };
struct version lower1 = { 0, 2, 21, 8 };
struct version lower2 = { 1, 1, 21, 8 };
struct version lower3 = { 1, 2, 20, 8 };
struct version lower4 = { 1, 2, 21, 7 };
struct version equal = { 1, 2, 21, 8 };
struct version higher1 = { 2, 2, 21, 8 };
struct version higher2 = { 1, 3, 21, 8 };
struct version higher3 = { 1, 2, 22, 8 };
struct version higher4 = { 1, 2, 21, 9 };
#define TEST(a,b,expect)\
do {\
bool result;\
is_less_than((a), (b), &result);\
puts(result==(expect)?"ok":"failed");\
} while(0)
TEST(&lower1, &ref, true);
TEST(&lower2, &ref, true);
TEST(&lower3, &ref, true);
TEST(&lower4, &ref, true);
TEST(&equal, &ref, false);
TEST(&higher1, &ref, false);
TEST(&higher2, &ref, false);
TEST(&higher3, &ref, false);
TEST(&higher4, &ref, false);
return 0;
}
int main(void)
{
struct version ref = { 1, 2, 21, 8 };
struct version lower1 = { 0, 2, 21, 8 };
struct version lower2 = { 1, 1, 21, 8 };
struct version lower3 = { 1, 2, 20, 8 };
struct version lower4 = { 1, 2, 21, 7 };
struct version equal = { 1, 2, 21, 8 };
struct version higher1 = { 2, 2, 21, 8 };
struct version higher2 = { 1, 3, 21, 8 };
struct version higher3 = { 1, 2, 22, 8 };
struct version higher4 = { 1, 2, 21, 9 };
#define TEST(a,b,expect1,expect2)\
do {\
bool result1, result2;\
is_less_than((a), (b), &result1);\
is_less_than((b), (a), &result2);\
puts(result1==(expect1) && result2==(expect2)?"ok":"failed");\
} while(0)
#define TESTL(a,b) TEST(a,b,true,false)
#define TESTE(a,b) TEST(a,b,false,false)
#define TESTH(a,b) TEST(a,b,false,true)
TESTL(&lower1, &ref);
TESTL(&lower2, &ref);
TESTL(&lower3, &ref);
TESTL(&lower4, &ref);
TESTE(&equal, &ref);
TESTH(&higher1, &ref);
TESTH(&higher2, &ref);
TESTH(&higher3, &ref);
TESTH(&higher4, &ref);
return 0;
}
#Return status You create this:
typedef int STATUS;
#define ERROR -1
#define OKAY 0
which is basically a boolean status. Personally, I'd return a straight bool
.
#Bug/Not what you mean Doing a
result = NULL;
is changing the local variable (parameter) result
. It's not setting the result to NULL. In fact the caller won't probably have a pointer at all, but just a bool
, which cannot properly be NULL.
#Shorter version I'm not sure this is cleaner, but here I go:
bool is_less_than(struct version * original, struct version *compared, bool *result)
{
if(original == NULL || compared == NULL || result == NULL)
return false;
*result = original->major < compared->major || original->major == compared->major && (
original->minor < compared->minor || original->minor == compared->minor && (
original->build < compared->build || original->build == compared->build && (
original->patch < compared->patch)));
return true;
}
Next time, add a driver/test suite to your question, to ease the life of people answering. This can be one:
int main(void)
{
struct version ref = { 1, 2, 21, 8 };
struct version lower1 = { 0, 2, 21, 8 };
struct version lower2 = { 1, 1, 21, 8 };
struct version lower3 = { 1, 2, 20, 8 };
struct version lower4 = { 1, 2, 21, 7 };
struct version equal = { 1, 2, 21, 8 };
struct version higher1 = { 2, 2, 21, 8 };
struct version higher2 = { 1, 3, 21, 8 };
struct version higher3 = { 1, 2, 22, 8 };
struct version higher4 = { 1, 2, 21, 9 };
#define TEST(a,b,expect)\
do {\
bool result;\
is_less_than((a), (b), &result);\
puts(result==(expect)?"ok":"failed");\
} while(0)
TEST(&lower1, &ref, true);
TEST(&lower2, &ref, true);
TEST(&lower3, &ref, true);
TEST(&lower4, &ref, true);
TEST(&equal, &ref, false);
TEST(&higher1, &ref, false);
TEST(&higher2, &ref, false);
TEST(&higher3, &ref, false);
TEST(&higher4, &ref, false);
return 0;
}