diff --git a/ChangeLog b/ChangeLog index a297e83e7..223f5a74d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index a297e83e7..223f5a74d 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index a297e83e7..223f5a74d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index a297e83e7..223f5a74d 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index a297e83e7..223f5a74d 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index a297e83e7..223f5a74d 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index a297e83e7..223f5a74d 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index a297e83e7..223f5a74d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,27 @@ +2001-06-01 Jon Trowbridge <trow@gnu.org> + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com> * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index a92b4add8..79d362c1d 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -895,7 +895,10 @@ g_date_add_months g_date_subtract_months g_date_add_years g_date_subtract_years +g_date_days_between g_date_compare +g_date_clamp +g_date_order <SUBSECTION> g_date_get_day diff --git a/docs/reference/glib/tmpl/date.sgml b/docs/reference/glib/tmpl/date.sgml index 2137a1483..60d0a4d6f 100644 --- a/docs/reference/glib/tmpl/date.sgml +++ b/docs/reference/glib/tmpl/date.sgml @@ -414,6 +414,18 @@ must be valid. @n_years: Number of years to move +<!-- ##### FUNCTION g_date_days_between ##### --> +<para> +Compute the number of days between two dates. +If @date2 is prior to @date1, the returned value is negative. +Both dates must be valid. +</para> + +@date1: The first date +@date2: The second date +@Returns: The number of days between @date1 and @date2 + + <!-- ##### FUNCTION g_date_compare ##### --> <para> <function>qsort()</function>-style comparsion function for dates. Both @@ -426,6 +438,29 @@ dates must be valid. greater than zero if @lhs is greater than @rhs +<!-- ##### FUNCTION g_date_clamp ##### --> +<para> +If @date is prior to @min_date, set @date equal to @min_date. +If @date falls after @max_date, set @date equal to @max_date. +Either @min_date and @max_date may be %NULL. All non-%NULL dates +must be valid. +</para> + +@date: Date to clamp +@min_date: Minimum accepted value for @date +@max_date: Maximum accepted value for @date + + +<!-- ##### FUNCTION g_date_order ##### --> +<para> +Check if @date1 is less than or equal to @date2, +and swap the values if this is not the case. +</para> + +@date1: The first date +@date2: The second date + + <!-- ##### FUNCTION g_date_get_day ##### --> <para> Return the day of the month; the #GDate must be valid. diff --git a/docs/reference/glib/tmpl/main.sgml b/docs/reference/glib/tmpl/main.sgml index 90d81269e..c5e55188e 100644 --- a/docs/reference/glib/tmpl/main.sgml +++ b/docs/reference/glib/tmpl/main.sgml @@ -837,7 +837,6 @@ of the above functions. @user_data: @Returns: - <!-- Local variables: mode: sgml diff --git a/gdate.c b/gdate.c index c3018ec90..769684ec6 100644 --- a/gdate.c +++ b/gdate.c @@ -100,7 +100,7 @@ g_date_free (GDate *d) } gboolean -g_date_valid (GDate *d) +g_date_valid (const GDate *d) { g_return_val_if_fail (d != NULL, FALSE); @@ -167,8 +167,9 @@ g_date_valid_dmy (GDateDay d, * Jan 1, Year 1 */ static void -g_date_update_julian (GDate *d) +g_date_update_julian (const GDate *const_d) { + GDate *d = (GDate *) const_d; GDateYear year; gint index; @@ -201,8 +202,9 @@ g_date_update_julian (GDate *d) } static void -g_date_update_dmy (GDate *d) +g_date_update_dmy (const GDate *const_d) { + GDate *d = (GDate *) const_d; GDateYear y; GDateMonth m; GDateDay day; @@ -249,7 +251,7 @@ g_date_update_dmy (GDate *d) } GDateWeekday -g_date_get_weekday (GDate *d) +g_date_get_weekday (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_WEEKDAY); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY); @@ -264,7 +266,7 @@ g_date_get_weekday (GDate *d) } GDateMonth -g_date_get_month (GDate *d) +g_date_get_month (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_MONTH); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH); @@ -279,7 +281,7 @@ g_date_get_month (GDate *d) } GDateYear -g_date_get_year (GDate *d) +g_date_get_year (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_YEAR); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR); @@ -294,7 +296,7 @@ g_date_get_year (GDate *d) } GDateDay -g_date_get_day (GDate *d) +g_date_get_day (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_DAY); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY); @@ -309,7 +311,7 @@ g_date_get_day (GDate *d) } guint32 -g_date_get_julian (GDate *d) +g_date_get_julian (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_JULIAN); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN); @@ -324,7 +326,7 @@ g_date_get_julian (GDate *d) } guint -g_date_get_day_of_year (GDate *d) +g_date_get_day_of_year (const GDate *d) { gint index; @@ -343,7 +345,7 @@ g_date_get_day_of_year (GDate *d) } guint -g_date_get_monday_week_of_year (GDate *d) +g_date_get_monday_week_of_year (const GDate *d) { GDateWeekday wd; guint day; @@ -369,7 +371,7 @@ g_date_get_monday_week_of_year (GDate *d) } guint -g_date_get_sunday_week_of_year (GDate *d) +g_date_get_sunday_week_of_year (const GDate *d) { GDateWeekday wd; guint day; @@ -395,6 +397,19 @@ g_date_get_sunday_week_of_year (GDate *d) return ((day + wd)/7U + (wd == 0 ? 1 : 0)); } +gint +g_date_days_between (const GDate *d1, + const GDate *d2) +{ + g_return_val_if_fail (d1 != NULL, 0); + g_return_val_if_fail (d2 != NULL, 0); + + g_return_val_if_fail (g_date_valid (d1), 0); + g_return_val_if_fail (g_date_valid (d2), 0); + + return (gint)g_date_get_julian (d2) - (gint)g_date_get_julian (d1); +} + void g_date_clear (GDate *d, guint ndates) { @@ -919,7 +934,7 @@ g_date_set_julian (GDate *d, guint32 j) gboolean -g_date_is_first_of_month (GDate *d) +g_date_is_first_of_month (const GDate *d) { g_return_val_if_fail (d != NULL, FALSE); g_return_val_if_fail (g_date_valid (d), FALSE); @@ -935,7 +950,7 @@ g_date_is_first_of_month (GDate *d) } gboolean -g_date_is_last_of_month (GDate *d) +g_date_is_last_of_month (const GDate *d) { gint index; @@ -1184,8 +1199,8 @@ g_date_get_sunday_weeks_in_year (GDateYear year) } gint -g_date_compare (GDate *lhs, - GDate *rhs) +g_date_compare (const GDate *lhs, + const GDate *rhs) { g_return_val_if_fail (lhs != NULL, 0); g_return_val_if_fail (rhs != NULL, 0); @@ -1235,7 +1250,7 @@ g_date_compare (GDate *lhs, void -g_date_to_struct_tm (GDate *d, +g_date_to_struct_tm (const GDate *d, struct tm *tm) { GDateWeekday day; @@ -1273,11 +1288,48 @@ g_date_to_struct_tm (GDate *d, tm->tm_isdst = -1; /* -1 means "information not available" */ } +void +g_date_clamp (GDate *date, + const GDate *min_date, + const GDate *max_date) +{ + g_return_if_fail (date); + g_return_if_fail (g_date_valid (date)); + if (min_date != NULL) + g_return_if_fail (g_date_valid (min_date)); + if (max_date != NULL) + g_return_if_fail (g_date_valid (max_date)); + if (min_date != NULL && max_date != NULL) + g_return_if_fail (g_date_compare (min_date, max_date) <= 0); + + if (min_date && g_date_compare (date, min_date) < 0) + *date = *min_date; + + if (max_date && g_date_compare (max_date, date) < 0) + *date = *max_date; +} + +void +g_date_order (GDate *date1, + GDate *date2) +{ + g_return_if_fail (date1 != NULL); + g_return_if_fail (date2 != NULL); + g_return_if_fail (g_date_valid (date1)); + g_return_if_fail (g_date_valid (date2)); + + if (g_date_compare (date1, date2) == 1) { + GDate tmp = *date1; + *date1 = *date2; + *date2 = tmp; + } +} + gsize g_date_strftime (gchar *s, gsize slen, const gchar *format, - GDate *d) + const GDate *d) { struct tm tm; gsize retval; diff --git a/gdate.h b/gdate.h index 0ef73af50..4cbdd8c0d 100644 --- a/gdate.h +++ b/gdate.h @@ -126,7 +126,7 @@ void g_date_free (GDate *date); * dates (the exceptions are the mutators, since you need those to * return to validity). */ -gboolean g_date_valid (GDate *date); +gboolean g_date_valid (const GDate *date); gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST; gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST; gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST; @@ -136,20 +136,20 @@ gboolean g_date_valid_dmy (GDateDay day, GDateMonth month, GDateYear year) G_GNUC_CONST; -GDateWeekday g_date_get_weekday (GDate *date); -GDateMonth g_date_get_month (GDate *date); -GDateYear g_date_get_year (GDate *date); -GDateDay g_date_get_day (GDate *date); -guint32 g_date_get_julian (GDate *date); -guint g_date_get_day_of_year (GDate *date); +GDateWeekday g_date_get_weekday (const GDate *date); +GDateMonth g_date_get_month (const GDate *date); +GDateYear g_date_get_year (const GDate *date); +GDateDay g_date_get_day (const GDate *date); +guint32 g_date_get_julian (const GDate *date); +guint g_date_get_day_of_year (const GDate *date); /* First monday/sunday is the start of week 1; if we haven't reached * that day, return 0. These are not ISO weeks of the year; that * routine needs to be added. * these functions return the number of weeks, starting on the * corrsponding day */ -guint g_date_get_monday_week_of_year (GDate *date); -guint g_date_get_sunday_week_of_year (GDate *date); +guint g_date_get_monday_week_of_year (const GDate *date); +guint g_date_get_sunday_week_of_year (const GDate *date); /* If you create a static date struct you need to clear it to get it * in a sane state before use. You can clear a whole array at @@ -178,8 +178,8 @@ void g_date_set_dmy (GDate *date, GDateYear y); void g_date_set_julian (GDate *date, guint32 julian_date); -gboolean g_date_is_first_of_month (GDate *date); -gboolean g_date_is_last_of_month (GDate *date); +gboolean g_date_is_first_of_month (const GDate *date); +gboolean g_date_is_last_of_month (const GDate *date); /* To go forward by some number of weeks just go forward weeks*7 days */ void g_date_add_days (GDate *date, @@ -204,19 +204,31 @@ guint8 g_date_get_days_in_month (GDateMonth month, guint8 g_date_get_monday_weeks_in_year (GDateYear year) G_GNUC_CONST; guint8 g_date_get_sunday_weeks_in_year (GDateYear year) G_GNUC_CONST; +/* Returns the number of days between the two dates. If date2 comes + before date1, a negative value is return. */ +gint g_date_days_between (const GDate *date1, + const GDate *date2); + /* qsort-friendly (with a cast...) */ -gint g_date_compare (GDate *lhs, - GDate *rhs); -void g_date_to_struct_tm (GDate *date, +gint g_date_compare (const GDate *lhs, + const GDate *rhs); +void g_date_to_struct_tm (const GDate *date, struct tm *tm); +void g_date_clamp (GDate *date, + const GDate *min_date, + const GDate *max_date); + +/* Swap date1 and date2's values if date1 > date2. */ +void g_date_order (GDate *date1, GDate *date2); + /* Just like strftime() except you can only use date-related formats. * Using a time format is undefined. */ gsize g_date_strftime (gchar *s, gsize slen, const gchar *format, - GDate *date); + const GDate *date); #ifndef G_DISABLE_DEPRECATED diff --git a/glib/gdate.c b/glib/gdate.c index c3018ec90..769684ec6 100644 --- a/glib/gdate.c +++ b/glib/gdate.c @@ -100,7 +100,7 @@ g_date_free (GDate *d) } gboolean -g_date_valid (GDate *d) +g_date_valid (const GDate *d) { g_return_val_if_fail (d != NULL, FALSE); @@ -167,8 +167,9 @@ g_date_valid_dmy (GDateDay d, * Jan 1, Year 1 */ static void -g_date_update_julian (GDate *d) +g_date_update_julian (const GDate *const_d) { + GDate *d = (GDate *) const_d; GDateYear year; gint index; @@ -201,8 +202,9 @@ g_date_update_julian (GDate *d) } static void -g_date_update_dmy (GDate *d) +g_date_update_dmy (const GDate *const_d) { + GDate *d = (GDate *) const_d; GDateYear y; GDateMonth m; GDateDay day; @@ -249,7 +251,7 @@ g_date_update_dmy (GDate *d) } GDateWeekday -g_date_get_weekday (GDate *d) +g_date_get_weekday (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_WEEKDAY); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY); @@ -264,7 +266,7 @@ g_date_get_weekday (GDate *d) } GDateMonth -g_date_get_month (GDate *d) +g_date_get_month (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_MONTH); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH); @@ -279,7 +281,7 @@ g_date_get_month (GDate *d) } GDateYear -g_date_get_year (GDate *d) +g_date_get_year (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_YEAR); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR); @@ -294,7 +296,7 @@ g_date_get_year (GDate *d) } GDateDay -g_date_get_day (GDate *d) +g_date_get_day (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_DAY); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY); @@ -309,7 +311,7 @@ g_date_get_day (GDate *d) } guint32 -g_date_get_julian (GDate *d) +g_date_get_julian (const GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_JULIAN); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN); @@ -324,7 +326,7 @@ g_date_get_julian (GDate *d) } guint -g_date_get_day_of_year (GDate *d) +g_date_get_day_of_year (const GDate *d) { gint index; @@ -343,7 +345,7 @@ g_date_get_day_of_year (GDate *d) } guint -g_date_get_monday_week_of_year (GDate *d) +g_date_get_monday_week_of_year (const GDate *d) { GDateWeekday wd; guint day; @@ -369,7 +371,7 @@ g_date_get_monday_week_of_year (GDate *d) } guint -g_date_get_sunday_week_of_year (GDate *d) +g_date_get_sunday_week_of_year (const GDate *d) { GDateWeekday wd; guint day; @@ -395,6 +397,19 @@ g_date_get_sunday_week_of_year (GDate *d) return ((day + wd)/7U + (wd == 0 ? 1 : 0)); } +gint +g_date_days_between (const GDate *d1, + const GDate *d2) +{ + g_return_val_if_fail (d1 != NULL, 0); + g_return_val_if_fail (d2 != NULL, 0); + + g_return_val_if_fail (g_date_valid (d1), 0); + g_return_val_if_fail (g_date_valid (d2), 0); + + return (gint)g_date_get_julian (d2) - (gint)g_date_get_julian (d1); +} + void g_date_clear (GDate *d, guint ndates) { @@ -919,7 +934,7 @@ g_date_set_julian (GDate *d, guint32 j) gboolean -g_date_is_first_of_month (GDate *d) +g_date_is_first_of_month (const GDate *d) { g_return_val_if_fail (d != NULL, FALSE); g_return_val_if_fail (g_date_valid (d), FALSE); @@ -935,7 +950,7 @@ g_date_is_first_of_month (GDate *d) } gboolean -g_date_is_last_of_month (GDate *d) +g_date_is_last_of_month (const GDate *d) { gint index; @@ -1184,8 +1199,8 @@ g_date_get_sunday_weeks_in_year (GDateYear year) } gint -g_date_compare (GDate *lhs, - GDate *rhs) +g_date_compare (const GDate *lhs, + const GDate *rhs) { g_return_val_if_fail (lhs != NULL, 0); g_return_val_if_fail (rhs != NULL, 0); @@ -1235,7 +1250,7 @@ g_date_compare (GDate *lhs, void -g_date_to_struct_tm (GDate *d, +g_date_to_struct_tm (const GDate *d, struct tm *tm) { GDateWeekday day; @@ -1273,11 +1288,48 @@ g_date_to_struct_tm (GDate *d, tm->tm_isdst = -1; /* -1 means "information not available" */ } +void +g_date_clamp (GDate *date, + const GDate *min_date, + const GDate *max_date) +{ + g_return_if_fail (date); + g_return_if_fail (g_date_valid (date)); + if (min_date != NULL) + g_return_if_fail (g_date_valid (min_date)); + if (max_date != NULL) + g_return_if_fail (g_date_valid (max_date)); + if (min_date != NULL && max_date != NULL) + g_return_if_fail (g_date_compare (min_date, max_date) <= 0); + + if (min_date && g_date_compare (date, min_date) < 0) + *date = *min_date; + + if (max_date && g_date_compare (max_date, date) < 0) + *date = *max_date; +} + +void +g_date_order (GDate *date1, + GDate *date2) +{ + g_return_if_fail (date1 != NULL); + g_return_if_fail (date2 != NULL); + g_return_if_fail (g_date_valid (date1)); + g_return_if_fail (g_date_valid (date2)); + + if (g_date_compare (date1, date2) == 1) { + GDate tmp = *date1; + *date1 = *date2; + *date2 = tmp; + } +} + gsize g_date_strftime (gchar *s, gsize slen, const gchar *format, - GDate *d) + const GDate *d) { struct tm tm; gsize retval; diff --git a/glib/gdate.h b/glib/gdate.h index 0ef73af50..4cbdd8c0d 100644 --- a/glib/gdate.h +++ b/glib/gdate.h @@ -126,7 +126,7 @@ void g_date_free (GDate *date); * dates (the exceptions are the mutators, since you need those to * return to validity). */ -gboolean g_date_valid (GDate *date); +gboolean g_date_valid (const GDate *date); gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST; gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST; gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST; @@ -136,20 +136,20 @@ gboolean g_date_valid_dmy (GDateDay day, GDateMonth month, GDateYear year) G_GNUC_CONST; -GDateWeekday g_date_get_weekday (GDate *date); -GDateMonth g_date_get_month (GDate *date); -GDateYear g_date_get_year (GDate *date); -GDateDay g_date_get_day (GDate *date); -guint32 g_date_get_julian (GDate *date); -guint g_date_get_day_of_year (GDate *date); +GDateWeekday g_date_get_weekday (const GDate *date); +GDateMonth g_date_get_month (const GDate *date); +GDateYear g_date_get_year (const GDate *date); +GDateDay g_date_get_day (const GDate *date); +guint32 g_date_get_julian (const GDate *date); +guint g_date_get_day_of_year (const GDate *date); /* First monday/sunday is the start of week 1; if we haven't reached * that day, return 0. These are not ISO weeks of the year; that * routine needs to be added. * these functions return the number of weeks, starting on the * corrsponding day */ -guint g_date_get_monday_week_of_year (GDate *date); -guint g_date_get_sunday_week_of_year (GDate *date); +guint g_date_get_monday_week_of_year (const GDate *date); +guint g_date_get_sunday_week_of_year (const GDate *date); /* If you create a static date struct you need to clear it to get it * in a sane state before use. You can clear a whole array at @@ -178,8 +178,8 @@ void g_date_set_dmy (GDate *date, GDateYear y); void g_date_set_julian (GDate *date, guint32 julian_date); -gboolean g_date_is_first_of_month (GDate *date); -gboolean g_date_is_last_of_month (GDate *date); +gboolean g_date_is_first_of_month (const GDate *date); +gboolean g_date_is_last_of_month (const GDate *date); /* To go forward by some number of weeks just go forward weeks*7 days */ void g_date_add_days (GDate *date, @@ -204,19 +204,31 @@ guint8 g_date_get_days_in_month (GDateMonth month, guint8 g_date_get_monday_weeks_in_year (GDateYear year) G_GNUC_CONST; guint8 g_date_get_sunday_weeks_in_year (GDateYear year) G_GNUC_CONST; +/* Returns the number of days between the two dates. If date2 comes + before date1, a negative value is return. */ +gint g_date_days_between (const GDate *date1, + const GDate *date2); + /* qsort-friendly (with a cast...) */ -gint g_date_compare (GDate *lhs, - GDate *rhs); -void g_date_to_struct_tm (GDate *date, +gint g_date_compare (const GDate *lhs, + const GDate *rhs); +void g_date_to_struct_tm (const GDate *date, struct tm *tm); +void g_date_clamp (GDate *date, + const GDate *min_date, + const GDate *max_date); + +/* Swap date1 and date2's values if date1 > date2. */ +void g_date_order (GDate *date1, GDate *date2); + /* Just like strftime() except you can only use date-related formats. * Using a time format is undefined. */ gsize g_date_strftime (gchar *s, gsize slen, const gchar *format, - GDate *date); + const GDate *date); #ifndef G_DISABLE_DEPRECATED