+/* Date functions */
+date_t get_date(stamp_t stamp)
+{
+ time_t t = stamp ? stamp : time(NULL);
+ struct tm *tm = localtime(&t);
+ date_t date = {
+ .year = tm->tm_year+1900,
+ .month = tm->tm_mon,
+ .day = tm->tm_mday-1,
+ .hour = tm->tm_hour,
+ .min = tm->tm_min,
+ .sec = tm->tm_sec,
+ };
+ return date;
+}
+
+stamp_t get_stamp(date_t date)
+{
+ struct tm tm = {
+ .tm_year = date.year-1900,
+ .tm_mon = date.month,
+ .tm_mday = date.day+1,
+ .tm_hour = date.hour,
+ .tm_min = date.min,
+ .tm_sec = date.sec,
+ };
+ time_t t = mktime(&tm);
+ return (stamp_t)t;
+}
+
+int get_mins(date_t *start, date_t *end)
+{
+ return (get_stamp(*end)-get_stamp(*start))/60;
+}
+
+int compare(date_t *a, date_t *b)
+{
+ int rval = a->year < b->year ? -1 : a->year > b->year ? 1 :
+ a->month < b->month ? -1 : a->month > b->month ? 1 :
+ a->day < b->day ? -1 : a->day > b->day ? 1 :
+ a->hour < b->hour ? -1 : a->hour > b->hour ? 1 :
+ a->min < b->min ? -1 : a->min > b->min ? 1 : 0;
+ return rval;
+}
+
+int same_day(date_t *a, date_t *b)
+{
+ return a->year == b->year &&
+ a->month == b->month &&
+ a->day == b->day;
+}
+
+int before(date_t *start, int year, int month, int day, int hour, int min)
+{
+ return compare(start, &(date_t){year, month, day, hour, min}) < 0;
+}
+
+int all_day(date_t *start, date_t *end)
+{
+ date_t test = *start;
+ add_days(&test.year, &test.month, &test.day, 1);
+ return compare(&test, end) <= 0;
+}
+
+int no_date(date_t *date)
+{
+ return date->year == 0;
+}
+