1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
diff -r c70d0fa6579c lib/crm/common/iso8601.c
--- a/lib/crm/common/iso8601.c Mon Mar 03 14:11:11 2008 +0800
+++ b/lib/crm/common/iso8601.c Fri Feb 29 12:35:56 2008 +0100
@@ -649,13 +649,14 @@ convert_from_ordinal(ha_time_t *a_date)
gboolean ordinal_to_gregorian(ha_time_t *a_date)
{
+ /* Day of the year this month ends on */
+ int m_end = 0;
+
CRM_CHECK(a_date->has->years, return FALSE);
CRM_CHECK(a_date->has->yeardays, return FALSE);
CRM_CHECK(a_date->yeardays > 0, return FALSE);
- a_date->days = a_date->yeardays;
- a_date->months = 11;
if(is_leap_year(a_date->years) && a_date->yeardays > 366) {
crm_err("Year %.4d only has 366 days (supplied %.3d)",
a_date->years, a_date->yeardays);
@@ -667,27 +668,21 @@ gboolean ordinal_to_gregorian(ha_time_t
a_date->yeardays = 365;
}
- while(a_date->months > 0
- && a_date->yeardays <= month2days[a_date->months]) {
- crm_debug_6("month %d: %d vs. %d",
+ a_date->days = a_date->yeardays;
+ a_date->months = 0;
+ do {
+ a_date->months++;
+ m_end += days_per_month(a_date->months, a_date->years);
+ a_date->days -= days_per_month(a_date->months-1, a_date->years);
+
+ crm_debug_6("month %d: %d vs. %d - current day: %d",
a_date->months, a_date->yeardays,
- month2days[a_date->months]);
- (a_date->months)--;
- }
+ m_end, a_date->days);
+ } while (a_date->months < 12 && m_end < a_date->yeardays);
- a_date->days -= month2days[a_date->months];
- (a_date->months)++;
-
CRM_CHECK(a_date->months > 0, return FALSE);
-
- if(is_leap_year(a_date->years) && a_date->months > 2) {
- (a_date->days)--;
- }
- if(a_date->days == 0) {
- /* annoying underflow */
- a_date->days = days_per_month(a_date->months, a_date->years);
- (a_date->months)--;
- }
+ CRM_CHECK(a_date->days <= days_per_month(a_date->months, a_date->years),
+ return FALSE);
a_date->has->days = TRUE;
a_date->has->months = TRUE;
|