static void do_range_limit_days_relative(timelib_sll *base_y, timelib_sll *base_m, timelib_sll *y, timelib_sll *m, timelib_sll *d, timelib_sll invert) { timelib_sll leapyear; timelib_sll month, year; timelib_sll days; do_range_limit(1, 13, 12, base_m, base_y); year = *base_y; month = *base_m; /* printf( "S: Y%d M%d %d %d %d %d\n", year, month, *y, *m, *d, days); */ if (!invert) { while (*d < 0) { dec_month(&year, &month); leapyear = timelib_is_leap(year); days = leapyear ? days_in_month_leap[month] : days_in_month[month]; /* printf( "I Y%d M%d %d %d %d %d\n", year, month, *y, *m, *d, days); */ *d += days; (*m)--; } } else { while (*d < 0) { leapyear = timelib_is_leap(year); days = leapyear ? days_in_month_leap[month] : days_in_month[month]; /* printf( "I Y%d M%d %d %d %d %d\n", year, month, *y, *m, *d, days); */ *d += days; (*m)--; inc_month(&year, &month); } } /* printf( "E: Y%d M%d %d %d %d %d\n", year, month, *y, *m, *d, days); */ }
static void dec_quarter(struct tm *tm) { dec_month(tm); dec_month(tm); dec_month(tm); }
static inline void dec_settime_month(struct UI *me) { dec_month(&me->settime); }
static void trunc_quarter(struct tm *tm) { trunc_month(tm); while (tm->tm_mon % 3 != 0) dec_month(tm); }