]> Pileus Git - lackey/blobdiff - src/date.c
Fix date and ical test cases
[lackey] / src / date.c
index ec71579d359380fe9054ad2dbfba6811437b6661..4df8ce4241343cacbafe882f2b7d15ae5089724b 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Copyright (C) 2012 Andy Spencer <andy753421@gmail.com>
- * 
+ *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
@@ -23,9 +23,8 @@
 #include "date.h"
 
 /* Global data */
-year_t  YEAR;
-month_t MONTH;
-day_t   DAY;
+date_t  NOW;
+date_t  SEL;
 
 /* Initialize */
 void date_init(void)
@@ -33,9 +32,22 @@ void date_init(void)
        time_t     sec = time(NULL);
        struct tm *tm  = localtime(&sec);
 
-       YEAR  = tm->tm_year+1900;
-       MONTH = tm->tm_mon;
-       DAY   = tm->tm_mday-1;
+       SEL.year  = tm->tm_year+1900;
+       SEL.month = tm->tm_mon;
+       SEL.day   = tm->tm_mday-1;
+}
+
+void date_sync(void)
+{
+       time_t     sec = time(NULL);
+       struct tm *tm  = localtime(&sec);
+
+       NOW.year  = tm->tm_year+1900;
+       NOW.month = tm->tm_mon;
+       NOW.day   = tm->tm_mday-1;
+       NOW.hour  = tm->tm_hour;
+       NOW.min   = tm->tm_min;
+       NOW.sec   = tm->tm_sec;
 }
 
 /* Time functions */
@@ -106,6 +118,55 @@ void add_months(year_t *year, month_t *month, int months)
        *month = total % 12;
 }
 
+stamp_t get_time(date_t *date)
+{
+       return mktime(&(struct tm){
+               .tm_year = date->year-1900,
+               .tm_mon  = date->month,
+               .tm_mday = date->day+1,
+               .tm_hour = date->hour,
+               .tm_min  = date->min});
+}
+
+int get_mins(date_t *start, date_t *end)
+{
+       return (get_time(end)-get_time(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;
+}
+
 /* Debug functions */
 const char *month_to_str(month_t month)
 {
@@ -147,7 +208,7 @@ const char *day_to_string(wday_t day)
 void date_test(void)
 {
        printf("Info\n");
-       printf("  Year Month     Start Weeks Days\n");
+       printf("  Year   Month       Start   Weeks   Days\n");
        for (int y = 2012; y <= 2012; y++)
        for (int m = JAN;  m <= DEC;  m++) {
                printf("  %-5d",  y);