diff --git a/doc/d-utils.md b/doc/d-utils.md index ec2be2e..8f7c09c 100644 --- a/doc/d-utils.md +++ b/doc/d-utils.md @@ -34,3 +34,20 @@ Converts given seconds to ISO date string YYYY-MM-DD. Defaults to ```(current-se (today/iso) Returns today as ISO date string YYYY-MM-DD. + +## util-csv [module] + + (import util-csv) + +This module provides a very simple, incomplete and incorrect but fast +CSV loader. + +### (make-csv-line-parser separator string-delimiter) [procedure] + + ((make-csv-line-parser separator string-delimiter) line) + +Curried version of fast CSV line parser with given separator and string delimiter. + +* ```separator``` - separator character +* ```string-delimiger``` - string quotation character +* ```line``` - line to parse diff --git a/src/Makefile b/src/Makefile index 4e79587..bcadd01 100644 --- a/src/Makefile +++ b/src/Makefile @@ -56,12 +56,13 @@ HACKERBASE-OBJS=hackerbase.o testing.o listing.o cal-month.o \ sgr-list.o sgr-block.o table-processor.o table-border.o \ table-style.o sgr-state.o util-utf8.o sgr-cell.o \ template-list-expander.o box-drawing.o util-list.o \ - export-web-static.o util-dir.o racket-kwargs.o dokuwiki.o + export-web-static.o util-dir.o dokuwiki.o GENDOC-SOURCES=gendoc.scm duck-extract.import.scm \ - util-time.import.scm + util-time.import.scm util-csv.import.scm -GENDOC-OBJS=gendoc.o duck-extract.o util-time.o +GENDOC-OBJS=gendoc.o duck-extract.o util-time.o util-csv.o util-io.o \ + progress.o testing.o .PHONY: imports imports: $(HACKERBASE-DEPS) @@ -222,8 +223,8 @@ MBASE-DIR-SOURCES=mbase-dir.scm testing.import.scm \ mbase-dir.o: mbase-dir.import.scm mbase-dir.import.scm: $(MBASE-DIR-SOURCES) -UTIL-CSV-SOURCES=util-csv.scm testing.import.scm \ - progress.import.scm util-io.import.scm +UTIL-CSV-SOURCES=util-csv.scm testing.import.scm progress.import.scm \ + util-io.import.scm duck.import.scm racket-kwargs.import.scm util-csv.o: util-csv.import.scm util-csv.import.scm: $(UTIL-CSV-SOURCES) diff --git a/src/duck.scm b/src/duck.scm index 19b5971..4f6c6eb 100644 --- a/src/duck.scm +++ b/src/duck.scm @@ -40,10 +40,20 @@ (define var val)) ((_ (define/doc var doc val)) (define var val)) + ((_ (define/doc var doc arg (make-parameter val))) (define var val)) + + ((_ (define* var val)) + (define* var val)) + ((_ (define*/doc var doc val)) + (define* var val)) + ((_ (define (proc . args) expr ...)) (define (proc . args) expr ...)) + ((_ (define/doc (proc . args) doc expr ...)) + (define (proc . args) expr ...)) + ((_ expr) expr))) diff --git a/src/gendoc.scm b/src/gendoc.scm index ab44b53..2213f67 100644 --- a/src/gendoc.scm +++ b/src/gendoc.scm @@ -20,4 +20,5 @@ (gen-duck "doc/d-utils.md" "Utility modules" "These are various utility modules for other HackerBase libraries." - util-time) + util-time + util-csv) diff --git a/src/racket-kwargs.scm b/src/racket-kwargs.scm index 36e3ef4..59ac24e 100644 --- a/src/racket-kwargs.scm +++ b/src/racket-kwargs.scm @@ -26,8 +26,6 @@ ;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;; -(declare (unit racket-kwargs)) - (module racket-kwargs ( diff --git a/src/util-csv.scm b/src/util-csv.scm index 8a63036..67dc84f 100644 --- a/src/util-csv.scm +++ b/src/util-csv.scm @@ -25,8 +25,12 @@ (declare (unit util-csv)) -(module +(import duck) + +(module* util-csv + #:doc ("This module provides a very simple, incomplete and incorrect but fast +CSV loader.") ( make-csv-line-parser csv-parse @@ -41,11 +45,17 @@ (chicken condition) testing progress - util-io) + util-io + racket-kwargs) - ;; Curry version of line parser with configurable cell separator and + ;; Curry version of line parser with configurable cell separator and ;; string delimiter. Returns a list of lists of strings. - (define ((make-csv-line-parser separator string-delimiter) line) + (define/doc ((make-csv-line-parser separator string-delimiter) line) + ("Curried version of fast CSV line parser with given separator and string delimiter. + +* ```separator``` - separator character +* ```string-delimiger``` - string quotation character +* ```line``` - line to parse") (let loop ((tokens (string->list line)) (res '()) (state 1)) @@ -86,10 +96,10 @@ (cons (cons token (car res)) (cdr res)) 2)))))))) ; Continue inside quoted data ;; Parses given CSV lines list - (define (csv-parse-lines lines . args) - (let* ((separator (get-keyword #:separator args (lambda () #\;))) - (string-delimiter (get-keyword #:string-delimiter args (lambda () #\"))) - (csv-parse-line (make-csv-line-parser separator string-delimiter)) + (define* (csv-parse-lines lines + #:separator (separator #\;) + #:string-delimiter (string-delimiter #\")) + (let* ((csv-parse-line (make-csv-line-parser separator string-delimiter)) (total (max (sub1 (length lines)) 1))) (let loop ((lines lines) (idx 0)