From 83fa4ab93721a40554693d2d5798e885a1737499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 20 Apr 2020 02:17:06 +0200 Subject: Add parser for plaintext zoneinfo files. --- module/datetime/zic.scm | 375 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 375 insertions(+) create mode 100644 module/datetime/zic.scm diff --git a/module/datetime/zic.scm b/module/datetime/zic.scm new file mode 100644 index 00000000..e5ba8792 --- /dev/null +++ b/module/datetime/zic.scm @@ -0,0 +1,375 @@ +;;; Commentary: +;; Zoneinfo Compiler. +;; +;; Compiles plain-text zoneinfo files to guile data. +;; Replaces zic(8), since I need the "raw" recurrence rules. +;; +;; For a source of data see: +;; https://data.iana.org/time-zones/tz-link.html or +;; https://github.com/eggert/tz. +;;; Code: +(define-module (datetime zic) + :use-module (util) + :use-module (util exceptions) + :use-module (datetime) + :use-module (ice-9 rdelim) + :use-module (srfi srfi-1) + :use-module (srfi srfi-9) + :use-module (srfi srfi-9 gnu)) + + +(define-public (read-zoneinfo . ports-or-filenames) + (parsed-zic->zoneinfo + (concatenate (map (lambda (port-or-filename) + (if (port? port-or-filename) + (parse-zic-file port-or-filename) + (call-with-input-file port-or-filename parse-zic-file)))) + ports-or-filenames))) + + + +(define-immutable-record-type ; EXPORTED + (make-timespec time sign type) + timespec? + (time timespec-time) ;