diff options
| author | El-BG-1970 <elouan.gros.fr@gmail.com> | 2022-03-16 22:00:03 +0100 |
|---|---|---|
| committer | El-BG-1970 <elouan.gros.fr@gmail.com> | 2022-03-16 22:00:03 +0100 |
| commit | 2fd7e3647e70e6a925993c59d8c1751a904ae39a (patch) | |
| tree | 9d3c469c08fe60139d4ad82d3762f690b43478ed | |
| parent | a37ece490f4cf269a58afdadf6e51f62d8529a41 (diff) | |
| download | org-to-conky-2fd7e3647e70e6a925993c59d8c1751a904ae39a.tar.gz | |
added "THIS WEEK" directive
| -rw-r--r-- | agenda_entry.c | 4 | ||||
| -rw-r--r-- | date.c | 89 | ||||
| -rw-r--r-- | date.h | 9 | ||||
| -rw-r--r-- | main.c | 9 |
4 files changed, 88 insertions, 23 deletions
diff --git a/agenda_entry.c b/agenda_entry.c index 985a8c0..8a68353 100644 --- a/agenda_entry.c +++ b/agenda_entry.c @@ -50,10 +50,10 @@ entry read_agenda_entry(char *agenda) { lookahead = strstr(lookahead, "<"); char *date = (char *)malloc(tmp - lookahead + 1); strncpy(date, lookahead+1, tmp - lookahead - 1); - agenda_entry.date = extract_date(date); + agenda_entry.date = extract_date_from_string(date); free(date); } else { - agenda_entry.date = (Date){ 0, 0, 0 }; + agenda_entry.date = (Date){ 0, 0, 0, 0 }; } return agenda_entry; @@ -4,34 +4,68 @@ enum month {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC} month; enum weekday {SUN=0, MON, TUE, WED, THU, FRI, SAT} weekday; -Date extract_date(char *str) { +int get_weekday_from_string(char *str) { + if (!strcmp(str, "Mon")) return MON; + else if (!strcmp(str, "Tue")) return TUE; + else if (!strcmp(str, "Wed")) return WED; + else if (!strcmp(str, "Thu")) return THU; + else if (!strcmp(str, "Fri")) return FRI; + else if (!strcmp(str, "Sat")) return SAT; + else return SUN; +} + +char *weekday_to_string(int weekday) { + switch (weekday) { + case SUN: return "Sun"; + case MON: return "Mon"; + case TUE: return "Tue"; + case WED: return "Wed"; + case THU: return "Thu"; + case FRI: return "Fri"; + case SAT: return "Sat"; + default: return ""; + } +} + +Date extract_date(struct tm *localtm) { + Date ret; + ret.year = 1900 + localtm->tm_year; + ret.month = 1 + localtm->tm_mon; + ret.day = localtm->tm_mday; + ret.weekday = localtm->tm_wday; + return ret; +} + +Date extract_date_from_string(char *str) { Date ret; sscanf(str, "%d-%d-%d", &ret.year, &ret.month, &ret.day); + ret.weekday = get_weekday_from_string(&str[11]); return ret; } Date adjust_date(Date date) { if (date.month == FEB && date.day > 28) { if (date.year % 4 == 0 && date.day > 29) { - date.day -= 29; date.month++; + date.day -= 29; date.month++; date.weekday += 29; } else { - date.day -= 28; date.month++; + date.day -= 28; date.month++; date.weekday += 29; } } else if (date.month == JAN || date.month == MAR || date.month == MAY || date.month == JUL || date.month == AUG || date.month == OCT || date.month == DEC) { if (date.day > 31 && date.month == DEC) { - date.day -= 31; date.month = 1; + date.day -= 31; date.month = 1; date.weekday += 31; } else if (date.day > 31) { - date.day -= 31; date.month++; + date.day -= 31; date.month++; date.weekday += 31; } } else if (date.month == APR || date.month == JUN || date.month == SEP || date.month == NOV) { if (date.day > 30) { - date.day -= 30; date.month++; + date.day -= 30; date.month++; date.weekday += 30; } } + date.weekday = date.weekday % 7; return date; } @@ -64,37 +98,58 @@ bool zero(Date a) { } void print_date(Date date) { - printf("%i/%i/%i\n", date.month, date.day, date.year); + char *wd = weekday_to_string(date.weekday); + printf("%s %i/%i/%i\n", + wd, + date.month, date.day, date.year); } char *print_date_to_string(Date date) { char *ret = (char *)calloc(16, 1); - sprintf(ret, "%i/%i/%i", date.month, date.day, date.year); + char *wd = weekday_to_string(date.weekday); + sprintf(ret, "%s %i/%i/%i", + wd, + date.month, date.day, date.year); + return ret; +} + +char *short_date_to_string(Date date) { + char *ret = (char *)calloc(16, 1); + sprintf(ret, "%i/%i/%i", + date.month, date.day, date.year); return ret; } Date today() { - FILE *pipe = popen("date \"+%Y-%m-%d\"", "r"); - char *td = (char *)malloc(12); - td = fgets(td, 12, pipe); - Date ret = extract_date(td); + Date ret; + time_t tm; + struct tm localtm; + struct tm *ltm = &localtm; + + time(&tm); + ltm = localtime(&tm); - pclose(pipe); - free(td); + ret = extract_date(ltm); return ret; } Date tomorrow(Date td) { - Date tm = { td.day+1, td.month, td.year }; + Date tm = { td.day+1, td.month, td.year, td.weekday+1 }; return adjust_date(tm); } Date nextweek(Date td) { - Date nw = { td.day+7, td.month, td.year }; + Date nw = { td.day+7, td.month, td.year, td.weekday }; return adjust_date(nw); } Date nextmonth(Date td) { - Date nm = { td.day, td.month+1, td.year }; + Date nm = { td.day, td.month+1, td.year, td.weekday }; return adjust_date(nm); } + +Date nextmonday(Date td) { + if (td.weekday == MON) return nextweek(td); + else if (td.weekday == SUN) return adjust_date((Date){ td.day+1, td.month, td.year, MON }); + else return adjust_date((Date){ td.day+(td.weekday-MON)+1, td.month, td.year, MON }); +} @@ -12,8 +12,13 @@ typedef struct Date { int weekday; } Date; -Date extract_date(char *str); +int get_weekday_from_string(char *str); +char *weekday_to_string(int weekday); + +Date extract_date(struct tm *localtm); +Date extract_date_from_string(char *str); Date adjust_date(Date date); + bool smaller(Date a, Date b); bool strictly_smaller(Date a, Date b); bool eql(Date a, Date b); @@ -21,11 +26,13 @@ bool zero(Date a); void print_date(Date date); char *print_date_to_string(Date date); +char *short_date_to_string(Date date); Date today(); Date tomorrow(Date td); Date nextweek(Date td); Date nextmonth(Date td); +Date nextmonday(Date td); #define __DATE_H__ #endif @@ -78,20 +78,23 @@ int main(int argc, char **argv) { // format nicely char *e; Date td = today(); - Date tm = tomorrow(td); + Date tm = tomorrow(td); + Date nm = nextmonday(td); Date end = nextmonth(td); - Date last_date = (struct Date){ -1, -1, -1 }; + Date last_date = (struct Date){ -1, -1, -1, -1}; for (int i = 0; i < idx; i++) { if (!eql(agenda[i].date, last_date)) { last_date = agenda[i].date; if (!zero(last_date)) { - e = print_date_to_string(last_date); + e = short_date_to_string(last_date); if (strictly_smaller(last_date, td)) printf("\n%s [OUTATIME]:\n", e); else if (eql(last_date, td)) printf("\n%s [TODAY]:\n", e); else if (eql(last_date, tm)) printf("\n%s [TOMORROW]:\n", e); + else if (strictly_smaller(last_date, nm)) + printf("\n%s [THIS WEEK]:\n", e); else if (smaller(last_date, end)) printf("\n%s:\n", e); free(e); |
