diff --git a/Makefile b/Makefile index fcd4ad3..d7ce1fe 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,8 @@ BBSTOOL-DEPS=bbstool.scm testing.import.scm listing.import.scm \ command-line.import.scm members-base.import.scm \ utils.import.scm primes.import.scm member-record.import.scm \ configuration.import.scm progress.import.scm table.import.scm \ - cards.import.scm + cards.import.scm member2-record.import.scm \ + member2-parser.import.scm BBSTOOL-SOURCES=bbstool.scm testing.scm listing.scm dictionary.scm \ month.scm period.scm ansi.scm member-file.scm \ @@ -197,3 +198,16 @@ CARDS-SOURCES=cards.scm dictionary.import.scm members-base.import.scm \ cards.so: cards.o cards.o: cards.import.scm cards.import.scm: $(CARDS-SOURCES) + +MEMBER2-RECORD-SOURCES=member2-record.scm dictionary.import.scm \ + testing.import.scm + +member2-record.so: member2-record.o +member2-record.o: member2-record.import.scm +member2-record.import.scm: $(MEMBER2-RECORD-SOURCES) + +MEMBER2-PARSER-SOURCES=member2-parser.scm member2-record.import.scm + +member2-parser.so: member2-parser.o +member2-parser.o: member2-parser.import.scm +member2-parser.import.scm: $(MEMBER2-PARSER-SOURCES) diff --git a/member2-parser.scm b/member2-parser.scm new file mode 100644 index 0000000..1fbf066 --- /dev/null +++ b/member2-parser.scm @@ -0,0 +1,56 @@ +;; +;; member2-parser.scm +;; +;; Member file parsing. +;; +;; ISC License +;; +;; Copyright 2023 Brmlab, z.s. +;; Dominik Pantůček +;; +;; Permission to use, copy, modify, and/or distribute this software +;; for any purpose with or without fee is hereby granted, provided +;; that the above copyright notice and this permission notice appear +;; in all copies. +;; +;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +;; + +(declare (unit member2-parser)) + +(module + member2-parser + ( + parse-member-file + member-parser-tests! + ) + + (import scheme + (chicken io) + member2-record) + + ;; Loads member file source. Performs passes 0 and 1 on each line + ;; returning parsed source. Parsed source is a list of lists + ;; containing '(key value line-number) information. Leading and + ;; trailing whitespace is trimmed for both keys and values. + (define (parse-member-file mr) + (let* ((mrif (member-record-input-file mr)) + (source (read-lines mrif))) + (member-record-set mr + #:source source))) + + (define (member-parser-tests!) + #f) + + ) + +(import member2-parser) + +(member-parser-tests!) diff --git a/member2-record.scm b/member2-record.scm index 1b89d09..38e57de 100644 --- a/member2-record.scm +++ b/member2-record.scm @@ -30,6 +30,8 @@ member2-record ( make-member-record + member-record-input-file + member-record-set member-record-tests! ) @@ -58,6 +60,26 @@ (cadr args)) pairs))))))) + ;; Returns opened input file for this record (used by parser). + (define (member-record-input-file mr) + (open-input-file + (dict-ref mr 'file-path))) + + ;; Sets pairs of keys/values for given member record. + (define (member-record-set mr . args) + (let loop ((args args) + (mr mr)) + (if (null? args) + mr + (if (not (keyword? (car args))) + (error 'member-record-set "Needs argument keyword" (car args)) + (if (null? (cdr args)) + (error 'member-record-set "Argument needs value" (car args)) + (loop (cddr args) + (dict-set mr (string->symbol (keyword->string (car args))) + (cadr args)))))))) + + ;; Self-tests (define (member-record-tests!) (run-tests member-record