static void normalize_struct_tm (struct tm* time) { gint year = time->tm_year + 1900; gint last_day; /* Gregorian_date throws if it gets an out-of-range year * so clamp year into gregorian_date's range. */ if (year < 1400) year += 1400; if (year > 9999) year %= 10000; normalize_time_component (&(time->tm_sec), &(time->tm_min), 60, 0); normalize_time_component (&(time->tm_min), &(time->tm_hour), 60, 0); normalize_time_component (&(time->tm_hour), &(time->tm_mday), 24, 0); normalize_month (&(time->tm_mon), &year); // auto month_in_range = []int (int m){ return (m + 12) % 12; } while (time->tm_mday < 1) { normalize_month (&(--time->tm_mon), &year); last_day = gnc_date_get_last_mday (time->tm_mon, year); time->tm_mday += last_day; } last_day = gnc_date_get_last_mday (time->tm_mon, year); while (time->tm_mday > last_day) { time->tm_mday -= last_day; normalize_month(&(++time->tm_mon), &year); last_day = gnc_date_get_last_mday (time->tm_mon, year); } time->tm_year = year - 1900; }
static void normalize_month(int *month, int *year) { ++(*month); normalize_time_component(month, year, 12, 1); --(*month); }
static void normalize_struct_tm (struct tm* time) { gint year = time->tm_year + 1900; gint last_day; time64 secs; ++time->tm_mon; normalize_time_component (&(time->tm_sec), &(time->tm_min), 60, 0); normalize_time_component (&(time->tm_min), &(time->tm_hour), 60, 0); normalize_time_component (&(time->tm_hour), &(time->tm_mday), 24, 0); normalize_time_component (&(time->tm_mon), &year, 12, 1); while (time->tm_mday < 1) { last_day = gnc_date_get_last_mday (normalize_month (--time->tm_mon), year); time->tm_mday += last_day; normalize_time_component (&(time->tm_mon), &year, 12, 1); } last_day = gnc_date_get_last_mday (normalize_month (time->tm_mon), year); while (time->tm_mday > last_day) { ++time->tm_mon; time->tm_mday -= last_day; normalize_time_component (&(time->tm_mon), &year, 12, 1); last_day = gnc_date_get_last_mday (normalize_month (time->tm_mon), year); } time->tm_year = year - 1900; }