From 04a1a4cf0a469393f38c71ebe91ad02fceb855cf Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Mon, 15 Aug 2022 21:04:20 -0400 Subject: Load dates from ~/.config/when/dates --- bin/man1/when.1 | 14 ++++++++++++++ bin/when.y | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/bin/man1/when.1 b/bin/man1/when.1 index 205b2d81..64f51cae 100644 --- a/bin/man1/when.1 +++ b/bin/man1/when.1 @@ -68,6 +68,14 @@ A number of months. A number of years. .El . +.Sh FILES +The file +.Pa $XDG_CONFIG_HOME/when/dates +or +.Pa ~/.config/when/dates +is read before any other expressions, +if it exists. +. .Sh EXAMPLES .Bl -tag -width "Dec 25 - ." .It Ic Dec 25 - \&. @@ -77,3 +85,9 @@ The date next Friday. .It Ic \&. + 2w Your last day at work. .El +.Pp +Checking a milestone: +.Bd -literal -offset indent +$ echo 'hrt = oct 15 2021' >> ~/.config/when/dates +$ when -hrt +.Ed diff --git a/bin/when.y b/bin/when.y index 83b9efdc..69ccc343 100644 --- a/bin/when.y +++ b/bin/when.y @@ -18,6 +18,9 @@ #include #include +#include +#include +#include #include #include #include @@ -162,7 +165,10 @@ static void setDate(const char *name, struct tm date) { dates.len++; } +static bool silent; + static void printDate(struct tm date) { + if (silent) return; printf( "%.3s %.3s %d %d\n", Days[date.tm_wday], Months[date.tm_mon], @@ -171,6 +177,7 @@ static void printDate(struct tm date) { } static void printScalar(struct tm scalar) { + if (silent) return; if (scalar.tm_year) printf("%dy ", scalar.tm_year); if (scalar.tm_mon) printf("%dm ", scalar.tm_mon); if (scalar.tm_mday % 7) { @@ -287,6 +294,30 @@ static int yylex(void) { } int main(int argc, char *argv[]) { + size_t cap = 0; + char *line = NULL; + + char path[PATH_MAX]; + const char *configHome = getenv("XDG_CONFIG_HOME"); + if (configHome) { + snprintf(path, sizeof(path), "%s/when/dates", configHome); + } else { + snprintf(path, sizeof(path), "%s/.config/when/dates", getenv("HOME")); + } + + FILE *file = fopen(path, "r"); + if (file) { + silent = true; + while (0 < getline(&line, &cap, file)) { + input = line; + yyparse(); + } + fclose(file); + silent = false; + } else if (errno != ENOENT) { + err(EX_CONFIG, "%s", path); + } + if (argc > 1) { input = argv[1]; return yyparse(); @@ -296,8 +327,6 @@ int main(int argc, char *argv[]) { printDate(date); printf("\n"); - char *line = NULL; - size_t cap = 0; while (0 < getline(&line, &cap, stdin)) { if (line[0] == '\n') continue; -- cgit 1.4.1