int CoarseLaterThan(const char *bigger, const char *smaller) { char month_small[CF_SMALLBUF]; char month_big[CF_SMALLBUF]; int m_small, day_small, year_small, m_big, year_big, day_big; sscanf(smaller, "%d %s %d", &day_small, month_small, &year_small); sscanf(bigger, "%d %s %d", &day_big, month_big, &year_big); if (year_big < year_small) { return false; } m_small = Month2Int(month_small); m_big = Month2Int(month_big); if (m_big < m_small) { return false; } if (day_big < day_small && m_big == m_small && year_big == year_small) { return false; } return true; }
long TimeAbs2Int(char *s) { time_t cftime; int i; char mon[4], h[3], m[3]; long month = 0, day = 0, hour = 0, min = 0, year = 0; static long days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (s == NULL) { return CF_NOINT; } year = Str2Int(VYEAR); if (year % 4 == 0) /* leap years */ { days[1] = 29; } if (strstr(s, ":")) /* Hr:Min */ { sscanf(s, "%2[^:]:%2[^:]:", h, m); month = Month2Int(VMONTH); day = Str2Int(VDAY); hour = Str2Int(h); min = Str2Int(m); } else /* date Month */ { sscanf(s, "%3[a-zA-Z] %ld", mon, &day); month = Month2Int(mon); if (Month2Int(VMONTH) < month) { /* Wrapped around */ year--; } } CfDebug("(%s)\n%ld=%s,%ld=%s,%ld,%ld,%ld\n", s, year, VYEAR, month, VMONTH, day, hour, min); cftime = 0; cftime += min * 60; cftime += hour * 3600; cftime += (day - 1) * 24 * 3600; cftime += 24 * 3600 * ((year - 1970) / 4); /* Leap years */ for (i = 0; i < month - 1; i++) { cftime += days[i] * 24 * 3600; } cftime += (year - 1970) * 365 * 24 * 3600; CfDebug("Time %s CORRESPONDS %s\n", s, cf_ctime(&cftime)); return (long) cftime; }
long TimeAbs2Int(const char *s) { time_t cftime; char mon[4], h[3], m[3]; long month = 0, day = 0, hour = 0, min = 0, year = 0; struct tm tm; if (s == NULL) { return CF_NOINT; } year = IntFromString(VYEAR); if (strstr(s, ":")) /* Hr:Min */ { sscanf(s, "%2[^:]:%2[^:]:", h, m); month = Month2Int(VMONTH); day = IntFromString(VDAY); hour = IntFromString(h); min = IntFromString(m); tm.tm_year = year - 1900; tm.tm_mon = month - 1; tm.tm_mday = day; tm.tm_hour = hour; tm.tm_min = min; tm.tm_sec = 0; tm.tm_isdst = -1; cftime = mktime(&tm); } else /* date Month */ { sscanf(s, "%3[a-zA-Z] %ld", mon, &day); month = Month2Int(mon); if (Month2Int(VMONTH) < month) { /* Wrapped around */ year--; } tm.tm_year = year - 1900; tm.tm_mon = month - 1; tm.tm_mday = day; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; cftime = mktime(&tm); } return (long) cftime; }
long Months2Seconds(int m) { long tot_days = 0; int this_month, i, month, year; if (m == 0) { return 0; } this_month = Month2Int(VMONTH); year = IntFromString(VYEAR); for (i = 0; i < m; i++) { month = (this_month - i) % 12; while (month < 0) { month += 12; year--; } tot_days += GetMonthLength(month, year); } return (long) tot_days *3600 * 24; }
long Months2Seconds(int m) { static long days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; long tot_days = 0; int this_month, i, month, year; if (m == 0) { return 0; } this_month = Month2Int(VMONTH); year = Str2Int(VYEAR); for (i = 0; i < m; i++) { month = (this_month - i) % 12; while (month < 0) { month += 12; year--; } if ((year % 4) && (month == 1)) { tot_days += 29; } else { tot_days += days[month]; } } return (long) tot_days *3600 * 24; }
static time_t TimeAbs2Int(const char *s) { if (s == NULL) { return CF_NOINT; } struct tm tm; localtime_r(&CFSTARTTIME, &tm); tm.tm_sec = 0; tm.tm_isdst = -1; /* Try various ways to parse s: */ char word[4]; /* Abbreviated month name */ long ns[3]; /* Miscellaneous numbers, diverse readings */ int got = sscanf(s, "%2ld:%2ld:%2ld", ns, ns + 1, ns + 2); if (1 < got) /* Hr:Min[:Sec] */ { tm.tm_hour = ns[0]; tm.tm_min = ns[1]; if (got == 3) { tm.tm_sec = ns[2]; } } /* or MMM dd (the %ld shall ignore any leading space) */ else if (sscanf(s, "%3[a-zA-Z]%ld", word, ns) == 2 && /* Only match if word is a valid month text: */ 0 < (ns[1] = Month2Int(word))) { int month = ns[1] - 1; if (tm.tm_mon < month) { /* Wrapped around */ tm.tm_year--; } tm.tm_mon = month; tm.tm_mday = ns[0]; tm.tm_hour = 0; tm.tm_min = 0; } /* or just year, or seconds since 1970 */ else if (sscanf(s, "%ld", ns) == 1) { if (ns[0] > 9999) { /* Seconds since 1970. * * This is the amended value SplitProcLine() replaces * start time with if it's imprecise and a better value * can be calculated from elapsed time. */ return (time_t)ns[0]; } /* else year, at most four digits; either 4-digit CE or * already relative to 1900. */ memset(&tm, 0, sizeof(tm)); tm.tm_year = ns[0] < 999 ? ns[0] : ns[0] - 1900; tm.tm_isdst = -1; } else { return CF_NOINT; } return mktime(&tm); }