Skip to main content
Code Review

Return to Answer

Commonmark migration
Source Link

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:

Better tests
Source Link
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;
}
Source Link

#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;
}
lang-c

AltStyle によって変換されたページ (->オリジナル) /