summaryrefslogtreecommitdiff
path: root/calendar.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2022-04-16 19:41:43 -0400
committerJakob Kaivo <jkk@ung.org>2022-04-16 19:41:43 -0400
commit3cc0a29ea9cce20d2b0dcdf717ca1d8df9f26e88 (patch)
tree8a2e187fa400fa043f56325933f989d7293bbf6e /calendar.c
initial implemntation
Diffstat (limited to 'calendar.c')
-rw-r--r--calendar.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/calendar.c b/calendar.c
new file mode 100644
index 0000000..ca8d069
--- /dev/null
+++ b/calendar.c
@@ -0,0 +1,101 @@
+/*
+ * UNG's Not GNU
+ *
+ * Copyright (c) 2022, Jakob Kaivo <jkk@ung.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#define _POSIX_C_SOURCE 200809L
+#include <locale.h>
+#include <regex.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[])
+{
+ setlocale(LC_ALL, "");
+
+ int c;
+ while ((c = getopt(argc, argv, "")) != -1) {
+ switch (c) {
+ /* portable applications should not use operands */
+ default:
+ return 1;
+ }
+ }
+
+ FILE *f = fopen("calendar", "r");
+ if (f == NULL) {
+ perror("calendar: couldn't open calendar file");
+ return 1;
+ }
+
+ regex_t re[12] = { { 0 } };
+ time_t now = time(NULL);
+ struct tm *tm = localtime(&now);
+ size_t nregs = 6; /* 3 for today, 3 for tomorrow */
+ switch (tm->tm_wday) {
+ case 5: /* Friday, extend another day */
+ nregs += 3;
+ /* FALLTHRU */
+ case 6: /* Saturday, extend one day */
+ nregs += 3;
+ /* FALLTHRU */
+ default:
+ break;
+ }
+
+ const long SECONDS_PER_DAY = 60 * 60 * 24;
+ const int REFLAGS = REG_ICASE | REG_NOSUB | REG_EXTENDED;
+ for (size_t i = 0; i < nregs; i += 3) {
+ char buf[64];
+ strftime(buf, sizeof(buf), "%b.? +%e", tm);
+ if (regcomp(re + i, buf, REFLAGS) != 0) {
+ perror(buf);
+ return 1;
+ }
+
+ strftime(buf, sizeof(buf), "%B %e", tm);
+ if (regcomp(re + i + 1, buf, REFLAGS) != 0) {
+ perror(buf);
+ return 1;
+ }
+
+ strftime(buf, sizeof(buf), "%m/%d", tm);
+ if (regcomp(re + i + 2, buf, REFLAGS) != 0) {
+ perror(buf);
+ return 1;
+ }
+
+ now += SECONDS_PER_DAY;
+ tm = localtime(&now);
+ }
+
+ char line[1024];
+ while (fgets(line, sizeof(line), f) != NULL) {
+ for (size_t i = 0; i < nregs; i++) {
+ if (regexec(re + i, line, 0, NULL, 0) == 0) {
+ fputs(line, stdout);
+ continue;
+ }
+ }
+ }
+}