summaryrefslogtreecommitdiff
blob: 97bb590ba54b1dd7d95aa83a21a9550cfa93b64c (plain)
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;