aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEl-BG-1970 <elouan.gros.fr@gmail.com>2022-03-16 22:00:03 +0100
committerEl-BG-1970 <elouan.gros.fr@gmail.com>2022-03-16 22:00:03 +0100
commit2fd7e3647e70e6a925993c59d8c1751a904ae39a (patch)
tree9d3c469c08fe60139d4ad82d3762f690b43478ed
parenta37ece490f4cf269a58afdadf6e51f62d8529a41 (diff)
downloadorg-to-conky-2fd7e3647e70e6a925993c59d8c1751a904ae39a.tar.gz
added "THIS WEEK" directive
-rw-r--r--agenda_entry.c4
-rw-r--r--date.c89
-rw-r--r--date.h9
-rw-r--r--main.c9
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;
diff --git a/date.c b/date.c
index bcec28c..5bfe962 100644
--- a/date.c
+++ b/date.c
@@ -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 });
+}
diff --git a/date.h b/date.h
index 271f3cc..b692d48 100644
--- a/date.h
+++ b/date.h
@@ -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
diff --git a/main.c b/main.c
index 73127d5..64ac9b2 100644
--- a/main.c
+++ b/main.c
@@ -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);