aboutsummaryrefslogtreecommitdiffstats
path: root/list-birthdays.c
diff options
context:
space:
mode:
Diffstat (limited to 'list-birthdays.c')
-rw-r--r--list-birthdays.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/list-birthdays.c b/list-birthdays.c
index 5a4d0f6..5047c21 100644
--- a/list-birthdays.c
+++ b/list-birthdays.c
@@ -31,7 +31,7 @@ compare_by_birthday(const void *apv, const void *bpv)
{
struct libcontacts_contact *const *ap = apv, *const *bp = bpv;
const struct libcontacts_contact *a = *ap, *b = *bp;
- int ac, bc;
+ int av, bv, nv;
if (!a->birthday != !b->birthday)
return !a->birthday ? -1 : +1;
if (!a->birthday)
@@ -44,14 +44,16 @@ compare_by_birthday(const void *apv, const void *bpv)
return !a->birthday->day ? -1 : +1;
if (!a->birthday->day)
return 0;
- ac = (12 + (a->birthday->month - 1 - now->tm_mon) % 12) % 12;
- bc = (12 + (b->birthday->month - 1 - now->tm_mon) % 12) % 12;
- if (ac != bc)
- return ac - bc;
- ac = (31 + (a->birthday->day - now->tm_mday) % 31) % 31;
- bc = (31 + (b->birthday->day - now->tm_mday) % 31) % 31;
- if (ac != bc)
- return ac - bc;
+ av = (12 + (a->birthday->month - 1) % 12) % 12 * 31;
+ av += (31 + (a->birthday->day - 1) % 31) % 31;
+ bv = (12 + (b->birthday->month - 1) % 12) % 12 * 31;
+ bv += (31 + (b->birthday->day - 1) % 31) % 31;
+ nv = (12 + (now->tm_mon) % 12) % 12 * 31;
+ nv += (31 + (now->tm_mday - 1) % 31) % 31;
+ av = (12 * 31 + (av - nv) % (12 * 31)) % (12 * 31);
+ bv = (12 * 31 + (bv - nv) % (12 * 31)) % (12 * 31);
+ if (av != bv)
+ return av - bv;
if (a->birthday->before_on_common != b->birthday->before_on_common)
return a->birthday->before_on_common ? -1 : +1;
return 0;