gnumeric r16671 - trunk/plugins/fn-date



Author: mortenw
Date: Wed Jun 25 20:39:53 2008
New Revision: 16671
URL: http://svn.gnome.org/viewvc/gnumeric?rev=16671&view=rev

Log:
	(gnumeric_date): Work around glib issues.



Modified:
   trunk/plugins/fn-date/ChangeLog
   trunk/plugins/fn-date/functions.c

Modified: trunk/plugins/fn-date/functions.c
==============================================================================
--- trunk/plugins/fn-date/functions.c	(original)
+++ trunk/plugins/fn-date/functions.c	Wed Jun 25 20:39:53 2008
@@ -126,6 +126,7 @@
 	gnm_float day   = value_get_as_float (argv [2]);
 	GDate date;
 	GODateConventions const *conv = DATE_CONV (ei->pos);
+	int y, m, d;
 
 	if (year < 0 || year >= 10000)
 		goto error;
@@ -144,21 +145,28 @@
 
         g_date_clear (&date, 1);
 
-	g_date_set_dmy (&date, 1, 1, (int)year);
+	y = (int)year;
+	g_date_set_dmy (&date, 1, 1, y);
 	if (!g_date_valid (&date))
 		goto error;
 
-	if ((int)month > 0)
-		g_date_add_months (&date, (int)month - 1);
-	else
-		g_date_subtract_months (&date, 1 - (int)month);
+	m = (int)month;
+	if (y + m / 12 < gnm_date_convention_base (conv))
+		goto error;
+	else if (m > 0)
+		g_date_add_months (&date, m - 1);
+	else if (m < 0)
+		g_date_subtract_months (&date, 1 - m);
 	if (!g_date_valid (&date))
 		goto error;
 
-	if ((int)day > 0)
-                g_date_add_days (&date, (int)day - 1);
-	else
-		g_date_subtract_days (&date, 1 - (int)day);
+	d = (int)day;
+	if (d < 0 && g_date_get_julian (&date) < (unsigned)-d)
+		goto error;
+	else if (d > 0)
+                g_date_add_days (&date, d - 1);
+	else if (d < 0)
+		g_date_subtract_days (&date, 1 - d);
 	if (!g_date_valid (&date))
 		goto error;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]